NGINX PHP 502解決方案

參考:https://www.phpmianshi.com/?id=90

 

nginx+php 出現502 bad gateway,一般這都不是nginx的問題,而是由於 fastcgi或者php的問題導致的,常見的有以下幾種。

1.   php.ini 的memory_limit 過小(如果有個別php程序進程需要佔用極大內存時這個必須注意)

2.   php-fpm.conf 中max_children或者max_requests  設置不合理(設置過小會因爲沒有足夠的cgi進程處理請求,設置過大會出現一會兒有響應正常,一會兒等很久纔有響應的情況,一般情況下children 按 照內存計算,比如說1G設置64,2G128。這個根據實際情況自行調整。

另外查看當前的PHP FastCGI進程數是否夠用的命令爲:

netstat -napo |grep "php-fpm" | wc -l

查看一下當前 fastcgi 進程個數,如果個數接近 conf 裏配置的上限,就需要調高進程數。

但也不能無休止調高,可以根據服務器內存情況,可以把 php-fpm 子進程數調到 100 或以上,在 4G 內存的服務器上 200 就可以。

3.   查看nginx錯誤日誌,發現 pstream sent too big header while reading response  headerfrom upstream ,則檢查client head buffer,fastcgi buffer  size是否過小,可設置爲32K。

4.   php 程序執行時間過長而超時,檢查nginx和fastcgi中各種timeout設置。

nginx 中的  fastcgi_connect_timeout 300;fastcgi_send_timeout 300  :fastcgi_read_timeout300; keepalive_timeout ;  

php-fpm中的request_terminate_timeout,php.ini中的max_execution_time

5.   php-fpm 有一個參數 max_requests ,該參數指明瞭每個children最多處理多少個請求後便會被關閉。在大量處理請求下,如果該值設置過小會導致 children頻繁的自殺和建立而浪費 大量時間,若所有的children差不多都在這個時候自殺,則重建前將沒有children響應請求,於是出現502  。可以將該值設置大一些或者是0[無限]。

以上差不多是比較常見的502的問題原因以及解決辦法,其實解決問題的最好的方式還是自己去看nginx和fastcgi的errorlog。

最後借用網上的萬金油說法做個總結: php-cgi進程數不夠用、php執行時間長、或者是php-cgi進程死掉,都會出現502錯誤。

 

6. recv()failed (104: Connection reset by peer) while reading response header fromupstream

可能的原因機房網絡丟包或者機房有硬件防火牆禁止訪問該域名

但最重要的是程序裏要設置好超時,不要使用 php-fpm 的 request_terminate_timeout ,

最好設成 request_terminate_timeout=0;

因爲這個參數會直接殺掉 php 進程,然後重啓 php 進程,這樣前端 nginx 就會返回 104: Connection reset by peer 。這個過程是很慢,總體感覺就是網站很卡。

說一千道一萬最重要的就是程序裏控制好超時, gethostbyname 、 curl 、 file_get_contents 等函數的都要設置超時時間。

7、優化

將 Nginx 與 FastCGI 的通信方式由 TCP 改爲 UnixSocket 。 TCP 在高併發訪問下比 UnixSocket 穩定,但 Unix Socket 速度要比 TCP快。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章