Nginx 中 502 和 504 錯誤詳解

在使用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錯誤訪問日誌:

2013/09/19 01:09:00 [error] 27600#0: *78887 recv() failed (104: Connection reset by peer) while reading response header from upstream,
client: 192.168.1.101, server: test.com, request: “POST /index.php HTTP/1.1”, upstream: “fastcgi://unix:/dev/shm/php-fcgi.sock:”,
host: “test.com”, referrer: “http://test.com/index.php
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 調小一些。

  1. 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錯誤訪問日誌如下:

2013/09/19 00:55:51 [error] 27600#0: *78877 upstream timed out (110: Connection timed out) while reading response header from upstream,
client: 192.168.1.101, server: test.com, request: “POST /index.php HTTP/1.1”, upstream: “fastcgi://unix:/dev/shm/php-fcgi.sock:”,
host: “test.com”, referrer: “http://test.com/index.php
調高這三項的值(主要是read和send兩項,默認不配置的話Nginx會將超時時間設爲60秒)之後,504錯誤也解決了。

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

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

配置舉例:
這裏寫圖片描述

參考資料
http://ju.outofmemory.cn/entry/300569
https://segmentfault.com/a/1190000002686153
http://www.ttlsa.com/web/analysis-of-site-502-and-504-error/

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