最近nginx間隙性的出現502錯誤,如何?自動重啟php-fpm呢
想到的解決方案
1、使用crontab定時執行shell指令碼,出現錯誤後重啟(每5秒定時執行)
2、使用nohup,shell指令碼後台執行
樣本指令碼
#!/bin/bash while : do URL="http://192.168.1.30" RESULT=`curl -m 10 -I -s $URL | grep "HTTP/1.1 502"` if [ -n "$RESULT" ]; then /etc/init.d/php-fpm restart fi sleep 5done
3、編寫nginx模組,通過條件執行shell指令碼
能想到的也就是這幾種了,感覺這幾種方案都不太好,誰有更好的解決方案?
回複內容:
最近nginx間隙性的出現502錯誤,如何?自動重啟php-fpm呢
想到的解決方案
1、使用crontab定時執行shell指令碼,出現錯誤後重啟(每5秒定時執行)
2、使用nohup,shell指令碼後台執行
樣本指令碼
#!/bin/bash while : do URL="http://192.168.1.30" RESULT=`curl -m 10 -I -s $URL | grep "HTTP/1.1 502"` if [ -n "$RESULT" ]; then /etc/init.d/php-fpm restart fi sleep 5done
3、編寫nginx模組,通過條件執行shell指令碼
能想到的也就是這幾種了,感覺這幾種方案都不太好,誰有更好的解決方案?
受到fastcgi_next_upstream這個參數的啟發,使用PHP-FPM線程池的概念,可以完美的解決502錯誤(http_502是沒有的)
http裡面的配置
upstream php_fpm_sock{ server unix:/dev/shm/php-fpm.socket; server unix:/dev/shm/php-fpm-b.socket; server unix:/dev/shm/php-fpm-c.socket;} fastcgi_next_upstream error timeout invalid_header http_503 http_500;
server裡面fastcgi_pass配置
location ~* \.php$ { fastcgi_pass **unix:php_fpm_sock;** fastcgi_index index.php; client_max_body_size 50M; client_body_temp_path /data/www/tmp; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi.conf; include fastcgi_params;}
php-fpm的配置
#/etc/php-fpm.conf 檔案包含多個設定檔include=/etc/php-fpm.d/*.conf#/etc/php-fpm.d/ 目錄www-a.confwww-b.confwww-c.conf#配置,三個檔案這裡不一致,分別對應#Start a new pool named www-a [www-a]listen = /dev/shm/php-fpm.socket
ps -ef 查看
www 17996 31539 0 12:13 ? 00:00:51 php-fpm: pool www-bwww 17999 31539 0 12:13 ? 00:00:48 php-fpm: pool www-awww 18010 31539 0 12:14 ? 00:00:46 php-fpm: pool www-bwww 18063 31539 0 12:25 ? 00:00:42 php-fpm: pool www-cwww 18153 31539 0 12:47 ? 00:00:34 php-fpm: pool www-cwww 18154 31539 1 12:47 ? 00:00:37 php-fpm: pool www-awww 18185 31539 0 12:55 ? 00:00:29 php-fpm: pool www-cwww 18313 31539 0 13:24 ? 00:00:10 php-fpm: pool www-a
1、啟動的各個PHP-FPM線程池,只要不都掛掉,nginx就可以正常執行PHP,如果有的異常退出了,基本也不影響網站運行
2、fastcgi_next_upstream那行的參數,不需要加http_502,實際你也加不上去的
3、原有的每段類似這種location ~ \.php$ {} 代碼都需要對fastcgi_pass這行根據樣本改造
Nginx可以配置fastcgi_next_upstream實現容錯移轉,比如:
fastcgi_next_upstream error timeout invalid_header http_500 http_503;
後端PHP-FPM返回error、timeout等資訊則自動切換到upstream裡的下一台PHP-FPM應用伺服器。
個人覺得最好還是找出PHP-FPM背景工作處理序崩潰的原因,是代碼問題,還是系統資源不足導致響應逾時。
注意兩點,一是不要在PHP-FPM裡執行耗時太長或不確定的代碼,比如curl發出網路請求。二是PHP-FPM背景工作處理序不是越多越好,個人認為,PHP-FPM背景工作處理序數,設定為2倍CPU核心數就足夠了。畢竟,Nginx和MySQL以及系統同樣要消耗CPU。根據伺服器記憶體來設定PHP-FPM進程數是非常不合理的,把記憶體配置給MySQL、Memcached這些服務顯然更合適,過多的PHP-FPM進程反而會增加CPU環境切換的開銷。