我想在nginx和fastcgi-mono-server下使用ServiceStack运行webservice API。
服务器启动正常,API启动并运行。 我可以通过ServiceStack探查器在浏览器中看到响应时间,它们在10ms内运行。
但是,只要我使用“围攻”(使用10个连接的只有500个请求)做一个小负载testing,我开始得到502错误的网关。 而要恢复,我必须重新启动fastcgi-mono-server。
nginx服务器很好。 fastcgi-mono-server是在这个小负载之后停止响应的那个。
我试过使用tcp和unix套接字(我知道unix套接字的权限问题,但我已经修复了这个问题)。
这是我的configuration:
server { listen 80; listen local-api.acme.com:80; server_name local-api.acme.com; location / { root /Users/admin/dev/acme/Acme.Api/; index index.html index.htm default.aspx Default.aspx; fastcgi_index Default.aspx; fastcgi_pass unix:/tmp/fastcgi.socket; include /usr/local/etc/nginx/fastcgi_params; } }
要启动fastcgi-mono-server:
sudo fastcgi-mono-server4 /applications=local-api.acme.com:/:/Users/admin/dev/acme/Acme.Api/ /socket=unix:/tmp/fastcgi.socket /multiplex=True /verbose=True /printlog=True
编辑:我忘了提及一个重要的细节:我在Mac OS X上运行这个。
我还testing了Mono:console应用程序,apache mod_mono,nginx fast_cgi和proxy_pass模块的所有可能的Web服务器configuration。 在Mono 3.2.3 + Mac OS X下的几个请求之后,都出现了同样的崩溃问题。
我能够在Linux机器上testing相同的configuration,并没有任何问题。
所以在Mac OS X上运行它似乎是一个单声道/ ASP.NET的问题。
编辑:我确实看到在原来的问题,没有问题在Linux下运行,但是,我也遇到了Linux的困难,以及“高负载”的情况下(即+50并发请求),所以这可能适用于OS X好…
我深入挖掘了一下这个问题,并且找到了一个解决方案来解决我的设置 – 当我加载测试简单的Hello World应用程序时,我不再收到502错误的网关错误。 我在Ubuntu 13.10上进行了测试,全新安装在/ opt / mono中的Mono 3.2.3。
当用“/ verbose = True / printlog = True”启动mono-fastcgi-4服务器时,您会注意到以下输出:
Root directory: /some/path/you/defined Parsed unix:/tmp/nginx-1.sockets as URI unix:/tmp/nginx-1.sockets listning on file /tmp/nginx-1.sockets with default permissions Max connections: 1024 Max requests: 1024
重要的线路是“最大连接数”和“最大请求数”。 这些基本上告诉了多少活动的TCP连接和请求mono-fastcgi服务器将能够处理 – 在这种情况下1024。
我的NGINX配置如下:
worker_processes 4; events { worker_connections 1024; }
所以我有4个工人, 每个工人可以有1024个连接 。 因此NGINX高兴地接受了4096个并发连接,然后发送给mono-fastcgi(只希望处理1024个conns)。 因此,mono-fastcgi是“保护自己”,并停止服务请求。 有两个解决方案:
1通过改变NGINX配置来读取如下内容:
worker_processes 4; # <-- or 1 here events { worker_connections 256; # <--- if 1 above, then 1024 here }
但是,这可能意味着您无法最大限度地利用计算机上的资源。
2.解决方案有点棘手。 首先,mono-fastcgi必须多次启动。 为此,我创建了以下脚本(在应该启动的网站内部):
function startFastcgi { /opt/mono/bin/fastcgi-mono-server4 /loglevels=debug /printlog=true /multiplex=false /applications=/:`pwd` /socket=$1 & } startFastcgi 'unix:/tmp/nginx-0.sockets' startFastcgi 'unix:/tmp/nginx-1.sockets' startFastcgi 'unix:/tmp/nginx-2.sockets' startFastcgi 'unix:/tmp/nginx-3.sockets' chmod 777 /tmp/nginx-*
其中启动4个mono-fastcgi工人,每个工人可以接受1024个连接。 那么NGINX应该像这样配置:
upstream servercom { server unix:/tmp/nginx-0.sockets; server unix:/tmp/nginx-1.sockets; server unix:/tmp/nginx-2.sockets; server unix:/tmp/nginx-3.sockets; } server { listen 80; location / { fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; fastcgi_pass servercom; include fastcgi_params; } }
这就为NGINX配置了4个“上游工人”,它将以循环方式使用 。 现在,当我用Boom在并发200中敲击我的服务器1分钟时,这一切都很好(也就是没有502)。
我希望你能以某种方式将这个应用到你的代码,并使东西工作:)
PS:
你可以下载我在这里测试的Hello World ServiceStack代码。
你可以在这里下载我的完整的NGINX.config。
有一些路径需要调整,但应该作为一个很好的基础。