在安装完Nginx+PHP-fpm+Mysql后,跑PHP的应用会经常出现504 Gateway Time-out 或者502 Bad Gateway的情况。

Nginx 504 Gateway Time-out 的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的 PHP-CGI。这种情况可能是由于 nginx 默认的 fastcgi 进程响应的缓冲区太小造成的, 这将导致 fastcgi 进程被挂起, 如果你的 fastcgi 服务对这个挂起处理的不好, 那么最后就极有可能导致 504 Gateway Time-out。

Nginx 504 Gateway time-out错误完美解决方案(图1)

一般看来, 这种情况可能是由于nginx默认的fastcgi进程响应的缓冲区太小造成的, 这将导致fastcgi进程被挂起, 如果你的fastcgi服务对这个挂起处理的不好, 那么最后就极有可能导致504 Gateway Time-out
现在的网站, 尤其某些论坛有大量的回复和很多内容的, 一个页面甚至有几百K
默认的fastcgi进程响应的缓冲区是8K, 我们可以设置大点

在nginx.conf里, 加入:

fastcgi_buffers 8 128k

这表示设置fastcgi缓冲区为8×128k
当然如果您在进行某一项即时的操作, 可能需要nginx的超时参数调大点, 例如设置成60秒:

send_timeout 60;

我只是调整了这两个参数, 结果就是没有再显示那个超时, 可以说效果不错

这个问题耽误了我差不多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.cr173.com

request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.cr173.com

在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.cr173.com

request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.cr173.com"

一般来说,出现这样的情况是因为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;

VPS出现Nginx 504 Gateway time-out错误

西西 只对 Nginx.conf 和 php-fpm.conf 两个配置文件做了一些修改,观察一段时间,看看效果。

1.将 Nginx.conf 配置文件中相应参数设置为如下:

命令:vi /usr/local/nginx/conf/nginx.conf (lnmp.org出品的lnmp一键安装包路径,其它请自行找目录)

fastcgi_connect_timeout 300s; 

fastcgi_send_timeout 300s; 

fastcgi_read_timeout 300s; 

fastcgi_buffer_size 128k; 

fastcgi_buffers 8 128k;#8 128 

fastcgi_busy_buffers_size 256k; 

fastcgi_temp_file_write_size 256k; 

fastcgi_intercept_errors on;

2.将 php-fpm.conf 配置文件中相应参数设置为如下值:

命令:vi /usr/local/php/etc/php-fpm.conf (lnmp.org出品的lnmp一键安装包路径,其它请自行找目录)

<value name="max_children">9</value>(西西 购买的vps内存较小所以不能设置太大,应根据你的内存来设置) 

<value name="request_terminate_timeout">600s</value>(根据具体情况设置,详请查阅参考文章) 

<value name=”style”>apache-like </value>(php-fpm的默认静态处理方式会使得php-cgi的进程长期占用内存而无法释放,这也是导致nginx出错的原因之一,因此可以将php-fpm的处理方式改成apache模式。)