深入探讨:Nginx 502 Bad Gateway错误的解决方法


Posted in PHP onJune 03, 2013

max_children=40 , 每个children平均占用20M-30M内存,children越多,可以同时接受的并发数量越多,一般children的值是网站最高并发数+浮动值,这值再×内存占用,就是你需要用到的内存。
max_requests = N 是指当每个children接受了N次请求以后,就会把自己杀死,然后重新建立一个children。
PV / max_children = 每一个children接受的request次数[ 默认预设浏览一个只调用一次PHP程序,或许异步调用呢?接口呢?]
比如上面的值是1000,而你定义的是10240,那么fpm要超过10天才能杀死children并重建,这样如果存在内存泄露的话,就会导致进程占用过多的内存而无法释放,从而使fpm的处理能力降低,还会产生一些莫名其妙的错误。
但是如果你把这个值设置的过小,fpm频繁的杀死children并重建,也会导致额外的开销。
最好的优化当然是根据你网站的运行情况,去不断的调试,找到一个平衡点。
针对max_children还有一个偷懒的做法,如果你的php是5.3,那么你可以把fpm的style设置为apache-like,这个时候children的数量就由fpm自动控制。相应的配置参数是
start_servers:起始进程数量
min_spare_servers:最小进程数量
max_spare_servers:最大进程数量
当服务器比较空闲的时候,fpm会主动杀死一些多余的children,用来节约资源,当服务器繁忙的时候,服务器会自动建立更多的children。
#########################
Nginx 502 Bad Gateway的含义是请求的PHP-CGI已经执行,但是由于某种原因(一般是读取资源的问题)没有执行完毕而导致PHP-CGI进程终止,
一般来说Nginx 502 Bad Gateway和php-fpm.conf的设置有关。
php-fpm.conf有两个至关重要的参数,一个是max_children,
另一个是request_terminate_timeout,但是这个值不是通用的,而是需要自己计算的。
在安装好使用过程中出现502问题,一般是因为默认php-cgi进程是5个,可能因为phpcgi进程不够用而造成502,需要修改/usr/local/php/etc/php-fpm.conf 将其中的max_children值适当增加。
计算的方式如下:

如果你的服务器性能足够好,且宽带资源足够充足,PHP脚本没有死循环或BUG的话你可以直接将 request_terminate_timeout设置成0s。0s的含义是让PHP-CGI一直执行下去而没有时间限制。而如果你做不到这一点,也就 是说你的PHP-CGI可能出现某个BUG,或者你的宽带不够充足或者其他的原因导致你的PHP-CGI假死那么就建议你给request_terminate_timeout赋一个值,这个值可以根据服务器的性能进行设定。一般来说性能越好你可以设置越高,20分钟-30分 钟都可以。

而max_children这个值又是怎么计算出来的呢?这个值原则上是越大越好,php-cgi的进程多了就会处理的很快,排队的请求就会很少。 设置max_children也需要根据服务器的性能进行设定,
一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右。
按照官方的答案,排查了相关的可能,并结合了网友的答案,得出了下面的解决办法。
1、查看php fastcgi的进程数(max_children值)
代码:netstat -anpo | grep “php-cgi” | wc -l
5(假如显示5)
2、查看当前进程
代码:top
观察fastcgi进程数,假如使用的进程数等于或高于5个,说明需要增加(根据你机器实际状况而定)
3、调整/usr/local/php/etc/php-fpm.conf 的相关设置
<value name=”max_children”>10</value>
<value name=”request_terminate_timeout”>60s</value>
max_children最多10个进程,按照每个进程20MB内存,最多200MB。
request_terminate_timeout执行的时间为60秒,也就是1分钟。
#################################################
网站运行环境是Nginx +php fastcgi模式的。这几天运行一直不稳定,总是出错,报502错误。
今天跟以前的同事请教了一下,他告诉我检查一下php-fpm的日志,那里记录了很多有用的信息。
于是我检查了一下,发现确实有很多报错信息:
Sep 30 08:32:23.289973 [NOTICE] fpm_unix_init_main(), line 271: getrlimit(nofile): max:51200, cur:51200
如果和nginx.conf : worker_rlimit_nofile 65500; 不一致必须检查,设置重启服务
Mar 01 14:39:15.881047 [NOTICE] fpm_children_make(), line 352: child 12364 (pool default) started
Mar 01 14:39:21.715825 [NOTICE] fpm_got_signal(), line 48: received SIGCHLD
Mar 01 14:39:21.715899 [NOTICE] fpm_children_bury(), line 215: child 11947 (pool default) exited with code 0 after 175.443305 seconds from start

 
有的报错信息,就好说了,直接上网查信息。
经过搜索,最后总结出以下几条优化策略:
1、提升服务器的文件句柄打开打开
# vi /etc/security/limits.conf 加上
* soft nofile 65500
* hard nofile 65500
2、提升nginx的进程文件打开数
nginx.conf : worker_rlimit_nofile 65500;
3、修改php-fpm.conf文件,主要需要修改2处。
命令 ulimit -n 查看限制的打开文件数,php-fpm.conf 中的选项rlimit_files 确保和此数值一致。
<value name=”max_requests”>10240</value>
<value name=”rlimit_files”>65500</value>
4、
# vi /etc/sysctl.conf
底部添加
fs.file-max=65500
经过以上修改,重启PHP。/usr/local/webserver/php/sbin/php-fpm restart
在查看ulimit -n 是否生效,否则重启服务器或者/etc/sysctl.conf、/etc/security/limits.conf的配置生效
到目前为止还没有出现过以上的报错信息。一切运行正常。

PHP 相关文章推荐
php中通过smtp发邮件的类,测试通过
Jan 22 PHP
PHP添加MySQL数据记录代码
Jun 07 PHP
PHP使用ob_start生成html页面的方法
Nov 07 PHP
Laravel 5.0 发布 新版本特性详解
Feb 10 PHP
php通过asort()给关联数组按照值排序的方法
Mar 18 PHP
php通过baihui网API实现读取word文档并展示
Jun 22 PHP
PHP+Mysql+Ajax实现淘宝客服或阿里旺旺聊天功能(前台页面)
Jun 16 PHP
php格式文件打开的四种方法
Feb 24 PHP
Laravel中9个不经常用的小技巧汇总
Apr 16 PHP
php输出反斜杠的实例方法
Sep 19 PHP
解决php扩展安装不生效问题
Oct 25 PHP
PHP连接MySQL数据库的三种方式实例分析【mysql、mysqli、pdo】
Nov 04 PHP
深入php-fpm的两种进程管理模式详解
Jun 03 #PHP
PHP 异步执行方法,模拟多线程的应用分析
Jun 03 #PHP
基于PHP异步执行的常用方式详解
Jun 03 #PHP
php生成二维码的几种方式整理及使用实例
Jun 03 #PHP
深入PHP异步执行的详解
Jun 03 #PHP
php实现自动获取生成文章主题关键词功能的深入分析
Jun 03 #PHP
基于MySQL到MongoDB简易对照表的详解
Jun 03 #PHP
You might like
PHP 抓取新浪读书频道的小说并生成txt电子书的代码
2009/12/18 PHP
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
2013/06/18 PHP
php中文字符串截取方法实例总结
2014/09/30 PHP
Laravel SQL语句记录方式(推荐)
2016/05/26 PHP
Laravel-添加后台模板AdminLte的实现方法
2019/10/08 PHP
Javascript 异步加载详解(浏览器在javascript的加载方式)
2012/05/20 Javascript
js实现图片轮换效果代码
2013/04/16 Javascript
js给onclick赋值传参数的两种方法
2013/11/25 Javascript
jquery如何通过name名称获取当前name的value值
2013/12/20 Javascript
JavaScript实现数据类型的相互转换
2016/03/06 Javascript
JavaScript学习笔记之取数组中最大值和最小值
2016/03/23 Javascript
js和jq使用submit方法无法提交表单的快速解决方法
2016/05/17 Javascript
JavaScript中实现键值对应的字典与哈希表结构的示例
2016/06/12 Javascript
Three.js学习之Lamber材质和Phong材质
2016/08/04 Javascript
详解使用JS如何制作简单的ASCII图与单极图
2017/03/31 Javascript
javascript数据结构之串的概念与用法分析
2017/04/12 Javascript
vue实现组件之间传值功能示例
2018/07/13 Javascript
jquery3和layui冲突导致使用layui.layer.full弹出全屏iframe窗口时高度152px问题
2019/05/12 jQuery
vue-router 路由传参用法实例分析
2020/03/06 Javascript
JavaScript实现猜数字游戏
2020/05/20 Javascript
JavaScript实现前端倒计时效果
2021/02/09 Javascript
使用Python下的XSLT API进行web开发的简单教程
2015/04/15 Python
Python实现带参数与不带参数的多重继承示例
2018/01/30 Python
Django自定义用户认证示例详解
2018/03/14 Python
python处理document文档保留原样式
2019/09/23 Python
keras导入weights方式
2020/06/12 Python
html5 canvas里绘制椭圆并保持线条粗细均匀的技巧
2013/03/25 HTML / CSS
Javascript 高级手势使用介绍
2013/04/21 HTML / CSS
Champs Sports加拿大:北美最大的以商场为基础的专业运动鞋和服装零售商之一
2018/05/01 全球购物
英国手机零售商:Carphone Warehouse
2018/06/06 全球购物
Funko官方商店:源自美国,畅销全球搪胶收藏玩偶
2018/09/15 全球购物
竞选班干部演讲稿
2014/04/24 职场文书
Anaconda配置各版本Pytorch的实现
2021/08/07 Python
关于Oracle12C默认用户名system密码不正确的解决方案
2021/10/16 Oracle
Python 居然可以在 Excel 中画画你知道吗
2022/02/15 Python
MySQL 数据库范式化设计理论
2022/04/22 MySQL