带有HAProxy后面的乘客的Nginx会导致503错误

在过去的一个月中,我不得不学习了很多关于服务器configuration,集成,AWS等方面的知识。我从来没有这样做过。

我得到了一切,并为我的应用程序运行良好(主要感谢http://github.com/wr0ngway/rubber创业板和#rubberec2 IRC频道的帮助)。 但是,我遇到了一个神秘的(对我)的问题。

我在HAProxy后面运行Nginx + Passenger。 到目前为止,只有一个Nginx + Passenger主机正在使用,所以HAProxy实际上并没有太多的function,但我们将来会增加更多的应用服务器。

问题

我被卡住偶尔的503错误,在一天中的某些时间(在更高的负载?)变得烦人。 这些错误都发生在静态资产和路由URL上。 我已经确定这是HAProxy引发他们,因为页面和它的头是相同的/etc/haproxy/errors/503.http。

我认为nginx并不关心它接收多less请求,它可以处理所有这些请求,因为它有自己的排队,并且乘客正确分配东西。 那么为什么HAProxy声称没有服务器可以处理一些请求?

我的HAProxyconfiguration

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 xxxx:x option forwardfor server web01 web01:xxxx maxconn 20 check 

注意:IP和端口被replace为x es。

PS我不擅长这个东西,随着我的学习。

更新

我使用siege来testing服务器,发现运行约58个并发会话时,我可以重现503s。 在这种情况下成功率只有54%。

更新2

我发现,Nginx的访问日志输出"-" 400 0 "-" "-" "-"每次我得到503。

更新3

大家都说,当cookie太大时,nginx会给出“400错误请求”错误。 但是,设置large_client_header_buffers指令并不能解决这个问题。

更新4

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

更新5

我注意到nginx正在我的系统上的两个地方login,并且每次攻城显示“连接超时”时都有一个错误日志返回这个消息:

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.

从HAProxy configuration指南你需要增加服务器声明的maxconn参数。

当服务器指定了“maxconn”参数时,这意味着它的并发连接数永远不会更高。 此外,如果它有一个“minconn”参数,则表示后端负载之后的dynamic限制。 服务器将始终接受至less连接,但不会超过,并且当后端less于并发连接时,限制将在这两个值之间变化。 这样可以在正常负载下限制服务器上的负载,但是可以在重要负载时进一步推动负载,而在exception负载下不会使服务器过载。

我强烈build议阅读整个文件,因为那里有很多好的信息。