
正文
php跑数据库总是504 php数据库连接失败怎么办
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
如何解决“504 Gateway Time out”错误
php跑数据库总是504我们在访问大流量网站或者运营有较多数据的网站时候php跑数据库总是504,偶尔会出现504 Gateway Time-out错误php跑数据库总是504,这多是网站服务器配置不当导致的,下面分享一下504GatewayTime-out错误的解决方法。
代码释义
504 Gateway Time-out就是字面意思,可以理解为网页请求超时,也就是浏览网站网页所发出的请求没有反应或者未响应,在网站程序层面来说,就是请求未能够执行相应的PHP-CGI程序,或者PHP-CGI程序未能做出相应的处理,又或者是CGI程序的响应处理结果未能够反馈到浏览器或者未能及时反馈到浏览器。
报错背景
504 Gateway Time-out错误多是存在于Nginx网站服务器环境下,多与nginx.conf与php-fpm.conf设置是否正确合理有关。解决方法就是根据网站服务器性能及网站流量等诸多因素整合考虑,正确合理的设置niginx.conf和php-fpm.conf配置。
解决方法
进行正确合理nginx.conf配置,php跑数据库总是504我们需要首先了解和清楚我们网站服务器的配置性能,包括CPU、内存等,并对网站服务器进行必要的性能测试(可参考php跑数据库总是504:vps主机性能测试方法详解),从而准确的掌握网站服务器自身性能状况;
其次,是通过网站统计代码的添加,分析一段时间内网站流量状况,比如:CNZZ站长统计等,掌握网站日流量及PHP-CGI请求的大概情况;
最后,根据我们掌握的服务器性能状况及网络流量情况,合理的对nginx.conf中的下列字句进行合理正确的设置。
fastcgi_connect_timeout300s;
fastcgi_send_timeout300s;
fastcgi_read_timeout300s;
fastcgi_buffer_size128k;
fastcgi_buffers8128k;#8128
fastcgi_busy_buffers_size256k;
fastcgi_temp_file_write_size256k;
fastcgi_intercept_errorson;
还有就是php-fpm.conf中max_children与request_terminate_timeout两个重要参数的设置。这两个参数的设置需要我们根据PHP程序情况及服务器带宽状况综合考虑并计算出合理准确的值,才能够避免504 Gateway Time-out或者其他CGI无响应错误的出现。
相关问答
Q1: PHP 同时多次POST数据到同一网站相同接口获取返回数据 用curl 总是会出现504错误?
具体什么报错,有图片吗?
由于nginx默认的fastcgi进程响应缓冲区太小造成,这种情况下导致fastcgi进程被挂起,如果fastcgi服务队这个挂起处理不是很好的话,就可能提示“504 Gateway Time-out”错误。
PHP环境的配置问题,这里我们需要对php-fpm和nginx进行配置修改。因为这种情况下,也会出现“504 Gateway Time-out”错误提示。
Q2: thinkphp 怎么预防504错误
1、首先要在Lib/Action 下建立EmptyAction.class.php模块
内容如下:
复制代码 代码如下:
?php
/*
* @author rocky
* @date 20141021
* @desc 空模块404等错误
* */
class EmptyAction extends CommonAction {
function _empty(){
header("HTTP/1.0 404 Not Found");
$this-display('Public:404');
}
}
?
2、做完以上处理php跑数据库总是504,只能在访问到空模块php跑数据库总是504的时候才会访问404页面,所以,为了访问空方法也访问404页面,我们还需要在CommonAction.class.php增加一个空方法了,方法如下:
复制代码 代码如下:
//处理所有没有的方法的处理方法,引导到404页面
public function _empty() {
R('Empty/_empty');
}
3、做完以上工作基本可以了,但是别忘了把php跑数据库总是504你的404.html页面放在Tpl/Public下
Q3: 访问php页面出现504 Gateway Timeout 怎么解决
504是网络超时php跑数据库总是504,按以下步骤排查问题php跑数据库总是504:
1、客户端网络是否有问题
2、服务器网络是否有问题
3、代码是否有异常,可以直接输出hello world看下
Q4: 网页出现“504 Gateway Time-out”,没有其它信息是什么原因?
对于一个Web开发者来说php跑数据库总是504,504和502问题看上去好像很简单,每个人也可能都遇到过,但把问题说清楚并不那么容易
两台设备只要通过proxy或fastcgi协议互相通信,都会遇到504问题,比如Nginx+PHP-FPM会遇到;代理服务器连接后端Web服务也会遇到。本次遇到的场景属于后者,重点讲解代理导致的504问题。
那到底上面是504错误呢,看下wiki的引用:
4 Gateway Timeout
The server was acting as a gateway or proxy and did not receive a timely response from the upstream server
意思就是一个网关或代理服务器能够连接后端服务器,但在读取服务器响应的时候超时php跑数据库总是504了。遇到504问题一般是后端服务的问题,比如:
后端进程无故退出了(可能是代码异常,也可能是apache或nginx进程异常),导致代理服务器接收不到后端响应。
后端响应缓慢,导致代理服务器接收后端响应超时了。
服务器出现504 Gateway Time-out的解决方法!
按照上述可能的两个情况,逐一分析。
(1)x.php程序在特定的情况下,确实运行缓慢,但apache得access log在25秒左右的时候成功记录了200访问日志(由于php代码执行结束后才记录日志,一开始可能看不到access日志,导致开始误认为是后端程序的问题)。
(2)在x.php程序中记录应用日志,应用日志和access log日志一样,没有任何异常。
这说明代码并没有问题(但程序执行时间过长,有优化的空间),虽然在20秒产生504错误(由nginx处理),后端代码进程仍然继续运行,并在25秒成功运行。
排除这个问题后,最有可能是代理服务器觉得后端响应过于缓慢,主动关闭了该连接,是不是代理服务器设置的超时时间过短?由于公司的代理服务器(ssl nginx)是由专人维护的,看不到具体的配置,邮件询问了同事,得到回复如下:
proxy_read_timeout 60
proxy_send_timeout 60
首先看下 proxy_read_timeout 的介绍:
Defines a timeout for reading a response from the proxied server. The timeout is set only between two successive read operations, not for the transmission of the whole response. If the proxied server does not transmit anything within this time, the connection is closed.
最后将该值修改为:
proxy_read_timeout 300
proxy_send_timeout 300
问题最终解决了,肯定是proxy读取超时了,但具体的配置仍然疑惑。
进一步测试
可以进一步了解nginx的proxy配置,如果没有特殊的需求,配置非常简单。
server {
listen 443 ssl;
server_name ;
location / {
access_log access.log main;
error_log error.log;
proxy_pass ;
proxy_read_timeout 5;
}
}
proxy_pass 可以是一个host、内部域名、ip地址,不用是一个对外的域名。
如果遇到超时问题,观察error.log日志,会看到以下错误:
2018/09/19 21:01:19 [error] 17034#0: *253 upstream timed out (110: Connection timed out) while reading response header from upstream, client: *.*.*.*, server: , request: "GET /x.php HTTP/1.1", upstream: "http://*.*.*.*:8080/x.php", host: ""
最后经过不断调整nginx的proxy_read_timeout指令和后端x.php程序的执行时间,也没有遇到工作中遇到的问题(20秒和60秒之间不对称的问题),只能后续继续留意了。
总结
1:网关和后端的超时时间(proxy或fastcgi)必须协调一致,在本案例中,apache/mod_php运行最长时间如果是30秒,那么nginx设置的超时时间必须大于30秒,因为必须考虑网络传输延时时间(非网络包总传输时间);而如果是nginx+php-fpm模式,nginx设置的超时时间相对简单,因为大部分情况下,nginx和php-fpm部署在同一台机器上,网络延时相对较短,但必须考虑php最大执行时间和php-fpm最大执行时间,
2:针对504错误,可认为都是http错误码,都是服务器端的错误(相对于客户端),在遇到相关错误的时候,必须根据错误码判断可能存在的问题,然后再针对性的排查,否则排查时间会增加很多。
Q5: php进程超时接口返回504错误分析
在一次接口测试中php跑数据库总是504,发现返回的http 504 time out 的错误php跑数据库总是504,然后查看了php-fpm的错误日志,发现了如下错误
从表现上看,是php进程超时导致的进程被kill了,那么这个超时时间以及kill的机制是跟哪些参数有关呢,这里系统这里一下。
Nginx服务一般因为php的错误或者超时会有两种错误码502 bad Gateway 或者 504 Gateway Time-out
一种情况是php产生了语法错误,比如循环调用、变量作用域错误、方法不存在等,如果开启错误日志输出的话,这种错误在php-fpm的错误日志中是可以看到调用栈信息的。
另外一种情况可能就是超时引起的php-fpm主动kill的情况,在php.ini和php.fpm中有两个配置项,用来管理php脚本的最大执行时间
当php脚本的执行时间超过这个时间时,PHP-FPM不只会终止脚本的执行,还会终止执行脚本的Worker进程。所以Nginx会发现与自己通信的连接断掉了,就会返回给客户端502错误。
以顶部的错误为例,当报502错误是,nginx的errorlog中有如下日志,:
所以只需将这两项的值调大一些就可以让PHP脚本不会因为执行时间长而被终止了。request_terminate_timeout可以覆盖max_execution_time,
所以如果不想改全局的php.ini,那只改PHP-FPM的配置就可以了。
此外要注意的是Nginx的upstream模块中的max_fail和fail_timeout两项。这两个配置表示在fail_timeout事件内,如果fail的测试达到max_fail,那么在接下来的fail_timeout时间内,Nginx都会认为上游服务器挂掉了,都会返回502错误。
所以可以将max_fail调大一些,将fail_timeout调小一些。
PHP-FPM设置的脚本最大执行时间已经够长了,但执行耗时PHP脚本时,发现Nginx报错从502变为504了。这是为什么呢?
因为php跑数据库总是504我们修改的只是PHP的配置,Nginx中也有关于与上游服务器通信超时时间的配置
以Nginx超时时间为90秒,PHP-FPM超时时间为300秒为例,报504 Gateway Timeout错误时的Nginx错误访问日志如下:
调高这三项的值(主要是read和send两项,默认不配置的话Nginx会将超时时间设为60秒)之后,504错误也解决了。
而且这三项配置可以配置在http、server级别,也可以配置在location级别。担心影响其php跑数据库总是504他应用的话,就配置在自己应用的location中吧。
要注意的是factcgi_connect/read/send_timeout是对FastCGI生效的,而proxy_connect/read/send_timeout是对proxy_pass生效的。
参考链接: 感谢分享php跑数据库总是504!
php跑数据库总是504的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于php数据库连接失败怎么办、php跑数据库总是504的信息别忘了在本站进行查找喔。







