我正在使用 Nginx 提供静态内容,并使用 Haproxy 将请求代理到通过 Zookeeper 发现的多个 Apache2 后端。
Nginx->Haproxy->Apache2
根据 Nginx 官方网站的介绍,它会在发往后端的途中聚合长连接,例如这,将连接数量减少到最低限度。
因此,我的假设是 Nginx 是 Keepalive 必须打开的地方,并将其设置为更大的值,在我的情况下为“keepalive_timeout 600”;
然后它通过本地端口访问 Haproxy,并为 Apache 后端启用“httpclose”选项:
选项 httpclose 启用或禁用被动 HTTP 连接关闭
HAProxy 尚不支持 HTTP 保持活动模式。因此,默认情况下,如果客户端在此模式下与服务器通信,它将仅分析、记录和处理每个连接的第一个请求。为了解决此限制,可以指定“option httpclose”。它将检查每个方向是否已设置“Connection: close”标头,如果缺少,则添加一个。每个端点都应对此做出反应,在每次传输后主动关闭 TCP 连接,从而切换到 HTTP 关闭模式。任何不同于“close”的“Connection”标头也将被删除。
此选项可在前端和后端中设置。如果持有连接的前端或后端中至少有一个启用了此选项,则此选项可用。
然后,Haproxy 将连接路由到 Apache2。
因此,我的假设是,在这种情况下,我必须关闭 Apache 的 keepalive,因为 a) Nginx 聚合连接 b) Haproxy 关闭它们。
我的推理正确吗?在像这样的链中,优化 keepalive 的更好方法是什么?
更新: 这ServerFault 主题指出,从 Haproxy 中删除 keepalive 也更有益(我推测这样就可以摆脱 httpclose),因为 Haproxy 和 Apache 之间的延迟太低,不足以证明删除握手是合理的。
因此我们Nginx(KA)-> Haproxy(无 KA)-> Apache(无 KA)
这是一个更好的选择吗?