Nginx 502 Bad Gateway的含義是請求的PHP-CGI已經執行,但是由於某種原因(一般是讀取資源的問題)沒有執行完畢而導致PHP-CGI進程終止,一般來說Nginx 502 Bad Gateway和php-fpm.conf的設置有關。
常見的原因可能是php-cgi進程數不夠用、php執行時間長(mysql慢)、或者是php-cgi進程死掉,都會出現502錯誤。
1. 在安裝好的環境中,運行一段時間出現502問題,一般是因為默認php-cgi進程是5個,可能因為phpcgi進程不夠用而造成502,需要修改/usr/local/php/etc/php-fpm.conf 將其中的max_children值適當增加。
2. php執行超時,修改/usr/local/php/etc/php.ini 將max_execution_time 改為300
3. 磁盤空間不足,可以使用 # df -h命令查看磁盤使用量
4. php-cgi進程死掉了。
通常的排查方法如下:
1、查看php fastcgi的進程數(max_children值)
# netstat -anop | grep php-cgi | wc -l
# netstat -anpo | grep php-fpm | wc -l
假如顯示是5
2、查看當前進程
# ps aux | grep php-fpm 觀察fastcgi/php-fpm進程數,假如使用的進程數等於或高於5個,說明需要增加。
3、調整/usr/local/php/etc/php-fpm.conf 的相關設置
pm.max_children = 5
request_terminate_timeout = 60
max_children最多5個進程,按照每個進程20MB內存,最多100MB。也就是1分鍾。max_children增多,則php-cgi的進程多了就會處理的很快,排隊的請求就會很少。 但是設置max_children也需要根據服務器的性能進行設定,一般來說一台服務器正常情況下每一個php-cgi所耗費的內存在20M左右。根據自己服務器購買的內存來實際決定。
request_terminate_timeout執行的時間為60秒,request_terminate_timeout值可以根據服務器的性能進行設定。一般來說性能越好你可以設置越高,20分鍾-30分鍾都可以。
4. 部分PHP程序的執行時間超過了Nginx的等待時間,可以適當增加nginx.conf配置文件中FastCGI的timeout時間,例如:
http
{
......
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
......
}