在安装完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默认的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模式。)

对 Linux  西西 也是菜鸟,只好照着别人的方法来设置了,等一段时间,没什么问题了,这个方法应该就是一个很有效的方法了。

Nginx 502 Bad Gateway的含义是请求的PHP-CGI已经执行,但是由于某种原因(一般是读取资源的问题)没有执行完毕而导致PHP-CGI进程终止。

错误排查:

1 、查看fastcgi进程是否启动

2、检查系统中fastcgi进程的运行情况

当系统中fastcGI进程数不够用、php执行时间长、或者是php-cgi进程死掉也可能造成502错误

首先查看系统中开启fastcGI的进程数

ps aux | grep "php-cgi" | wc -l

查看有多少php-cgi来处理请求

netstat -anpo | grep "php-cgi" | grep -v "grep"  | wc -l

如果处理请求的进程数接近开启的进程数说明worker进程数配置太少,需要修改php-fpm.conf来增大php的进程数

3、fastcGI执行时间过长

可以根据实际情况调高nginx.conf中的以下参数:

fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;

增加了fastcgi的相应请求时间。但是我在实际中碰到了这个问题,设置到500,还是会出现,只是比我设置120的时候要少一些。后来发现主要是在一些post或者数据库操作的时候出现这种情况,静态页面是不会出现的。
反复的查问题,调试,也加大了CGI的进程数。
128 
256再加上去可能会变得很慢。占用内存大了。
在php-fpm.conf设置中还有一项,可能当时没注意到,无意中改了这个值。
request_terminate_timeout
这个值是max_execution_time,就是fast-cgi的执行脚本时间。
0s
0s为关闭,就是无限执行下去。(当时装的时候没仔细看就改了一个数字)
发现,问题解决了,执行很长时间也不会出错了
优化fastcgi中,还可以改改这个值5s 。看看效果

4、头部太大

nginx和apache一样,有前段缓冲限制,可以调整缓冲参数

fastcgi_buffer_size 32k;
fastcgi_buffers 8 32k;

如果你使用的是nginx的负载均衡Proxying,调整
proxy_buffer_size  16k;
proxy_buffers      4 16k;

5、https转发配置错误

正确的配置方法
server_name www.mydomain.com;
location /myproj/repos {
set $fixed_destination $http_destination;
if ( $http_destination ~* ^https(.*)$ )
{
set $fixed_destination http$1;
}
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Destination $fixed_destination;
proxy_pass http://subversion_hosts;
}

6、将nginx的error log打开,发现”pstream sent too big header while reading response header from upstream”这样的错误提示,查阅了一下资料,大意是nginx缓冲区有一个bug造成的,我们网站的页面消耗占用缓冲区可能过大。参考老外写的修 改办法增加了缓冲区容量大小设置,502问题彻底解决,后来系统管理员又对参数做了调整只保留了2个设置参数:client head buffer,fastcgi buffer size。

http://blog.rackcorp.com/?p=14

7、一台服务器上运行着nginx php(fpm) xcache,访问量日均 300W pv左右

最近经常会出现这样的情况: php页面打开很慢,cpu使用率突然降至很低,系统负载突然升至很高,查看网卡的流量,也会发现突然降到了很低。这种情况只持续数秒钟就恢复了
检查php-fpm的日志文件发现了一些线索
Sep 30 08:32:23.289973 [NOTICE] fpm_unix_init_main(), line 271: getrlimit(nofile): max:51200, cur:51200
Sep 30 08:32:23.290212 [NOTICE] fpm_sockets_init_main(), line 371: using inherited socket fd=10,
Sep 30 08:32:23.290342 [NOTICE] fpm_event_init_main(), line 109: libevent: using epoll
Sep 30 08:32:23.296426 [NOTICE] fpm_init(), line 47: fpm is running, pid 30587
在这几句的前面,是1000多行的关闭children和开启children的日志 ?
原来,php-fpm有一个参数 max_requests ,该参数指明了,每个children最多处理多少个请求后便会被关闭,默认的设置是500。因为php是把请求轮询给每个children,在大流量 下,每个childre到达max_requests所用的时间都差不多,这样就造成所有的children基本上在同一时间被关闭。
在这期间,nginx无法将php文件转交给php-fpm处理,所以cpu会降至很低(不用处理php,更不用执行sql),而负载会升至很高(关闭和开启children、nginx等待php-fpm),网卡流量也降至很低(nginx无法生成数据传输给客户端)
解决问题很简单,增加children的数量,并且将 max_requests 设置未 0 或者一个比较大的值,重启php-fpm

  Nginx 504 Gateway Time-out的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI。

  解决这两个问题其实是需要综合思考的,一般来说Nginx 502 Bad Gateway和php-fpm.conf的设置有关,而Nginx 504 Gateway Time-out则是与nginx.conf的设置有关。

  而正确的设置需要考虑服务器自身的性能和访客的数量等多重因素。

  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;

  这里最主要的设置是前三条,即

  fastcgi_connect_timeout 300s;

  fastcgi_send_timeout 300s;

  fastcgi_read_timeout 300s;

  这里规定了PHP-CGI的连接、发送和读取的时间,300秒足够用了,因此我的服务器很少出现504 Gateway Time-out这个错误。最关键的是php-fpm.conf的设置,这个会直接导致502 Bad Gateway和504 Gateway Time-out。

  下面我们来仔细分析一下php-fpm.conf几个重要的参数:

  php-fpm.conf有两个至关重要的参数,一个是”max_children”,另一个是”request_terminate_timeout”

  我的两个设置的值一个是”40″,一个是”900″,但是这个值不是通用的,而是需要自己计算的。

  计算的方式如下:

  如果你的服务器性能足够好,且宽带资源足够充足,PHP脚本没有系循环或BUG的话你可以直接将”request_terminate_timeout”设置成0s。0s的含义是让PHP-CGI一直执行下去而没有时间限制。而如果你做不到这一点,也就是说你的PHP-CGI可能出现某个BUG,或者你的宽带不够充足或者其他的原因导致你的PHP-CGI能够假死那么就建议你给”request_terminate_timeout”赋一个值,这个值可以根据你服务器的性能进行设定。一般来说性能越好你可以设置越高,20分钟-30分钟都可以。由于我的服务器PHP脚本需要长时间运行,有的可能会超过10分钟因此我设置了900秒,这样不会导致PHP-CGI死掉而出现502 Bad gateway这个错误。

  而”max_children”这个值又是怎么计算出来的呢?这个值原则上是越大越好,php-cgi的进程多了就会处理的很快,排队的请求就会很少。设置”max_children”也需要根据服务器的性能进行设定,一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右,因此我的”max_children”我设置成40个,20M*40=800M也就是说在峰值的时候所有PHP-CGI所耗内存在800M以内,低于我的有效内存1Gb。而如果我的”max_children”设置的较小,比如5-10个,那么php-cgi就会“很累”,处理速度也很慢,等待的时间也较长。如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误。

转载原文地址:

Nginx 504 Gateway time-out错误完美解决方案_西西软件资讯
http://www.cr173.com/html/50534_1.html

http://www.server110.com/nginx/201401/5032.html

Nginx 502/504 Gateway time-out错误完美解决方案【转发】的更多相关文章

  1. nginx 502 Bad Gateway 错误问题收集

    nginx 502 Bad Gateway 错误问题收集 (2010-11-18 13:51:37) 转载▼ 标签: 杂谈 分类: 工作 nginx 502 Bad Gateway 错误问题收集 因为 ...

  2. Nginx报504 gateway timeout错误的解决方法

    转载文章来源:http://www.111cn.net/sys/nginx/90669.htm(若侵删) Nginx报504 gateway timeout错误引起,一个是文件配置问题,另一个是相关处 ...

  3. Nginx 502 Bad Gateway 错误的原因及解决方法

    http://my.oschina.net/zhouyuan/blog/118708 刚才在调试程序的时候,居然服务器502错误,昨天晚上也发生了,好像我没有做非常规的操作. 然后网上寻找了下答案, ...

  4. NGINX+UWSGI 莫名发生Nginx 502 Bad Gateway错误的排查过程

    自己有个阿里云UBUNTU运行的Django站,使用NGINX+UWSGI驱动,今天登陆系统后台更新内容出现了几个大字:Nginx 502 Bad Gateway,一看情况不好,这是要糟糕啊. 啊西八 ...

  5. nginx 502 Bad Gateway 错误解决办法

    nginx出现502有很多原因,但大部分原因可以归结为资源数量不够用,也就是说后端PHP-fpm处理有问题,nginx将正确的客户端请求发给了后端的php-fpm进程,但是因为php-fpm进程的问题 ...

  6. Nginx报出504 Gateway Timeout错误2

    昨天,一个程序需要导出500条数据,结果发现到150条是,Nginx报出504 Gateway Timeout错误 经观察,发现大约30秒时超时,php.ini中执行时间配置已经是300秒: 复制代码 ...

  7. Nginx 502 Bad Gateway 的错误的解决方案

    我用的是nginx反向代理Apache,直接用Apache不会有任何问题,加上nginx就会有部分ajax请求502的错误,下面是我收集到的解决方案. 一.fastcgi缓冲区设置过小 出现错误,首先 ...

  8. nginx 502 bad gateway 问题处理集锦

    一般看来, 这种情况可能是由于nginx默认的fastcgi进程响应的缓冲区太小造成的, 这将导致fastcgi进程被挂起, 如果你的fastcgi服务对这个挂起处理的不好, 那么最后就极有可能导致5 ...

  9. nginx出现504 Gateway Time-out的解决思路

    http://www.xbc.me/nginx-fix-504-gateway-timeout/ 在安装完Nginx+PHP-fpm+Mysql后 (如何安装LNMP环境,请参考快速配置LNMP环境N ...

随机推荐

  1. 关于sql中join

    对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...

  2. 《数据结构》 java的一维数组的内存结构与其特性

    1{数组的概念: 数组是相同类型变量的集合,可以使用共同的名字引用它.数组也可以被定义为任何类型,可以是一维或者二维的.数组的访问时通过其对应的下标来实现的.数组提供了一种将有联系的信息便利分组的方式 ...

  3. javascript refresh page 几种页面刷新的方法

    Javascript刷新页面的几种方法:1    history.go(0) 2    location.reload() 3    location=location 4    location.a ...

  4. Cocos2d-x 3.1.1开发环境

    Windows7上搭建Cocos2d-x 3.1.1开发环境   前言 现在,越来越多的公司采用Cocos2d-x 3.0来开发游戏了,但是现在这样的文章并不多,所以打算写一系列来帮助初学者快速掌握C ...

  5. 微信企业号JS-SDK选择图片、上传图片

    因公司项目需要,要修改一个手机端上传图片的一个功能,原本的项目用的是input 的file控件上传的,虽然标注了可以多选,但是在实际运用当中只有iOS手机可以实现多选,Android手机并不支持多选, ...

  6. OpenStack构架知识梳理

    OpenStack既是一个社区,也是一个项目和一个开源软件,提供开放源码软件,建立公共和私有云,它提供了一个部署云的操作平台或工具集,其宗旨在于:帮助组织运行为虚拟计算或存储服务的云,为公有云.私有云 ...

  7. MySQL--时间戳与时区问题

    对于使用 timestamp 的场景,MySQL 在访问 timestamp 字段时会做时区转换,当 time_zone 设置为 system 时,MySQL 访问每一行的 timestamp 字段时 ...

  8. [翻译] 学习iOS开发的建议:如何从菜鸟到专家

    [文章原地址] http://mobile.tutsplus.com/tutorials/iphone/ios-quick-tip-from-novice-to-expert/ 翻译有误之处请勿见笑, ...

  9. Linux 只显示目录或者文件方法

    ls 参数 -a 表示显示所有文件,包含隐藏文件-d 表示显示目录自身的属性,而不是目录中的内容-F 选项会在显示目录条目时,在目录后加一个/ 只显示目录 方法一: find . -type d -m ...

  10. thinkphp5使用workerman的定时器定时任务在某一个时间执行

    1.首先通过 composer 安装workerman,在thinkphp5完全开发手册的扩展->coposer包->workerman有详细说明: #在项目根目录执行以下指令compos ...