nginx-php5-fpm - 當nginx顯示502 Bad Gateway錯誤,如何?使用者無感知的自動重啟php-fpm

來源:互聯網
上載者:User
最近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環境切換的開銷。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.