Nginx 中 502 和 504 錯(cuò)誤
本文轉(zhuǎn)自: https://segmentfault.com/a/1190000002686153
在使用Nginx時(shí)摔笤,經(jīng)常會(huì)碰到 502 Bad Gateway 和 504 Gateway Time-out 錯(cuò)誤,下面以 Nginx+PHP-FPM 來分析下這兩種常見錯(cuò)誤的原因和解決方案。
1. 502 Bad Gateway 錯(cuò)誤
在 php.ini 和 php-fpm.conf 中分別有這樣兩個(gè)配置項(xiàng):max_execution_time 和 request_terminate_timeout嚼贡。
這兩項(xiàng)都是用來配置一個(gè) PHP 腳本的最大執(zhí)行時(shí)間的醉冤。當(dāng)超過這個(gè)時(shí)間時(shí)蝙茶,PHP-FPM不只會(huì)終止腳本的執(zhí)行,還會(huì)終止執(zhí)行腳本的Worker進(jìn)程藕坯。所以Nginx會(huì)發(fā)現(xiàn)與自己通信的連接斷掉了,就會(huì)返回給客戶端502錯(cuò)誤噪沙。
以PHP-FPM的 request_terminate_timeout=30 秒時(shí)為例炼彪,報(bào) 502 Bad Gateway 錯(cuò)誤的具體信息如下:
1)Nginx錯(cuò)誤訪問日志:
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報(bào)錯(cuò)日志:
WARNING: child 25708 exited on signal 15 (SIGTERM) after 21008.883410 seconds from start
所以只需將這兩項(xiàng)的值調(diào)大一些就可以讓PHP腳本不會(huì)因?yàn)閳?zhí)行時(shí)間長(zhǎng)而被終止了。request_terminate_timeout 可以覆蓋 max_execution_time正歼,所以如果不想改全局的php.ini辐马,那只改PHP-FPM的配置就可以了。
此外要注意的是Nginx的upstream模塊中的 max_fail 和 fail_timeout 兩項(xiàng)局义。有時(shí)Nginx與上游服務(wù)器(如Tomcat喜爷、FastCGI)的通信只是偶然斷掉了冗疮,但 max_fail 如果設(shè)置的比較小的話,那么在接下來的 fail_timeout時(shí)間內(nèi)檩帐,Nginx都會(huì)認(rèn)為上游服務(wù)器掛掉了术幔,都會(huì)返回502錯(cuò)誤。
所以可以將 max_fail 調(diào)大一些湃密,將 fail_timeout 調(diào)小一些特愿。
2. 504 Gateway Time-out 錯(cuò)誤
PHP-FPM設(shè)置的腳本最大執(zhí)行時(shí)間已經(jīng)夠長(zhǎng)了,但執(zhí)行耗時(shí)PHP腳本時(shí)勾缭,發(fā)現(xiàn)Nginx報(bào)錯(cuò)從502變?yōu)?04了揍障。這是為什么呢?
因?yàn)槲覀冃薷牡闹皇荘HP的配置俩由,Nginx中也有關(guān)于與上游服務(wù)器通信超時(shí)時(shí)間的配置factcgi_connect/read/send_timeout毒嫡。
以Nginx超時(shí)時(shí)間為90秒,PHP-FPM超時(shí)時(shí)間為300秒為例幻梯,報(bào)504 Gateway Timeout錯(cuò)誤時(shí)的Nginx錯(cuò)誤訪問日志如下:
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"
調(diào)高這三項(xiàng)的值(主要是read和send兩項(xiàng)兜畸,默認(rèn)不配置的話Nginx會(huì)將超時(shí)時(shí)間設(shè)為60秒)之后,504錯(cuò)誤也解決了碘梢。
而且這三項(xiàng)配置可以配置在http咬摇、server級(jí)別,也可以配置在location級(jí)別煞躬。擔(dān)心影響其他應(yīng)用的話肛鹏,就配置在自己應(yīng)用的location中吧。
要注意的是 factcgi_connect/read/send_timeout 是對(duì) FastCGI 生效的恩沛,而 proxy_connect/read/send_timeout 是對(duì) proxy_pass 生效的在扰。
配置舉例:
location ~ \.php$ {
root /home/cdai/test.com;
include fastcgi_params;
fastcgi_connect_timeout 180;
fastcgi_read_timeout 600;
fastcgi_send_timeout 600;
fastcgi_pass unix:/dev/shm/php-fcgi.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/cdai/test.com$fastcgi_script_name;
}