1. 程式人生 > >Nginx+PHP (Fastcgi)常見502和504問題解決

Nginx+PHP (Fastcgi)常見502和504問題解決

轉載文章來源:http://www.linuxidc.com/Linux/2017-02/140777.htm(若侵刪)

全文如下:

公司一臺測試伺服器,最近出現504和502問題:(環境LNMP,php編譯安裝,Fastcgi模式),問題不難解決,但這裡分享一下自己的排查思路和處理問題的方式。

504 Gateway Time-out,nginx 502 bad gateway

一、分析問題:

Nginx 504 Gateway Time-out的含義是沒有請求到可以執行的PHP-CGI。

Nginx 502 Bad Gateway的含義是請求的PHP-CGI已經執行,但是由於讀取資源的等沒有執行完畢而導致PHP-CGI程序終止。

二、排查步驟:

1)檢視Nginx是否可以正常解析php檔案(解析正常)

2)檢視Nginx訪問日誌和php日誌(日誌報錯,鎖定問題)

2.1.1)Nginx相關日誌

 failed (104: Connection reset by peer) while reading... 
 timed out (110: Connection timed out) while reading response...

2.1.2)php相關日誌

WARNING:  child 25718 exited on signal 15 (SIGTERM) after 21008.883410 seconds from start

3)檢視php和nginx相關配置(Fastcgi相關引數)

......

3.1.1)Nginx和Fastcgi常用相關引數:

fastcgi_connect_timeout 60; 
  
#指定連線到後端FastCGI 的超時時間。 
  
fastcgi_send_timeout 60; 
  
#向FastCGI 傳送請求的超時時間,這個值是指已經完成兩次握手後向FastCGI 傳送請求的超時時間。 
  
fastcgi_read_timeout 300; 
  
#接收FastCGI 應答的超時時間,這個值是指已經完成兩次握手後接收FastCGI 應答的超時時間。 
  
fastcgi_buffer_size 4k; 
  
#指定讀取FastCGI 應答第一部分需要用多大的緩衝區,一般第一部分應答不會超過1k,由於頁面大小為4k,所以這裡設定為4k。 
  
fastcgi_buffers 8 4k; 
  
#指定本地需要用多少和多大的緩衝區來緩衝FastCGI 的應答。 
  
fastcgi_busy_buffers_size 8k; 
  
#預設值是fastcgi_buffers 的兩倍。 
  
fastcgi_temp_file_write_size 8k; 
  
#在寫入fastcgi_temp_path 時將用多大的資料塊,預設值是fastcgi_buffers 的兩倍。 
  
fastcgi_cache TEST 
  
#開啟FastCGI 快取並且為其制定一個名稱。 
  
fastcgi_cache_valid 200 302 1h; 
fastcgi_cache_valid 301 1d; 
fastcgi_cache_valid any 1m; 
  
#為指定的應答程式碼指定快取時間,如上例中將200,302 應答快取一小時,301 應答快取1 天,其他為1 分鐘。 
  
fastcgi_cache_min_uses 1; 
  
#快取在fastcgi_cache_path 指令inactive 引數值時間內的最少使用次數,如上例,如果在5 分鐘內某檔案1 次也沒有被使用,那麼這個檔案將被移除。

3.1.2)檢視程序使用情況

netstat -autpn|grep "php-cgi"|wc -l

3.1.3)檢視Nginx和Fastcgi相關配置

fastcgi_connect_timeout 60; 
fastcgi_send_timeout 60; 
fastcgi_read_timeout 60; 
fastcgi_buffer_size 64k; 
fastcgi_buffers 4 64k; 
fastcgi_busy_buffers_size 128k; 
fastcgi_temp_file_write_size 128k;

調整時間,根據之前經驗300s足夠,最主要的設定是前三條:

fastcgi_connect_timeout 300s; 
fastcgi_send_timeout 300s; 
fastcgi_read_timeout 300s;

3.1.4)調php相關引數:

php.ini

1 max_execution_time = 60

php-fpm.conf:

request_terminate_timeout=300s 
#預設是0

3.1.4.1)上述引數作用

兩項都是用來配置PHP指令碼的最大執行時間的。當超過這個時間時,PHP-FPM不只會終止指令碼的執行,還會終止執行指令碼的Worker程序。因此Nginx發現與自己通訊的連線斷掉了,就會返回給客戶端502錯誤。

3.1.4.2)引數具體配置方式:

  如果伺服器效能足夠好,且寬頻資源足夠充足,PHP指令碼沒有系迴圈或BUG的話你可以直接將”request_terminate_timeout”設定成0s。0s的含義是讓PHP-CGI一直執行下去而沒有時間限制。

  ”max_children”也需要根據伺服器的效能進行設定,一般來說一臺伺服器正常情況下每一個php-cgi所耗費的記憶體在20M左右,可根據自己的配置具體定義。

3.1.5)502和504可能存在的其它問題

3.1.5.1)Nginx的max_fail,fail_timeout問題

3.1.5.2)網路偶然問題

3.1.5.3)引數配置衝突問題(eg:php.ini和php-fpm,Nginx配置Fastcgi指定了相關引數)

 location ~ \.php$ { 
                root                    htdocs; 
                include                fastcgi_params; 
                fastcgi_connect_timeout        60; 
                fastcgi_read_timeout            120; 
                fastcgi_send_timeout            120; 
}

三、總結:

4.1)根據Ninx相關報錯可直接根據常見報錯鎖定目標。

4.2)根據日誌,快速鎖定原因。日誌是排錯的法寶,一定要充分利用。

4.3)調引數注意檔案的備份,避免誤操作。此外要考慮到引數生效優先順序的問題。

4.4)問題總結,做好筆記,下次遇到則可快速解決。