在ServiceStack 网站上列出的它表明 ServiceStack 可以在 Mono 上运行,其中之一是:
- XSP
- mod_mono
- 快速Cgi
- 安慰
这些不同的配置是什么,哪些是 Mono 上的 Web 服务的首选?
在ServiceStack 网站上列出的它表明 ServiceStack 可以在 Mono 上运行,其中之一是:
这些不同的配置是什么,哪些是 Mono 上的 Web 服务的首选?
从v4.5.2 版本开始, ServiceStack 现在支持 .NET Core,与 Mono 相比,它提供了显着的性能和稳定性改进,Mono 源自共享的跨平台代码库,并得到了微软资源充足、积极响应的团队的支持。如果您当前在 Mono 上运行 ServiceStack,我们强烈建议您升级到 .NET Core,以利用其卓越的性能、稳定性和自上而下支持的技术堆栈。
我们推荐的在 Linux 和 Mono 上托管 ASP .NET 站点的设置是使用 nginx/HyperFastCgi。我们已经发布了一个分步指南,从头开始创建一个 Ubuntu 虚拟机,并在mono-server-config完成部署 / 安装 / conf / init 脚本。
在注意到几个稳定性和性能问题后,我们不再推荐 MonoFastCGI。这篇博文很好地分析了Mono 中不同 ASP.NET 托管选项的性能、内存使用和稳定性。
XSP类似于 VS.NET WebDev 服务器——一个用 C# 编写的简单的独立 ASP.NET WebServer。这适用于开发或小工作量。您只需从 ServiceStack ASP.NET 主机的根目录运行它,它就会在http://localhost:8080
.
对于外部 Internet 服务,您通常希望将 ServiceStack Web 服务托管为全功能 Web 服务器的一部分。适用于 Linux 的 2 个最受欢迎的全功能 Web 服务器是:
使用Mono FastCGI在Nginx中托管 ServiceStack ASP.NET 主机。
使用mod_mono在Apache HTTP Server中托管 ServiceStack ASP.NET 主机。
ServiceStack 还支持自托管,它允许您在独立的控制台应用程序(即没有 Web 服务器)中自行运行您的 ServiceStack Web 服务。当您不需要功能齐全的 Web 服务器的服务时,这是一个好主意(例如:您只需要在 Intranet 上内部托管 Web 服务)。
默认情况下,相同的 ServiceStack 控制台应用程序二进制文件按原样在 Windows/.NET 和 Mono/Linux 上运行。尽管如果您愿意,您可以轻松地守护您的应用程序以作为 Linux 守护程序运行,如此处所述。wiki 页面还包括配置自托管 Web 服务以在 Nginx 或 Apache 反向代理之后运行的说明。
由于它非常适合 Heroku 的并发模型,如其 12 因素应用程序自托管中所述,我们将在不久的将来寻求提供更多支持。
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 &
它托管在使用XSP 的 WebApp File Format/etc/rc.d/init.d/mono-fastcgi
指定的文件夹中的 *.webapp 文件中定义的所有应用程序,例如:
ServiceStack.webapp:
<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
or/RedisAdminUI
等开头的任何路由转发到 FastCGI 单服务器进程进行处理。以这种方式托管的一些示例应用程序:
有兴趣的人可以下载servicestack.net 的完整 Nginx + FastCGI 配置文件。
在生产中,我们使用带有 unix 文件套接字的 nginx
当使用 nginx、服务堆栈和单声道进行套接字通信时,我们发现了一个错误/内存泄漏。这是有 500 个并发请求,而您预计 CPU 和内存会出现峰值,但它再也不会下降。我们没有做任何进一步的测试来发现问题出在哪里,但是xamarin bugzilla记录了一个错误,看起来与我们遇到的问题相似。基本上我们尝试了以下方法,这对我们来说已经足够好了。
我们切换到使用具有以下命令参数的 unix 套接字
fastcgi-mono-server4 /filename=/tmp/something.socket /socket=unix /applications=/var/www/
我们使用这种方法遇到的问题是,每次运行 fastcgi-mono-server4 时,socket 文件的权限都会改变,所以在启动 fastcgi-mono-server4 后必须更正它们!另一个缺点是在我们的机器上它只能处理大约 120 个并发请求。然而,目前这对我们来说并不是一个真正的问题,你总是可以产生更多的进程。
希望这可以帮助
免责声明:我是 HyperFastCgi 服务器的作者,博客文章的作者在 ceco 的回答中被提及
带有HyperFastCgi的 nginx 可以完成这项工作。HyperFastCgi 不会像单声道 fastcgi 服务器那样泄漏内存并且执行速度更快,因为它使用低级单声道 API 在应用程序域之间传递数据,而不是跨域调用的慢单声道 JIT 实现。它还可以选择使用本地libevent库进行套接字通信,这比当前的单声道 System.Net.Sockets 实现快大约 1.5-2。
HyperFastCgi 的主要特点:
Managed Listener with Managed Transport
(仅使用托管代码,异步 System.Net.Sockets。由于 JIT 跨域调用缓慢,单声道速度较慢)Managed Listener with Combined Transport
(使用异步 System.Net.Sockets 作为侦听器和用于跨域调用的低级单声道 API。快得多)Native Listener
(使用原生libevent作为套接字库和低级单声道 API 进行跨域调用。性能最佳) Native Listener
使网络服务器的工作方式相结合NodeJS
:所有请求都以异步方式在单线程中处理。有一篇关于使用 ServiceStack 的 Mono 性能的有用且相对较新的博客文章。我认为它可能对一些即将决定如何托管他们的服务的人有用:Mono 中的 Servicestack 性能。
正如它所说 - FastCGI Mono 服务器有大量内存泄漏,我可以确认。我ab -n 100000 -c 10 http://myurl
使用 Mono 3.2.8 和 Nginx 1.4.6 和 FastCGI Mono Server 3.0.11 以及使用 ServiceStack 3.9.71 编写的服务在 Ubuntu Desktop 14.04 上运行。我认为我使用哪个版本的 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 个请求对其进行了测试,并且该进程消耗了 < 100MB RAM。
PS我不是博文的作者:)
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 responses per second: