在过去的一个月里,我被迫学习很多关于服务器配置、集成、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 和端口替换为x
es。
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”参数,则表示根据后端负载动态限制。然后,服务器将始终接受至少 连接,永远不会超过 ,并且当后端的并发连接数少于 时,限制将在两个值之间变化。这使得可以在正常负载期间限制服务器的负载,但在重要负载时进一步增加负载,而不会在异常负载期间使服务器过载。
我强烈建议通读整个文档,因为其中有很多有很多有用的信息。