Nginx-Haproxy-Apache 链的 Keepalive 最佳实践

Nginx-Haproxy-Apache 链的 Keepalive 最佳实践

我正在使用 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)

这是一个更好的选择吗?

相关内容