搜索
首页php教程php手册nginx 504 Gateway Time-out错误排查

一次nginx 504 Gateway Time-out错误排查、解决记录,经过反复检查,发现造成这个问题的原因就是PHP的CURL没有设置超时时间,解决办法只要设置超时时间或者修改一下nginx的配置即可解决。

记一次莫名其妙的网站失去响应排查。之前网站一直是使用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()的系统调用,流操作,数据库操作等的脚本执行的最大时间不包括其中,当该脚本已运行。www.jbxue.com
就是说如果脚本中执行了其它操作的时间是不计在脚本运行时间当中的,如果你没设置超时,那么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的话,可以使用这段代码

<span>$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);
}</span>
声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用