一次nginx 504 Gateway Time-out错误排查、解决记录

记一次莫名其妙的网站失去响应排查。之前网站一直是使用nginx做代理后端的apache运行php来提供服务。apache经常会不定期不定时间的出现不能服务失去响应,然后nginx出现"504 Gateway Time-out"
查看错误日志也看不到任何东西,以为是apache的bug(其实不是,下面会说原因)。

也许年龄大了人就不爱折腾,愿意保持原状不动,使用监控工具,每次收到报警后都重新启动apache勉强维持着。终于有一天我烦了,不就是处理php吗,我不用apache总行了吧,一怒之下使用源安装php-fpm转移到php-fpm来运行php。安装php并不麻烦,使用源安装还是很顺利的,唯一需要做的就是设置php worker工作进程的日志输出php错误日志。

一切准备就绪后把原来的proxy_pass换成fastcgipass就可以了。


代码如下:

upstream apachephp  {
    server www.jb51.net:8080; #Apache1
}

....
proxy_pass  http://apachephp;

替换成成


代码如下:

upstream php {
        server 127.0.0.1:9000;
}

...
fastcgi_pass php;

就可以把apache上跑的php迁移到php-fpm上来跑。
原以为这样就可以高枕无忧了,迁移完成是也确实没什么问题,但是如果你不去分析问题的根本原因在哪。问题还是会找上门来,第二天nginx又报了504的gateway timeout。这回没apache什么事了吧,apache总算撇清了关系。

那应该还是在nginx和php-fpm身上,查看nginx的错误日志,可以看到


代码如下:

[error] 6695#0: *168438 upstream timed out (110: Connection timed out) while reading response header from upstream,
...
request: "GET /kd/open.php?company=chinapost&number=PA24977020344 HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.jb51.net"

看到这里基本上就排除了nginx嫌疑,nginx是在等待php处理"GET /kd/open.php?company=chinapost&number=PA24977020344 HTTP/1.1"超时退出了。

马上重启php-fpm,问题没有了,网站可以访问了。

再次访问该页面,依然没有响应,但同时访问别的页面正常,该页面刷新几次后,整个网站都是bad gateway timeout了。

问题就缩小到这个php脚本上了。


代码如下:

netstat -napo |grep "php5-fpm" | wc -l

查看php工作进程已经达到了配置文件里的上限10,有种感觉就是大家都被open.php这个脚本卡住了。

这个脚本是干什么的呢?这个脚本就是采集快递信息的,里面用到了php_curl。

PHP脚本如果执行时间超过php.ini中的配置项max_execution_time不出结果就会强制退出。

查看了php.ini中max_execution_time确实配了,值为30。

万能google派上用场了,经过不断google后得到下面这句话

set_time_limit()函数和配置指令max_execution_time只影响脚本本身执行的时间。任何发生在诸如使用system()的系统调用,流操作,数据库操作等的脚本执行的最大时间不包括其中,当该脚本已运行。

就是说如果脚本中执行了其它操作的时间是不计在脚本运行时间当中的,如果你没设置超时,那么php就会一直等待调用的结果。

查看open.php源文件一看,果然没有设置curl的超时时间。

增加如下两行,重新刷新,后问题解决了。

代码如下:

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); //timeout on connect
curl_setopt($ch, CURLOPT_TIMEOUT, 10); //timeout on response

当然,除了这种方法外,php-fpm里也提供参数供我们强制杀死长时间无结果的进程,只是该参数默认没打开。

php-fpm的配置文件里可以设置一个参数request_terminate_timeout,请求终止的超时时间,当请求执行超过这个时间就会被kill。

同时它还有个参数request_slowlog_timeout,用来记录慢请求日志的。

命令行运行php的话,可以使用这段代码

代码如下:

$real_execution_time_limit = 60; //时间限制

if (pcntl_fork())
{
// some long time code which should be
// terminated after $real_execution_time_limit seconds passed if it's not
// finished by that time
}
else
{
sleep($real_execution_time_limit);
posix_kill(posix_getppid(), SIGKILL);
}

(0)

相关推荐

  • 完美解決Nginx 504 Gateway time-out问题

    最近用dedecms建的一个网站新增了大批内容,有三个栏目的内容量都超过了两千篇,超过两千三百篇的两个栏目在生成栏目列表的时候就出现了504 Gateway time-out 服务器用的是nginx,我不是很懂,服务器维护人员在网上随便找了一篇文章,修改了nginx的缓存设置,不管用,他就不管了,可是我不能不管啊,不能生成列表页面,那后面的内容不是都不能用了麽? 把数据库下载到本地,在本地配置了nginx,试了很多遍,都不行,又改到Apache下面,更夸张,生成了83个页面就不能继续了,看来还是

  • nginx 504 Gateway Time-out错误解决方法

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

  • LNMPA遇到504 Gateway time-out错误的解决方法

    Nginx的特点是处理静态很给力,Apache的特点是处理动态很稳定,两者结合起来便是LNMPA,nginx处理前端,apache处理后端,这样处理静态会很快,处理动态会很稳定. 当我以为安装完成以后便万事大吉,不料更新网站的时候却出现504 Gateway time-out;起初还以为这是偶然,多次尝试后依然出现这样的情况,因此才决定查找解决方法. LNMP面对504 Gateway time-out 因为504 Gateway time-out是Nginx的专属错误,因此起初我以为是ngin

  • Nginx 502 bad gateway和Nginx 504 Gateway Time-out错误解决方法 错误解决办法

    最近服务器宕机的现象比较频繁,临下班时分,G给挂掉了,502 Bad Gateway Nginx,不由得让我想起之前的504 Gateway Time-out,两者应该有点联系,一定得弄清楚.Nginx 504 Gateway Time-out的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI. 解决这两个问题其实是需要综合思考的,一般来说Nginx 502 Bad Gateway和php-fpm.conf的设置有关,而Nginx 504 Gateway Time-o

  • 一次nginx 504 Gateway Time-out错误排查、解决记录

    记一次莫名其妙的网站失去响应排查.之前网站一直是使用nginx做代理后端的apache运行php来提供服务.apache经常会不定期不定时间的出现不能服务失去响应,然后nginx出现"504 Gateway Time-out"查看错误日志也看不到任何东西,以为是apache的bug(其实不是,下面会说原因). 也许年龄大了人就不爱折腾,愿意保持原状不动,使用监控工具,每次收到报警后都重新启动apache勉强维持着.终于有一天我烦了,不就是处理php吗,我不用apache总行了吧,一怒之

  • 解决nginx“504 Gateway Time-out”错误

    做网站的同学经常会发现一些nginx服务器访问时候提示504 Gateway Time-out错误,一般情况下是由nginx默认的fastcgi进程响应慢引起的,但也有其他情况,这里我总结了一些解决办法供大家参考. 如何解决"504 Gateway Time-out"错误 方法/步骤 情况一:由于nginx默认的fastcgi进程响应缓冲区太小造成 这种情况下导致fastcgi进程被挂起,如果fastcgi服务队这个挂起处理不是很好的话,就可能提示"504 Gateway T

  • Nginx 504 Gateway Time-out的两种最新解决方案

    目录 背景: 问题: 504从哪来:本文的场景下504是nginx返回的. 两种解决方案 其他问题: 总结 背景: Nginx做反向代理,springboot为后端服务. 问题: 通过浏览器向后台发起请求够,由于后台处理时间长,出现504 Gateway Time-out,实际后台程序依然在执行.如何解决? 504从哪来:本文的场景下504是nginx返回的. nginx配置中控制该超时时间的属性: Syntax: proxy_read_timeout time; Default: proxy_

  • Nginx+CI框架出现404错误怎么解决

    最近刚学ci框架,做了个简单的项目,在本地搭服务器的环境都调通了,但是部署到远程服务器时: http://example.com/(index.php)/ 可以访问(为配置的默认controller-class) http://example.com/(index.php)/[controller-class]/[controller-method] 不可以访问(提示404错误!) 最后百度原因: 对于/index.php/abc这种url,Apache和Lighttpd会按"index.php

  • 详解php+nginx 服务发生500 502错误排查思路

    概述 当线上的服务中访问中出现500或者502错误时,需要紧急处理,排查问题,该怎么做?可以通过分析一些错误日志或者跟踪php-fpm进程来进行问题定位. nginx error_log nginx的error_log在nginx的配置文件中定义的 server { listen 80; server_name localhost; root /var/www; access_log /Users/jiao/logs/default.access.log; error_log /Users/ji

  • Nginx PHP-Fcgi中因PHP执行时间导致504 Gateway Timeout错误解决记录

    昨天,一个程序需要导出500条数据,结果发现到150条是,Nginx报出504 Gateway Timeout错误 经观察,发现大约30秒时超时,php.ini中执行时间配置已经是300秒: 复制代码 代码如下: max_execution_time = 300 再查nginx的相关配置,无果. 写了一个php的测试页再测: 复制代码 代码如下: echo 'aaa'; set_time_limit(0); sleep(40); echo 'aa'; 依然超时,可以确定set_time_limi

随机推荐