最近在作項目的過程當中,常常出現502bad gateaway.上網總結了一下,發現兩次發生的緣由還不同。php
通常狀況下有如下幾種緣由會出現502.nginx
1.請求併發數很大,phpfastcgi進程數不夠用。由於cgi是單線程多進程工做的,也就是說cgi處理完一個頁面後繼續處理下一個頁面。若是進程數不夠,cgi按排隊處理以前的請求,隊列滿以後的請求只有被放棄。這個時候nginx就會不斷的出現502的錯誤。sql
二、PHPFastcgi內存不夠用。服務器
當請求的頁面爲純靜態頁面時,這個問題通常不會出現。由於nginx不須要走php解析直接返回頁面。若是網頁須要處理大量php數據的話,給的內存不足。就會報502的錯誤。好比今天我作的是一次性須要導出3萬多條的功能,後來設置ini_set('memory_limit', '64M') 改問題解決。併發
針對以上狀況做出的解決方法:異步
1.查看當前跑的php-fpm數量是否超過當前php-fpm配置的數量。php-fpm
2.部分php執行的時間超過了nginx等待的時間。這個網上通常建議去調nginx的等待時間,fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300什麼的。我的感受不是很推薦。http協議自身就是握手再斷開,若是很耗費時間的需求能夠作成異步的。性能
3.max-children和max-request線程
原來,php-fpm有一個參數 max_requests,該參數指明瞭,每一個children最多處理多少個請求後便會被關閉,默認的設置是500。由於php是把請求輪詢給每一個 children,在大流量下,每一個childre到達max_requests所用的時間都差很少,這樣就形成全部的children基本上在同一時間 被關閉。隊列
在這期間,nginx沒法將php文件轉交給php-fpm處理,因此cpu會降至很低(不用處理php,更不用執行sql),而負載會升至很高(關閉和開啓children、nginx等待php-fpm),網卡流量也降至很低(nginx沒法生成數據傳輸給客戶端)
解決問題很簡單,增長children的數量,而且將 max_requests 設置爲 0 或者一個比較大的值。
php的超時時間max_execution_time設爲300。
若是你的服務器性能足夠好,且寬帶資源足夠充足,PHP腳本沒有系循環或BUG的話你能夠直接將 request_terminate_timeout設置成0s。0s的含義是讓PHP-CGI一直執行下去而沒有時間限制。而若是你作不到這一點,也就 是說你的PHP-CGI可能出現某個BUG,或者你的寬帶不夠充足或者其餘的緣由致使你的PHP-CGI假死那麼就建議你給 request_terminate_timeout賦一個值,這個值能夠根據服務器的性能進行設定。通常來講性能越好你能夠設置越高,20分鐘-30分 鍾均可以。而max_children這個值又是怎麼計算出來的呢?這個值原則上是越大越好,php-cgi的進程多了就會處理的很快,排隊的請求就會不多。 設置max_children也須要根據服務器的性能進行設定,通常來講一臺服務器正常狀況下每個php-cgi所耗費的內存在20M左右。