最近遇到一个奇怪的Nginx 502 Bad Gateway问题,经检查设置都很正常,但就是网站运行1-2天后自动502,头大了一圈,昨天无意间检查php-fpm的日志,发现了很多报错
Jun 23 07:44:10.440697 [NOTICE] fpm_children_make(), line 352: child 18460 (pool default) started
类似与这样的,查过网上的资源,认为是php线程打开文件句柄受限导致的错误。具体的解决的办法如下:
1、提升服务器的文件句柄打开打开
# vi /etc/security/limits.conf 末尾加上
* soft nofile 51200
* hard nofile 51200
2、提升nginx的进程文件打开数
nginx.conf 修改
worker_rlimit_nofile 51200;
events
{
use epoll;
worker_connections 51200;
}
3、修改php-fpm.conf文件,主要需要修改2处。
命令 ulimit -n 查看限制的打开文件数,php-fpm.conf 中的选项rlimit_files 确保和此数值一致。
<value name="max_requests">10240</value>
<value name="rlimit_files">51200</value>
4、指定可以分配的文件句柄的最大数目
# vi /etc/sysctl.conf 末尾添加
fs.file-max=51200
其中51200也可以改为其他数字,一般引用51200和65535,完成以上修改,重启PHP,再次检查php-fpm日志不再增加,502 Bad Gateway也消失了,OK搞定。
附ulimit修改方式:
使用ulimit -a 可以查看当前系统的所有限制值,使用ulimit -n 可以查看当前的最大打开文件数。
新装的linux默认只有1024,当作负载较大的服务器时,很容易遇到error: too many open files。因此,需要将其改大。
使用 ulimit -n 65535 可即时修改,但重启后就无效了。(注ulimit -SHn 65535 等效 ulimit -n 65535,-S指soft,-H指hard)
有如下三种修改方式:
1.在/etc/rc.local 中增加一行 ulimit -SHn 65535
2.在/etc/profile 中增加一行 ulimit -SHn 65535
3.在/etc/security/limits.conf最后增加如下两行记录
* soft nofile 65535
* hard nofile 65535
具体使用哪种,试试哪种有效吧,我在 CentOS中使用第1种方式无效果,使用第3种方式有效果,而在Debian中使用第2种有效果
文章评论