HAProxy 后面带有 Passenger 的 Nginx 导致 503 错误

HAProxy 后面带有 Passenger 的 Nginx 导致 503 错误

在过去的一个月里,我被迫学习很多关于服务器配置、集成、AWS 等方面的知识。我从来没有做过这么深入的事情。

我的应用程序一切运行良好(主要归功于http://github.com/wr0ngway/rubber我从 IRC 频道 #rubberec2 获得了一些精华和帮助。但是,我遇到了一个对我来说很神秘的问题。

我在 HAProxy 后面运行 Nginx + Passenger。到目前为止,只使用了一个 Nginx + Passenger 主机,因此 HAProxy 目前还不能发挥太大作用,但我们将来会添加更多应用服务器。

问题

我偶尔会遇到 503 错误,在一天中的某些时间(负载较高时?)会变得很烦人。这些错误发生在静态资产和路由 URL 上。我确定是 HAProxy 抛出了它们,因为页面及其标头与 /etc/haproxy/errors/503.http 中的内容相同。

我认为 nginx 并不关心它接收到了多少请求,它可以处理所有请求,因为它有自己的队列,并且 Passenger 可以正确分配请求。那么为什么 HAProxy 会声称没有可用的服务器来处理某些请求呢?

我的 HAProxy 配置

global
  log 127.0.0.1 local0 warning
  maxconn 1024

defaults
  log global
  mode http
  retries 3
  balance roundrobin
  option abortonclose
  option redispatch
  option httplog
  contimeout 4000
  clitimeout 150000
  srvtimeout 30000

listen passenger_proxy x.x.x.x:x
  option forwardfor
  server web01 web01:xxxx maxconn 20 check

注意:IP 和端口替换为xes。

PS:我不擅长这些东西,我正在边做边学。

更新

我曾经siege对服务器进行过基准测试,发现在运行大约 58 个并发会话时可以重现 503 错误。在这种情况下,成功率只有 54%。

更新 2

我发现"-" 400 0 "-" "-" "-"每次收到 503 时,nginx 访问日志都会输出。

更新 3

大家都说当 cookies 太大时,nginx 会给出“400 Bad Request”错误。但是设置large_client_header_buffers指令并没有为我解决这个问题。

更新 4

siege在服务器上运行,直接在 nginx 的监听端口上定位它,现在 nginx 开始返回 499 个错误,其模式与以前返回 503 个错误相同。当发生这种情况时,Siege 一直告诉我连接超时。看来我离问题越来越近了。

更新 5

我注意到 nginx 在我的系统上有两个地方进行登录,并且每次 siege 显示“连接超时”时都会有一个错误日志返回此消息:

file=ext/nginx/HelperAgent.cpp:574 time=2011-09-15 07:43:22.196 ]: Couldn't forward the HTTP response back to the HTTP client: It seems the user clicked on the 'Stop' button in his browser.

答案1

从 HAProxy配置指南您需要maxconn在服务器声明中增加该参数。

当服务器指定了“maxconn”参数时,这意味着其并发连接数永远不会增加。此外,如果它有“minconn”参数,则表示根据后端负载动态限制。然后,服务器将始终接受至少 连接,永远不会超过 ,并且当后端的并发连接数少于 时,限制将在两个值之间变化。这使得可以在正常负载期间限制服务器的负载,但在重要负载时进一步增加负载,而不会在异常负载期间使服务器过载。

我强烈建议通读整个文档,因为其中有很多有很多有用的信息。

相关内容