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

一.现象
网站报 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,运维准入
运维准入要有,运维指导、限制、明确代码执行时间,编码规范。从团队管理上,要对运维和开发角色设置 连带责任,落实,推动,保证稳定性。

猜你喜欢

转载自blog.csdn.net/longxibendi/article/details/51685178
今日推荐