通过 nginx 和 ServiceStack 在 fastcgi-mono-server 上进行小负载测试后,网关 502 错误

2024-03-24

我正在尝试在 nginx 和 fastcgi-mono-server 下使用 ServiceStack 运行 Web 服务 API。

服务器启动正常,API 已启动并运行。我可以通过 ServiceStack Profiler 在浏览器中查看响应时间,它们的运行时间不到 10 毫秒。

但是,一旦我使用“siege”进行小型负载测试(使用 10 个连接仅发出 500 个请求),我就开始收到 502 Bad Gateway。要恢复,我必须重新启动 fastcgi-mono-server。

nginx服务器没问题。 fastcgi-mono-server 是在这一小负载之后停止响应的服务器。

我尝试过使用 tcp 和 unix 套接字(我知道 unix 套接字存在权限问题,但我已经修复了该问题)。

这是我的配置:

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 上运行它。

我还测试了 Mono 的所有可能的 Web 服务器配置:控制台应用程序、apache mod_mono、nginx fast_cgi 和 proxy_pass 模块。在 Mono 3.2.3 + Mac OS X 下,所有这些都出现了相同的问题,即在几次请求后崩溃。

我能够在 Linux 机器上测试相同的配置,并且没有任何问题。

因此,在 Mac OS X 上运行时,这似乎是 Mono/ASP.NET 问题。


编辑: 我确实在最初的问题中看到,在 Linux 下运行没有问题,但是,在“高负载”场景(即 +50 个并发请求)下,我在 Linux 上也遇到了困难,因此这也可能适用于 OS X。 ..

我更深入地研究了这个问题,找到了我的设置的解决方案 - 在负载测试我的简单 hello world 应用程序时,我不再收到 502 Bad Gateway 错误。我在 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
Listening on file /tmp/nginx-1.sockets with default permissions
Max connections: 1024
Max requests: 1024

重要的几行是“最大连接数”和“最大请求数”。这些基本上告诉了 mono-fastcgi 服务器将能够处理多少个活动 TCP 连接和请求 - 在本例中为 1024。

我的 NGINX 配置如下:

worker_processes 4;
events {
    worker_connections  1024;
}

所以我有4个工人,每个可以有 1024 个连接。因此,NGINX 愉快地接受 4096 个并发连接,然后将其发送到 mono-fastcgi(它只希望处理 1024 个 conns)。因此,mono-fastcgi 正在“自我保护”并停止服务请求。对此有两种解决方案:

  1. 降低 NGINX 可以接受的请求量
  2. 增加你的 fastcgi 上游池

通过将 NGINX 配置更改为如下所示,可以轻松解决问题 1:

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 个“上游工作人员”组成的池,它将在循环赛时尚 http://nginx.org/en/docs/http/ngx_http_upstream_module.html。现在,当我用以下命令敲击我的服务器时Boom https://github.com/tarekziade/boom并发 200 持续 1 分钟,一切都很好(又名根本没有 502)。

我希望您能以某种方式将其应用到您的代码中并使其正常工作:)

P.S:

你可以下载我用来测试的Hello World ServiceStack代码here https://github.com/nover/service-stack-fastcgi-heroku.

你可以下载我的完整 NGINX.confighere http://ge.tt/5xxs8Ry/v/0%20here.

虽然有一些路径需要调整,但它应该作为一个良好的基础。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 nginx 和 ServiceStack 在 fastcgi-mono-server 上进行小负载测试后,网关 502 错误 的相关文章

随机推荐

  • Web 方法可以重载吗?

    我已经构建了一个常规的 NET asmx 服务 如何重载此服务中的 Web 方法 WS I Web 服务互操作性 不支持重载
  • window[] 和 eval() 之间的区别 - Javascript

    我一直在 javascript 中使用这两种方法 真的不知道有什么区别 谷歌搜索总是显示 窗口对象 或 在 javascript 中打开一个新窗口 的结果 因此找不到任何内容 eval v e window v e 有时 window 对我
  • 有关 .net Framework 4.7 中 ECDiffieHellmanCng 实现的秘密协议的问题吗?

    我有以下代码 var curve ECCurve NamedCurves nistP256 var ecdhSender ECDiffieHellman Create curve var ecdhReceiver ECDiffieHellm
  • 启用/禁用 Microsoft 虚拟 WiFi 微型端口

    我禁用了我的Microsoft Virtual WiFi Miniport网络适 配器来自Control Panel Network and Internet Network Connections 只需右键单击微型端口网卡并单击 禁用 它
  • 了解隐式声明的默认构造函数

    我试图了解编译器的默认构造函数是如何工作的 我做了这个例子 include
  • iOS/Android跨平台开发[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我已经尝试用 Java 开发 Android 应用程序有一段时间了 并且开始掌握它 然而 如果我想开始使用 iOS 版本 我需要从头开始编
  • 如何理解clojure的lazy-seq

    我正在尝试理解 Clojurelazy seq运算符 以及惰性求值的一般概念 我知道这个概念背后的基本思想 表达式的求值被延迟 直到需要该值为止 一般来说 这可以通过两种方式实现 在编译时使用宏或特殊形式 在运行时使用 lambda 函数
  • 从 Com Interop Assembly 中查找 COM DLL 路径

    我正在尝试围绕旧版 COM 对象编写一个包装器 并将该包装器安装到 GAC 中 目标是自动设置组件所需的特定配置信息 并为我的所有应用程序使用一个通用的强类型接口 到目前为止 我的解决方案是将 XML 配置文件保留在与原始 COM DLL
  • 计算差异考虑到我们有两个不同的时间和日期字符串,两次之间

    我将时间数据分为两个字符串 一个字符串表示日期 另一个字符串表示时间 我想计算差异 在Java中这样的两次 e g 时间 1 26 02 2011 和 11 00 AM 时间 2 27 02 2011 和 12 15 AM 相差大约 13
  • Java:从字符串中删除数值

    在该社区的帮助下 我成功地从用户输入中删除了数字值 但是 下面的代码将仅检索已删除的数字之前的字母字符 import java util Scanner public class Assignment2 A public static vo
  • Android:更改默认家庭应用程序

    对于某些特定要求 我需要更改 Android 默认主页应用程序 使用我的自定义主页应用程序 我的应用程序内的一个设置 将切换默认主页 我的应用程序或以前的主页 我不希望用户进行非常复杂的 Android 设置 任何人都可以帮我解决一下它在哪
  • 在哪里可以初始化模块范围的变量?

    我正在尝试做这样的事情 angular module MyModule ui config function rootScope rootScope Gender M Male F Female U Unknown 但我收到这个错误 未捕获
  • Bash 中的 [ 和 [[ 有什么区别? [复制]

    这个问题在这里已经有答案了 我查看了 bash 手册页和 说它使用条件表达式 然后我查看了条件表达式部分 它列出了与test and 所以我想知道 有什么区别 and 在巴什 bash 的改进是 命令 它具有多项增强功能 如果您编写针对 b
  • 使用 Android 格式化字符串时间戳

    出于某种原因 这让我抓狂了 我在 Android 中有一个 UNIX 时间戳作为字符串 我想要做的就是对其进行格式化 以便它返回用户的 droid 时区中的日期 时间 我可以将其转换为时间戳 但它使用 GMT 而不是其本地化区域 Thank
  • 如何一次性将排序规则更改为utf8_bin

    我已将所有数据库表的排序规则设置为latin1 swedish ci现在我意识到我应该使用utf8 bin or utf8 general ci 如何将表中的排序规则更改为utf8 bin or utf8 general ci一气呵成 我可
  • 谷歌地图自动完成、带有边界框的严格边界和自定义 UI

    我有一个输入 我想用作谷歌地图自动完成搜索 但具有一些自定义 UI 制作标准自动完成小部件 https developers google com maps documentation javascript reference Autoco
  • 如何在布线级别验证 Rails 中的静态参数?

    我目前有以下宁静的网址 questions 2011 05 我的提问路线是 match questions year month gt Questions month 如何在路线级别验证上述年份和月份参数 以便 年和月是整数 最短 最长一年
  • android numberpicker 用于浮点数

    我们应用程序的用户应该能够调整浮点数 目前 我用所有可能的值填充了 ArrayAdapter 并将其附加到微调器 这个解决方案并没有真正满足我们的期望 因为旋转下拉框太高了 有没有更好的办法 我正在查看 Numberpicker 但这似乎只
  • 造型 ActionBar Sherlock

    我正在尝试自定义我的 sherlock 操作栏 但我在 style xml 中编写的任何代码都未被识别 在我的清单文件中 android theme style Theme Sherlock 我的样式 xml
  • 通过 nginx 和 ServiceStack 在 fastcgi-mono-server 上进行小负载测试后,网关 502 错误

    我正在尝试在 nginx 和 fastcgi mono server 下使用 ServiceStack 运行 Web 服务 API 服务器启动正常 API 已启动并运行 我可以通过 ServiceStack Profiler 在浏览器中查看