在Linux / Mono上运行ServiceStack的最佳方法是什么?

时间:2012-08-30 00:32:00

标签: c# linux mono servicestack mod-fastcgi

ServiceStack website上列出,它显示ServiceStack可以在Mono上运行:

  • XSP
  • 是mod_mono
  • FASTCGI
  • 控制台

这些不同的配置是什么,哪些是Mono上的Web服务首选?

5 个答案:

答案 0 :(得分:83)

Linux更新

来自the v4.5.2 Release ServiceStack现在支持.NET Core,它提供了相对于Mono的显着性能和稳定性改进,这些改进来自共享的跨平台代码库,并且得到了Microsoft资源充足,活跃且响应迅速的支持球队。如果您当前在Mono上运行ServiceStack,我们强烈建议您升级到.NET Core,以利用其卓越的性能,稳定性和自上而下支持的技术堆栈。

Mono更新

我们建议在Linux和Mono上托管ASP .NET站点的设置是使用nginx / HyperFastCgi。我们已经发布了一个分步指南,从头开始创建一个Ubuntu虚拟机,并在mono-server-config完成部署/安装/配置/初始化脚本。

在注意到几个稳定性和性能问题后,我们不再推荐MonoFastCGI。此博客文章提供了对different ASP.NET Hosting options in Mono的性能,内存使用情况和稳定性的良好分析。


开发

XSP类似于VS.NET WebDev服务器 - 一个用C#编写的简单独立ASP.NET WebServer。这适用于开发或小型工作负载。您只需从ServiceStack ASP.NET主机的根目录运行它,该目录将在http://localhost:8080处可用。

生产

对于外部Internet服务,您通常希望将ServiceStack Web服务作为全功能Web服务器的一部分来托管。 Linux最受欢迎的两款全功能Web服务器是:

Nginx的

使用Mono FastCGINginx中托管ServiceStack ASP.NET主机。

的Apache

使用mod_monoApache HTTP Server中托管ServiceStack ASP.NET主机。

自托管

ServiceStack还支持自托管,允许您在独立的控制台应用程序(即没有Web服务器)中独立运行ServiceStack Web服务。当您不需要全功能Web服务器的服务时(例如:您只需要在Intranet上内部托管Web服务),这是一个好主意。

默认情况下,相同的ServiceStack控制台应用程序二进制文件在Windows / .NET和Mono / Linux上都按原样运行。虽然如果您愿意,您可以轻松地将您的应用程序守护到run as a Linux daemon as outlined here。 Wiki页面还包含有关将自托管Web服务配置为在Nginx或Apache反向代理后运行的说明。

因为它非常适合Heroku的并发模型as detailed in their 12 factor app自托管将是我们希望在不久的将来提供更多支持的领域。

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 &

其中托管使用​​XSP's 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/RedisAdminUI等开始的任何路由转发到FastCGI单声道服务器进程进行处理。一些示例应用程序以这种方式托管:

对于那些感兴趣的人来说,servicestack.net的完整Nginx + FastCGI配置文件是available for download

答案 1 :(得分:19)

在制作中,我们将nginx与unix文件套接字一起使用

使用与nginx,服务堆栈和单声道的套接字通信时,我们发现了一个错误/内存泄漏。这是500个并发请求,而你期望cpu和内存的峰值再也没有回来。我们没有做任何进一步的测试来发现问题所在,但是xamarin bugzilla记录的错误与我们遇到的问题类似。基本上我们尝试了以下内容,这对我们来说已经足够了。

我们使用以下命令params

切换到使用unix套接字
  

fastcgi-mono-server4 /filename=/tmp/something.socket / socket = unix   /应用= /无功/网络/

我们使用此方法遇到的问题是每次运行fastcgi-mono-server4时套接字文件的权限都会更改,因此您必须在启动fastcgi-mono-server4后更正它们!另一个缺点是在我们的盒子上它只能处理大约120个并发请求。然而,这对我们来说并不是一个真正的问题,你总能产生更多的进程。

希望这有帮助

答案 2 :(得分:6)

免责声明:我是HyperFastCgi服务器的作者,并且在ceco的回答中提到了博客文章的作者

nginx与HyperFastCgi完成这项工作。 HyperFastCgi不会像单声道fastcgi服务器一样泄漏内存并且执行速度更快,因为它使用低级单声道API在应用程序域之间传递数据,而不是跨域调用的慢速单声道JIT实现。此外,它还可以选择使用本机 libevent 库进行套接字通信,这比当前的单声道System.Net.Sockets实现快1.5-2。

HyperFastCgi的主要功能:

  • 允许使用3种不同的方式来处理套接字和跨域通信:
    • Managed Listener with Managed Transport(仅使用托管代码,异步System.Net.Sockets。由于JIT跨域调用缓慢,单声道速度慢)
    • Managed Listener with Combined Transport(使用异步System.Net.Sockets作为侦听器,使用低级单声道API进行跨域调用。快得多)
    • Native Listener(使用原生 libevent 作为套接字库和低级单声道API进行跨域调用。性能最佳)
  • 允许多种方式并行Web请求:使用ThreadPool,.NET 4.5任务或单线程。最后一个选项与Native Listener结合使得Web服务器的工作方式与NodeJS类似:所有请求都以异步方式在单个线程中处理。
  • 允许编写简单的请求处理程序而不使用System.Web。这样可以将请求的处理性能提高2-2.5倍。

答案 3 :(得分:3)

有一篇关于使用ServiceStack的Mono性能的有用且相对较新的博客文章。我认为这对于即将决定如何托管服务的人来说可能有用: Servicestack performance in Mono

正如它所说 - FastCGI Mono服务器有的内存泄漏,我可以确认。我使用Mono 3.2.8和Nginx 1.4.6以及FastCGI Mono Server 3.0.11和使用ServiceStack 3.9.71编写的服务在Ubuntu Desktop 14.04上运行ab -n 100000 -c 10 http://myurl。我不认为我正在使用哪个版本的ServiceStack,因为FastCGI Mono Server是漏洞。它占用了所有可用的内存 - 总共2GB左右的1Gb。

此外,至少与其他解决方案相比,Nginx + FastCGI Mono Server的性能糟糕。我的示例REST服务每秒大约有275个请求。该博客的作者已经审查了FastCGI Mono Server的代码,并决定编写自己的实现。出于某种原因,它至少在我的机器上无法正常工作。

我想,重点是你不应该使用FastCGI Mono Server。除非你想经常重启你的盒子。

由于这篇文章大多是否定的,我应该说我对托管服务的意图是什么。我可能会继续使用AppHost在Nginx后面继承AppHostHttpListenerLongRunningBase进行自托管。使用上面的相同示例REST服务,我每秒获得大约1100个请求。更好的消息是,该过程没有明显的泄漏,我用大约1 000 000个请求进行了测试,并且该过程消耗了&lt; 100MB RAM。

P.S。我不是博客文章的作者:)

答案 4 :(得分:2)

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
  • nancy 896
  • aspnet-jsonnet-mono 863