NGINX 502 Bad Gateway

NGINX 502 Bad Gateway錯誤出現的原因較多,對於後端連線PHP服務的場景下,常見的原因有php服務回響逾時,php進程不足等引起的一類伺服器錯誤。

簡介

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

相關詞條

熱門詞條

聯絡我們