簡介
NGINX 502 Bad Gateway錯誤出現的原因較多,對於後端連線PHP服務的場景下,常見的原因有php服務回響逾時,php進程不足等引起的一類伺服器錯誤。
發生原因
1、PHP FastCGI進程數不夠用
當網站並發訪問巨大時,php fastcgi的進程不一定能回響所有的訪問,因為cgi是單執行緒多進程工作的,也就是說cgi需要處理完一個頁面後再繼續下一個頁面。如果進程數不夠,cgi按排隊處理之前的請求,佇列滿之後的請求只有被放棄。這個時候nginx就會不時的出現502錯誤。這種情況下,開啟Nginx的錯誤日誌可以很清晰的看見相應的報錯,例如”all backends could not serve”。
2、PHP FastCGI的記憶體不夠用
當nginx返回靜態頁面時,這個問題一般不會出現,因為nginx不需要php cgi的處理而直接返回靜態頁面。但是當網頁需要處理大量的php複雜操作的時候,例如執行api採集,或者採集頁面的時候,那對php的要求是相當高的,如果配置給他的記憶體太少,那很容易就會導致php崩潰。
3、在開啟opcache的情況下,如果出現502錯誤,則是由於版本導致的問題
把php的版本升級到5.5.5,可以解決該問題
解決方法
1、首先判斷是不是php fastcgi進程數是否夠用。
netstat -anpo | grep "php-cgi" | wc -l
如果實際使用的“FastCGI進程數”接近預設的“FastCGI進程數”,那么,說明“FastCGI進程數”不夠用,需要增大。 但是要注意計算你的記憶體是否足夠支撐更多的進程數,如果物理機記憶體並不足夠大,加大這個進程數是沒有用處的。
2、部分PHP程式的執行時間超過了Nginx的等待時間,可以適當增加nginx.conf配置檔案中FastCGI的timeout時間,如下:
http
{
......
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
......
}
......
php.ini中memory_limit設低了會出錯,修改了php.ini的memory_limit為64M,重啟nginx,發現好了,原來是PHP的記憶體不足了。
如果以上方法依然不能解決問題,請嘗試最佳化你的php程式,儘量的減少採集和資料庫操作,加快其反應速度,有時候往往是因為自己的php程式反應速度太慢造成的。
自動修正nginx502錯誤
有些時候,502錯誤是不可避免的,可能是間歇性的,幾天或者幾周出現一次,這個時候我們需要一個監控程式,每分鐘去檢測一下系統的可用性,從而最大限度的減少停機時間。
監控502的腳本
cd /
vi 腳本名
#!/bin/sh
if [ -e /var/lock/subsys/502 ]
then
killall -9 curl 2>/dev/null
killall -9 php-cgi 2>/dev/null
phpfpm start >/dev/null
echo "[ `date +'%h %d %T'` ] PHP-FPM died with no response, all processes restarted">>/path/to/log
else
touch /var/lock/subsys/502
if [ `curl --connect-timeout 5 -I 你的監控網址 >/dev/null | grep '502 Bad Gateway' -c` != '0' ]
then
killall -9 php-cgi 2>/dev/null
phpfpm start >/dev/null
echo "[ `date +'%h %d %T'` ] PHP-FPM died with 502 bad gateway, all processes restarted">>/path/to/log
fi
rm -f /var/lock/subsys/502
fi
crontab -e
加入一分鐘檢測一次這個腳本
通過以上的步驟基本上可以了解和解決 NGINX 502 Bad Gateway