在使用nginx時,經常會碰到502 bad gateway和504 gateway time-out錯誤,下面以nginx+php-fpm來分析下這兩種常見錯誤的原因和解決方案。
1.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調小一些。
2.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生效的。
配置舉例:
location ~ \.php$
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 來分析下這兩種常見錯誤的原因和解決方案。502 bad gateway 錯誤 在 php.ini 和 php fpm.conf 中分別有這樣兩個配置...
Nginx 502 和504錯誤的解決方法
深入分析nginx 502 bad gateway和nginx 504 gateway time out及其解決 nginx 502 bad gateway的含義是請求的php cgi已經執行,但是由於某種原因 一般是讀取資源的問題 沒有執行完畢而導致php cgi程序終止。nginx 504 ga...