Nginx 中 502 和 504 錯誤詳解

2021-08-06 02:49:41 字數 2185 閱讀 7238

在使用nginx時,經常會碰到 502 bad gateway 和 504 gateway time-out 錯誤,下面以 nginx+php-fpm 來分析下這兩種常見錯誤的原因和解決方案。

502 bad gateway 錯誤

在 php.ini 和 php-fpm.conf 中分別有這樣兩個配置項:max_execution_time 和 request_terminate_timeout。

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

以php-fpm的 request_terminate_timeout=30 秒時為例,報 502 bad gateway 錯誤的具體資訊如下:

1)nginx錯誤訪問日誌:

2)php-fpm報錯日誌:

warning: child 25708 exited on signal 15 (sigterm) after 21008.883410 seconds from start

所以只需將這兩項的值調大一些就可以讓php指令碼不會因為執行時間長而被終止了。request_terminate_timeout 可以覆蓋 max_execution_time,所以如果不想改全域性的php.ini,那只改php-fpm的配置就可以了。

此外要注意的是nginx的upstream模組中的 max_fail 和 fail_timeout 兩項。有時nginx與上游伺服器(如tomcat、fastcgi)的通訊只是偶然斷掉了,但 max_fail 如果設定的比較小的話,那麼在接下來的 fail_timeout時間內,nginx都會認為上游伺服器掛掉了,都會返回502錯誤。

所以可以將 max_fail 調大一些,將 fail_timeout 調小一些。

504 gateway time-out 錯誤

php-fpm設定的指令碼最大執行時間已經夠長了,但執行耗時php指令碼時,發現nginx報錯從502變為504了。這是為什麼呢?

因為我們修改的只是php的配置,nginx中也有關於與上游伺服器通訊超時時間的配置factcgi_connect/read/send_timeout。

以nginx超時時間為90秒,php-fpm超時時間為300秒為例,報504 gateway timeout錯誤時的nginx錯誤訪問日誌如下:

調高這三項的值(主要是read和send兩項,預設不配置的話nginx會將超時時間設為60秒)之後,504錯誤也解決了。

而且這三項配置可以配置在http、server級別,也可以配置在location級別。擔心影響其他應用的話,就配置在自己應用的location中吧。

要注意的是 factcgi_connect/read/send_timeout 是對 fastcgi 生效的,而 proxy_connect/read/send_timeout 是對 proxy_pass 生效的。

配置舉例:

參考資料

Nginx中502和504錯誤詳解

在使用nginx時,經常會碰到502 bad gateway和504 gateway time out錯誤,下面以nginx php fpm來分析下這兩種常見錯誤的原因和解決方案。1.502 bad gateway錯誤 在php.ini和php fpm.conf中分別有這樣兩個配置項 max exe...

Nginx中502和504錯誤詳解

在使用nginx時,經常會碰到502 bad gateway和504 gateway time out錯誤,下面以nginx php fpm來分析下這兩種常見錯誤的原因和解決方案。1.502 bad gateway錯誤 在php.ini和php fpm.conf中分別有這樣兩個配置項 max exe...

Nginx 502 和504錯誤的解決方法

深入分析nginx 502 bad gateway和nginx 504 gateway time out及其解決 nginx 502 bad gateway的含義是請求的php cgi已經執行,但是由於某種原因 一般是讀取資源的問題 沒有執行完畢而導致php cgi程序終止。nginx 504 ga...