本篇文章是对 Nginx502BadGateway 错误的解决方法进行了详细的分析介绍, 需要的朋友参考下
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 设置成 0s0s 的含义是让 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 的相关设置
10
60s
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 确保和此数值一致
- 10240
- 65500
- 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 的配置生效
到目前为止还没有出现过以上的报错信息一切运行正常
来源: https://www.php1.cn/detail/php-f7fdaa956c.html