1. 程式人生 > >nginx出現504 Gateway Time-out的解決思路

nginx出現504 Gateway Time-out的解決思路

str pst bus conn OS head agent cti 時間限制

http://www.xbc.me/nginx-fix-504-gateway-timeout/

在安裝完Nginx+PHP-fpm+Mysql後 (如何安裝LNMP環境,請參考快速配置LNMP環境Nginx0.8.54+MYSQL5.5.16+PHP5.3.8+CentOS 6),跑PHP的應用會經常出現504 Gateway Time-out 或者502 Bad Gateway的情況。

這個問題耽誤了我差不多4個小時的時間,網上有很多前輩們的解決方法,在這裏記錄下解決這個問題的思路。首先這個問題主要是因為PHP的Script執行時間太長了,已經超過nginx能接受的底線。

在nginx的日誌中會看到這樣的log

2012/08/11 13:39:45 [error] 30788#0: *1 upstream timed out (110: Connection timed out) 
while reading response header from upstream, client: 127.0.0.1, server: www.xbc.me, 
request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.xbc.me"

在php-fpm的日誌中會發現這樣的log

2012/08/11 13:39:45 [error] 30788#0: *1 upstream timed out (110: Connection timed out) 
while reading response header from upstream, client: 127.0.0.1, server: www.xbc.me, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.xbc.me"

一般來說,出現這樣的情況是因為Nginx會從php-fpm的9000端口讀取fastcgi的執行結果,等來N久都不見回復,所以就報504了。解決辦法很簡單,修改php的最長執行時間

; Maximum execution time of each script, in seconds; http://
php.net/max-execution-time; Note: This directive is hardcoded to 0 for the CLI SAPI; fix by Matt 2012.8.11 ;max_execution_time = 3000

在這裏我註釋掉php.ini參數的時間限制。還有php-fpm裏的

;request_terminate_timeout = 0

這個參數會在php.ini中max_execution_time因為某些原因不能正常工作才會生效。

之前設置的是300s,安裝Magento的時候就一直就報504。後來索性修改到3000了。在Nginx的配置文件添加

#add by Matt 2012.8.11
fastcgi_read_timeout 3000;
fastcgi_connect_timeout 3000;
fastcgi_send_timeout 3000;

Magento你到底安裝多少sql文件啊?

PS:有時候緩存過小也會引起504,具體情況還需要根據Nginx的日誌內容來分析。修改fastcgi的緩存大小:

fastcgi_buffers 2 256k;
fastcgi_buffer_size 128k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;

參考

解決Nginx + PHP(FastCGI)遇到的502 Bad Gateway錯誤[原創]

安裝 LNMP 的 VPS Nginx 出現 504 Gateway Time-out

nginx php fastcgi Connection reset by peer的原因及解決辦法

nginx出現504 Gateway Time-out的解決思路