天天看點

網站報502、504錯誤---lnmp

一.現象

網站報 502,504

一般502和504會同時出現,在高并發的情況下。

502 表示 php執行過長, 

504 表示 後端php cgi 子程序不夠用 

二.原因

很容易了解,php cgi不夠用了,為什麼不夠用了,某些php執行時間太長,占用大量的cgi資源。

舉個例子,

1個php執行時間,200ms,

那麼 1個php cgi可以 給 5個php服務/秒 。

那麼,5個php程式,占用1個php cgi。

如果1個php 執行時間,30s,

那麼,1個php程式,占用30個php cgi。

服務端的處理能力自然下降,這時,502、504會不斷出現。

在并發度小于php cgi程序數的情況下,某些php執行時間長,沒問題。因為資源沒占滿。(實際情況很複雜,比如cpu,io,mem,net,conn,fd,都算資源,這裡先不考慮)

在并發度高于php cgi程序數的情況下,就會報502,504。

三.解決

解決思路,從以下幾個方面入手,可以采用1個或者多個方案解決

1,資源限制 

1.1要求php程式中,通過配置 ini_set('max_execution_time', $exe_time); //exe_time是允許執行這個php的最長時間。

這樣通過程式中控制每個php執行時長。

1.2在php.ini中,配置 max_execution_time 參數,建議配置成3 ;表示允許每個php執行時間為3s。超過3s就執行失敗了,回報50x錯誤。

1.3在php-fpm.conf中,配置 request_terminate_timeout 參數,建議配置成60;這個是 php cgi,php version >=5.4之後,php cgi,對應的server,就是php-fpm。php-fpm對php 進行解析,執行。

這個配置是絕對影響的,也就說,即使 程式中,配置了 ini_set('max_execution_time', $exe_time);或者 php.ini中配置了max_execution_time;最終都由 php-fpm的request_terminate_timeout 參數決定 php的運作時長。

因為它是server端。

1.4在php.ini中的 sql.safe_mode 參數,這個參數如果打開(on),那麼php程式中,使用ini_set('max_execution_time', $exe_time) 将不起作用。

2,資源隔離

針對不同的業務,有的業務需要php執行時間長,有的執行時間短,可以針對不同業務,啟動不同的php-fpm,這樣保證各個業務,php cgi的服務是隔離的,出問題隻影響自身的業務。

3,優化

優化是多方面的,簡單說

3.1可以通過php-fpm日志中,找出哪些slow query,php-fpm.conf中 request_slowlog_timeout 、slowlog、access.log 可以配置,之後通過pid及php檔案名就能定位出哪些函數執行慢。之後可以做優化。

3.2可以通過xhprof 打日志,或者輸出資訊,做優化。一般3.1就夠了

3.3可以通過程式打日志,不斷定位出,是執行資料庫查詢/寫入慢,還是其他原因,一層一層都能找到。

4,運維準入

運維準入要有,運維指導、限制、明确代碼執行時間,編碼規範。從團隊管理上,要對運維和開發角色設定 連帶責任,落實,推動,保證穩定性。

繼續閱讀