48

在ServiceStack 网站上列出的它表明 ServiceStack 可以在 Mono 上运行,其中之一是:

  • XSP
  • mod_mono
  • 快速Cgi
  • 安慰

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

4

5 回答 5

84

Linux 更新

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 服务器是:

Nginx

使用Mono FastCGINginx中托管 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 配置

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;  
}

它将以/ServiceStackor/RedisAdminUI等​​开头的任何路由转发到 FastCGI 单服务器进程进行处理。以这种方式托管的一些示例应用程序:

有兴趣的人可以下载servicestack.net 的完整 Nginx + FastCGI 配置文件。

于 2012-08-30T00:31:59.503 回答
19

在生产中,我们使用带有 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 个并发请求。然而,目前这对我们来说并不是一个真正的问题,你总是可以产生更多的进程。

希望这可以帮助

于 2012-09-06T10:53:51.680 回答
6

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

带有HyperFastCgi的 nginx 可以完成这项工作。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使网络服务器的工作方式相结合NodeJS:所有请求都以异步方式在单线程中处理。
  • 允许在完全不使用 System.Web 的情况下编写简单的请求处理程序。这将请求的处理性能提高了 2-2.5 倍。
于 2014-09-28T04:23:49.290 回答
3

有一篇关于使用 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我不是博文的作者:)

于 2014-04-30T09:16:02.310 回答
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 responses per second:

  • evhttp-sharp 91,557
  • nancy-libevent2 17,338
  • servicestack-nginx-d 953
  • nancy 896
  • aspnet-jsonnet-mono 863
于 2014-11-11T17:17:21.960 回答