apache2 + mod_fastcgi + suexec + php5.2 = 高負載時不穩定

apache2 + mod_fastcgi + suexec + php5.2 = 高負載時不穩定

我在一台伺服器上使用 apache2+fastcgi+suexec+php5 託管多個(~30)個不同的網站。站點的腳本負載和執行時間不同(有些站點處理請求的時間為 5-7 秒,有些小於 1 秒)。

有時,當單一網站收到非常高的負載(該網站的所有 php 實例都已建立和使用)時 - 整個 apache 伺服器掛起。 Apache(worker mpm)建立新程序直到上限。看起來它開始對每個站點的所有新請求進行排隊,而不僅僅是具有高負載并快速達到進程限制的站點...重新啟動 apache 解決了問題...

設定:FastCgiConfig -singleThreshold 1 -multiThreshold 10 -listen-queue-depth 30 -maxProcesses 80 -maxClassProcesses 12 -idle-timeout 30 -pass-header HTTP_AUTHORIZATION -pass-header If-Mified-Since——

(之前有預設的-listen-queue-depth = 100,但它沒有改變任何東西...)

有什麼建議麼?

另一個問題──這個監聽佇列是如何實現的?它是整個 apache 的佇​​列,還是每個定義的 php 應用程式(suexec 網站)的唯一佇列?

我想實現這樣的目標:當一個站點接收高負載並且其隊列已滿時 - 伺服器反彈下一個請求,但僅限於該站點..其他站點應該正常工作...

答案1

Apache 2.4 提供了一個新的 fastcgi 代理模組(mod_proxy_fcgi),可以將請求代理到 php-fpm。使用 mod_proxy 作為中介意味著您可以存取所有 mod_proxy 選項,包括與主伺服器分開的排隊和耗盡參數。

我建議您使用 apache 2.4 event MPM 和 php-fpm 在測試伺服器上進行設定;您也可以針對不同的應用程式調整每個 php 池。

答案2

您是否嘗試過 mod_fcgid ?它可以更好地處理伺服器的高負載。

答案3

如果 fastcgi 將 php 腳本作為使用者程序啟動,則作業系統應強制執行 /etc/security/limits.conf 定義(特別是 nproc)。

即:apache 將嘗試以該使用者身分啟動進程,且作業系統將終止該進程,因為它超出了進程限制。

不過,這有點像是拼湊而成的;如果機器處於空閒狀態,您仍然會終止連線。

為什麼不將更大的客戶端分叉到專用機器上呢?或啟動一個輔助 apache,監聽高端口,並設定佔用空間/運行時間限額?您可以使用 mod_proxy 透明地傳遞請求。

也就是說,我對 fastcgi 不太熟悉,所以可能已經有一些配額系統可用;不過,快速閱讀文件並沒有得到任何結果。

答案4

您可以在此處查看一系列網路教學: http://blog.stuartherbert.com/php/category/the-web-platform/

我個人認為這些都非常有見地!本教程可能同樣有幫助: http://blog.stuartherbert.com/php/2008/10/07/can-you-secure-a-shared-server-with-php-fastcgi/

如果高流量網站使用了這麼多資源,我建議誠實地將其移至自己的電腦上。

相關內容