在 Linux / Mono 上运行 ServiceStack 的最佳方法是什么?
- 2024-11-13 08:36:00
- admin 原创
- 24
问题描述:
ServiceStack 网站上列出的信息表明,ServiceStack 可以在 Mono 上运行:
超细纤维增强塑料
mod_mono
快速Cgi
安慰
这些不同的配置是什么?哪种配置更适合 Mono 上的 Web 服务?
解决方案 1:
Linux 更新
从v4.5.2 版本开始,ServiceStack 支持 .NET Core,它比 Mono 提供了显著的性能和稳定性改进,它源自共享的跨平台代码库,并由 Microsoft 资源丰富、积极响应的团队提供支持。如果您当前在 Mono 上运行 ServiceStack,我们强烈建议您升级到 .NET Core,以利用其卓越的性能、稳定性和从上到下支持的技术堆栈。
Mono 更新
我们推荐在 Linux 和 Mono 上托管 ASP .NET 站点的设置是使用 nginx/HyperFastCgi。我们已发布分步指南,介绍如何从头开始创建 Ubuntu VM,并在mono-server-config中完成部署 / 安装 / conf / 初始化脚本。
在注意到几个稳定性和性能问题后,我们不再推荐 MonoFastCGI。这篇博客文章对 Mono 中不同 ASP.NET 托管选项的性能、内存使用情况和稳定性进行了很好的分析。
发展
XSP类似于 VS.NET WebDev 服务器 - 一个用 C# 编写的简单独立 ASP.NET WebServer。它适用于开发或小型工作负载。您只需从 ServiceStack ASP.NET 主机的根目录运行它,即可在 上使用http://localhost:8080
。
生产
对于外部互联网服务,您通常希望将 ServiceStack Web 服务作为全功能 Web 服务器的一部分进行托管。Linux 上最受欢迎的 2 个全功能 Web 服务器是:
Nginx
使用Mono FastCGI在Nginx中托管 ServiceStack ASP.NET 主机。
阿帕奇
使用mod_mono在Apache HTTP Server中托管 ServiceStack ASP.NET 主机。
自托管
ServiceStack 还支持自托管,这允许您在独立控制台应用程序中自行运行 ServiceStack web 服务(即无需 web 服务器)。当您不需要全功能 web 服务器的服务时(例如:您只需要在 Intranet 上内部托管 web 服务),这是一个好主意。
默认情况下,相同的 ServiceStack Console 应用程序二进制文件可按原样在 Windows/.NET 和 Mono/Linux 上运行。但是,如果您愿意,您可以轻松地将您的应用程序守护进程化为Linux 守护进程运行,如此处所述。维基页面还包括有关配置自托管 Web 服务以在 Nginx 或 Apache 反向代理后面运行的说明。
由于它非常适合 Heroku 的并发模型(如其 12 因素应用程序自托管中所述),因此我们将在不久的将来寻求提供更多支持。
ServiceStack.net Nginx / Mono FastCGI 配置
servicestack.net 网站本身(包括所有现场演示)使用 Nginx + Mono FastCGI 在Ubuntu hetzner vServer上运行。
该命令用于启动FastCGI后台进程:
fastcgi-mono-server4 --appconfigdir /etc/rc.d/init.d/mono-fastcgi
/socket=tcp:127.0.0.1:9000 /logfile=/var/log/mono/fastcgi.log &
/etc/rc.d/init.d/mono-fastcgi
它托管使用XSP 的 WebApp 文件格式指定的文件夹中的 *.webapp 文件中定义的所有应用程序,例如:
服务栈.web应用:
<apps>
<web-application>
<name>ServiceStack.Northwind</name>
<vhost>*</vhost>
<vport>80</vport>
<vpath>/ServiceStack.Northwind</vpath>
<path>/home/mythz/src/ServiceStack.Northwind</path>
</web-application>
</apps>
这将在后台运行 FastCGI Mono 进程,您可以通过将此规则添加到 nginx.conf 来让 Nginx 连接到该进程:
location ~ /(ServiceStack|RedisAdminUI|RedisStackOverflow|RestFiles).* {
root /usr/share/nginx/mono/servicestack.net/;
index index.html index.htm index.aspx default.htm Default.htm;
fastcgi_index /default.htm;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME /usr/share/servicestack.net$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
它将把以/ServiceStack
或/RedisAdminUI
等开头的任何路由转发到 FastCGI mono 服务器进程进行处理。以下是一些以这种方式托管的示例应用程序:
有兴趣的可以下载servicestack.net 的完整 Nginx + FastCGI 配置文件。
解决方案 2:
在生产中,我们使用带有 unix 文件套接字的 nginx
我们在使用 nginx、服务堆栈和 mono 进行套接字通信时发现了一个错误/内存泄漏。当时有 500 个并发请求,虽然您预计 CPU 和内存会激增,但它再也没有下降。我们没有做任何进一步的测试来发现问题所在,但xamarin bugzilla记录了一个错误,似乎与我们遇到的问题类似。基本上我们尝试了以下方法,对我们来说已经足够了。
我们切换到使用 unix 套接字,并使用以下命令参数
fastcgi-mono-server4 /filename=/tmp/something.socket /socket=unix /applications=/var/www/
我们使用这种方法时遇到的问题是,每次运行 fastcgi-mono-server4 时,套接字文件的权限都会发生变化,因此您必须在启动 fastcgi-mono-server4 后更正它们!另一个缺点是,在我们的机器上,它只能处理大约 120 个并发请求。然而,这对我们来说并不是一个真正的问题,而且您总是可以生成更多进程。
希望这有帮助
解决方案 3:
免责声明:我是 HyperFastCgi 服务器的作者,博客文章的作者在 ceco 的回答中被提及
nginx 搭配HyperFastCgi可完成此任务。HyperFastCgi 不会像 mono fastcgi 服务器那样泄漏内存,而且执行速度更快,因为它使用低级 mono API 在应用程序域之间传递数据,而不是使用速度缓慢的 mono JIT 实现跨域调用。此外,它还可以选择使用本机libevent库进行套接字通信,这比当前的 mono System.Net.Sockets 实现大约快 1.5-2 倍。
HyperFastCgi 的主要特点:
允许使用 3 种不同的方式来处理套接字和跨域通信:
+ `Managed Listener with Managed Transport`(仅使用托管代码,异步 System.Net.Sockets。由于 JIT 跨域调用速度慢,因此在 mono 中速度较慢)
+ `Managed Listener with Combined Transport`(使用异步 System.Net.Sockets 作为监听器和低级单声道 API 进行跨域调用。速度更快)
+ `Native Listener`(使用原生*libevent*作为socket库,使用低级mono API进行跨域调用,性能最优)
允许使用多种方式并行处理 Web 请求:使用线程池、.NET 4.5 任务或单线程。最后的选项与使
Native Listener
Web 服务器的工作方式相结合NodeJS
:所有请求都以异步方式在单线程中处理。允许编写简单的请求处理程序,而根本不使用 System.Web。这将使请求的处理性能提高 2-2.5 倍。
解决方案 4:
有一篇关于使用 ServiceStack 的 Mono 性能的有用且相对较新的博客文章。我认为它对那些即将决定如何托管其服务的人可能会有用:Mono 中的 Servicestack 性能。
正如它所说 - FastCGI Mono 服务器有大量内存泄漏,这一点我可以确认。我ab -n 100000 -c 10 http://myurl
在 Ubuntu Desktop 14.04 上运行了 Mono 3.2.8 和 Nginx 1.4.6 以及 FastCGI Mono Server 3.0.11 和使用 ServiceStack 3.9.71 编写的服务。我认为我使用哪个版本的 ServiceStack 并不重要,因为 FastCGI Mono Server 是泄漏的部分。它消耗了所有可用内存 - 总共 2GB 中约 1GB。
此外,Nginx + FastCGI Mono Server 的性能很差,至少与其他解决方案相比是这样。我的示例 REST 服务每秒大约有 275 个请求。该博客的作者审查了 FastCGI Mono Server 的代码,并决定编写自己的实现。但由于某种原因,它无法正常工作,至少在我的计算机上无法正常工作。
因此,我猜重点是您不应该使用 FastCGI Mono Server。除非您想经常重新启动您的机器。
由于这篇文章大部分都是负面的,我应该说说我对托管服务的意图。我可能会选择使用继承AppHostHttpListenerLongRunningBase
自 Nginx 的 AppHost 进行自托管。使用上面相同的示例 REST 服务,我每秒收到大约 1100 个请求。更好的消息是该过程没有明显的泄漏,我用大约 1 000 000 个请求对其进行了测试,该过程消耗的 RAM 不到 100MB。
PS:我不是这篇博文的作者:)
解决方案 5:
evhttp-sharp - 带有 NancyFx 主机的 http 服务器
https://github.com/kekekeks/evhttp-sharp
非常快,比 nancy-libevent2 快近 4 倍。
http://www.techempower.com/benchmarks/#section=data-r8&hw=i7&test=json&s=2&l=2
以下是不同配置的测试结果:
每秒 JSON 响应数:
evhttp-sharp 91,557
nancy-libevent2 17,338
servicestack-nginx-d 953
南希 896
aspnet-jsonnet-mono 863
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件