您好,登錄后才能下訂單哦!
公司一臺測試服務器,最近出現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相關日志
1 2 | failed (104: Connection reset by peer) while reading... timed out (110: Connection timed out) while reading response... |
2.1.2)php相關日志
1 | WARNING: child 25718 exited on signal 15 (SIGTERM) after 21008.883410 seconds from start |
3)查看php和nginx相關配置(Fastcgi相關參數)
......
3.1.1)Nginx和Fastcgi常用相關參數:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 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)查看進程使用情況
1 | netstat -autpn| grep "php-cgi" | wc -l |
3.1.3)查看Nginx和Fastcgi相關配置
1 2 3 4 5 6 7 | 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足夠,最主要的設置是前三條:
1 2 3 | 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:
1 2 | 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指定了相關參數)
1 2 3 4 5 6 7 | 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)問題總結,做好筆記,下次遇到則可快速解決
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。