Apache2/fastcgi/php fastcgi/haproxy - 優雅重啟問題更改配置設置
我有一個帶有 php fastcgi 設置的 Apache2;我想在沒有客戶注意到的情況下進行配置更改(所以沒有丟棄/失敗的請求),所以我把 haproxy 放在它前面;所以我有 2 台 Apache2 伺服器在同一台伺服器上的不同 IP 上執行,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 完成到 server1 的所有連接(完成意味著讓它們執行),但在給定的時間點將所有新連接發送到 server2,它會起作用。
另請注意:我需要 php-cgi: 使用mod_php事情會更容易。
**編輯:**我試過這個:
http://www.iterasi.net/openviewer.aspx?sqrlitid=afatecr91eadnhiil9agpg
但是正在進行的請求不會傳遞給備份,所以一些客戶端仍然得到一個
Bad Gateway
.回答本的評論:
使用 cgi 優雅似乎啟動了所有正在進行的連接:使用mod_php優雅工作正常:沒有停機時間。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
另一個跡象表明關閉沒有什麼優雅的。
您可以告訴 haproxy 停止向伺服器發送連接。為此,您必須在您的 haproxy 配置中指定“http-check disable-on-404”,並讓您的 Web 伺服器返回 404(僅此而已)到 haproxy 的健康檢查。如果 haproxy 看到這個,它會將伺服器標記為“NOLB”,這意味著它被排除在負載平衡之外,但仍然完成它的連接,並且仍然接受請求它的持久連接。這樣,所有新客戶端都會轉到其他伺服器。
執行此操作的最簡單方法是檢查“活動”文件,一旦刪除,將導致返回 404(因此選擇此返回程式碼)。當然,開發一個更完整的伺服器端應用程序來響應健康檢查更好!