您的位置:首页 > 运维架构 > 网站架构

网站报502、504错误---lnmp

2016-06-15 20:44 537 查看
一.现象

网站报 502,504

一般502和504会同时出现,在高并发的情况下。

502 表示 php执行过长, 

504 表示 后端php cgi 子进程不够用 

二.原因

很容易理解,php cgi不够用了,为什么不够用了,某些php执行时间太长,占用大量的cgi资源。

举个例子,

1个php执行时间,200ms,

那么 1个php cgi可以 给 5个php服务/秒 。

那么,5个php程序,占用1个php cgi。

如果1个php 执行时间,30s,

那么,1个php程序,占用30个php cgi。

服务端的处理能力自然下降,这时,502、504会不断出现。

在并发度小于php cgi进程数的情况下,某些php执行时间长,没问题。因为资源没占满。(实际情况很复杂,比如cpu,io,mem,net,conn,fd,都算资源,这里先不考虑)

在并发度高于php cgi进程数的情况下,就会报502,504。

三.解决

解决思路,从以下几个方面入手,可以采用1个或者多个方案解决

1,资源限制 


1.1要求php程序中,通过配置 ini_set('max_execution_time', $exe_time); //exe_time是允许执行这个php的最长时间。

这样通过程序中控制每个php执行时长。

1.2在php.ini中,配置 max_execution_time 参数,建议配置成3 ;表示允许每个php执行时间为3s。超过3s就执行失败了,回报50x错误。

1.3在php-fpm.conf中,配置 request_terminate_timeout 参数,建议配置成60;这个是 php cgi,php version >=5.4之后,php cgi,对应的server,就是php-fpm。php-fpm对php 进行解析,执行。

这个配置是绝对影响的,也就说,即使 程序中,配置了 ini_set('max_execution_time', $exe_time);或者 php.ini中配置了max_execution_time;最终都由 php-fpm的request_terminate_timeout 参数决定 php的运行时长。

因为它是server端。

1.4在php.ini中的 sql.safe_mode 参数,这个参数如果打开(on),那么php程序中,使用ini_set('max_execution_time', $exe_time) 将不起作用。

2,资源隔离

针对不同的业务,有的业务需要php执行时间长,有的执行时间短,可以针对不同业务,启动不同的php-fpm,这样保证各个业务,php cgi的服务是隔离的,出问题只影响自身的业务。

3,优化

优化是多方面的,简单说

3.1可以通过php-fpm日志中,找出哪些slow query,php-fpm.conf中 request_slowlog_timeout 、slowlog、access.log
可以配置,之后通过pid及php文件名就能定位出哪些函数执行慢。之后可以做优化。

3.2可以通过xhprof 打日志,或者输出信息,做优化。一般3.1就够了

3.3可以通过程序打日志,不断定位出,是执行数据库查询/写入慢,还是其他原因,一层一层都能找到。

4,运维准入

运维准入要有,运维指导、限制、明确代码执行时间,编码规范。从团队管理上,要对运维和开发角色设置 连带责任,落实,推动,保证稳定性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lnmp 502 504