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)問題總結,做好筆記,下次遇到則可快速解決。