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

2024-11-13 08:36:00
admin
原创
147
摘要:问题描述:ServiceStack 网站上列出的信息表明,ServiceStack 可以在 Mono 上运行:超细纤维增强塑料mod_mono快速Cgi安慰这些不同的配置是什么?哪种配置更适合 Mono 上的 Web 服务?解决方案 1:Linux 更新从v4.5.2 版本开始,ServiceStack 支持...

问题描述:

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 ListenerWeb 服务器的工作方式相结合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

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1120  
  IPD(Integrated Product Development,集成产品开发)流程是一种广泛应用于高科技和制造业的产品开发方法论。它通过跨职能团队的紧密协作,将产品开发周期缩短,同时提高产品质量和市场成功率。在IPD流程中,CDCP(Concept Decision Checkpoint,概念决策检查点)是一个关...
IPD培训课程   75  
  研发IPD(集成产品开发)流程作为一种系统化的产品开发方法,已经在许多行业中得到广泛应用。它不仅能够提升产品开发的效率和质量,还能够通过优化流程和资源分配,显著提高客户满意度。客户满意度是企业长期成功的关键因素之一,而IPD流程通过其独特的结构和机制,能够确保产品从概念到市场交付的每个环节都围绕客户需求展开。本文将深入...
IPD流程   66  
  IPD(Integrated Product Development,集成产品开发)流程是一种以跨职能团队协作为核心的产品开发方法,旨在通过优化资源分配、提高沟通效率以及减少返工,从而缩短项目周期并提升产品质量。随着企业对产品上市速度的要求越来越高,IPD流程的应用价值愈发凸显。通过整合产品开发过程中的各个环节,IPD...
IPD项目管理咨询   76  
  跨部门沟通是企业运营中不可或缺的一环,尤其在复杂的产品开发过程中,不同部门之间的协作效率直接影响项目的成败。集成产品开发(IPD)作为一种系统化的项目管理方法,旨在通过优化流程和增强团队协作来提升产品开发的效率和质量。然而,跨部门沟通的复杂性往往成为IPD实施中的一大挑战。部门之间的目标差异、信息不对称以及沟通渠道不畅...
IPD是什么意思   70  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用