我有一个带有 php fastcgi 设置的 Apache2;我想在客户端不察觉的情况下进行配置更改(这样就不会丢失/失败请求),因此我将 haproxy 放在它前面;因此我在同一台服务器上的不同 IP 上运行了 2 个 Apache2 服务器,并且在它们前面运行了 Haproxy 负载平衡/故障转移。
Apache 和 Haproxy 都关闭了 Keepalive。当我运行/etc/init.d/apache2_1 restart
或apache2ctl -k graceful -f /etc/apache2_1/apache2.conf
运行时
watch -n 1 lynx -dump -source http://server/test.php
(其中包含echo rand(1,100000);
)
它仍然会丢弃 1 个带有 的请求Bad Gateway
。我该如何防止这种情况发生?
基本上,如果我可以告诉 Haproxy 完成与服务器 1 的所有连接(完成意味着让它们运行),但在给定的时间点将所有新连接发送到服务器 2,它就会工作。
另请注意:我需要 php-cgi:mod_php事情就变得更容易了。
编辑:我尝试过这个:http://www.iterasi.net/openviewer.aspx?sqrlitid=afatecr91eadnhiil9agpg
但是正在进行的请求不会传递给备份,因此一些客户端仍然会收到Bad Gateway
。
回答 Ben 的评论:
使用 cgi graceful 似乎可以启动所有正在进行的连接:mod_phpgraceful 运行良好:没有停机时间。Haproxy 可以看到 apache 何时停机(在统计屏幕上显示为黄色),但 fastcgi 只是在半空中切断了脚本。
[Sat Aug 15 19:00:55 2009] [notice] mod_fcgid: process /var/www/gui/wsapi.php(13987) exit(communication error), terminated by calling exit(), return code: 0
[Sat Aug 15 19:00:55 2009] [notice] mod_fcgid: process 14012 going graceful shutdown, sending SIGTERM
[Sat Aug 15 19:00:56 2009] [notice] mod_fcgid: process /var/www/gui/index.php(13999) exit(communication error), terminated by calling exit(), return code: 0
许多客户还获得了:
[Sat Aug 15 19:05:42 2009] [error] [client xxx.xxx.xxx.xxx] Premature end of script headers: index.php
另一个迹象表明,此次关闭并不体面。
答案1
您可以告诉 haproxy 停止向服务器发送连接。为此,您必须在 haproxy 配置中指定“http-check disable-on-404”,并让您的 Web 服务器向 haproxy 的健康检查返回 404(没有其他内容)。如果 haproxy 看到此信息,它会将服务器标记为“NOLB”,这意味着它被排除在负载平衡之外,但仍会完成其连接,并仍会接受请求它的持久连接。这样,所有新客户端都会转到其他服务器。
最简单的方法是检查是否存在“活动”文件,一旦删除该文件,将导致返回 404(因此选择此返回代码)。当然,开发更完整的服务器端应用程序来响应健康检查更好!