网站报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,运维准入
运维准入要有,运维指导、限制、明确代码执行时间,编码规范。从团队管理上,要对运维和开发角色设置 连带责任,落实,推动,保证稳定性。
网站报 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,运维准入
运维准入要有,运维指导、限制、明确代码执行时间,编码规范。从团队管理上,要对运维和开发角色设置 连带责任,落实,推动,保证稳定性。
相关文章推荐
- Ubuntu 14.04 LTS 安装 LNMP Nginx\PHP5 (PHP-FPM)\MySQL
- LNMP源码安装(RHEL)
- CentOS6 编译安装LNMP步骤
- 网站502与504错误分析
- 一个简洁的全自动安装LNMP服务器环境的Shell脚本分享
- LNMP下防跨站、跨目录的安全设置,仅支持PHP5.3.3以上版本
- 深入探讨:Nginx 502 Bad Gateway错误的解决方法
- lnmp关闭mysql日志保护硬盘空间的方法
- 在Debian系统下配置LNMP的教程
- VPS中使用LNMP安装WordPress教程
- VPS CentOS-6 下 LNMP HTTP web服务器的搭建步骤
- LAMP&LNMP自动化安装脚本代码
- linux服务器下LNMP安装与配置方法
- 腾讯云主机安装LNMP环境及wordpress教程
- lnmp下如何关闭Mysql日志保护磁盘空间
- 阿里云Centos7安装LNMP+wordpress
- 502 bad gateway是什么意思 502 bad gateway错误解决方法
- 阿里云主机一键安装lamp、lnmp环境的shell脚本分享
- LNMP服务器环境配置 (linux+nginx+mysql+php)
- 基于LNMP搭建Typecho博客平台