Nginx出現502和504錯誤解決方法


公司一臺測試服務器,最近出現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)問題總結,做好筆記,下次遇到則可快速解決


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