nginx报错
nginx服务器访问量非常高,查看nginx的错误日志发现一直输出如下信息
2022-02-07 11:53:49 [alert] 13576#0: accept() failed (24: Too many open files)
2022-02-07 11:53:49 [alert] 13576#0: accept() failed (24: Too many open files)
2022-02-07 11:53:49 [alert] 13576#0: accept() failed (24: Too many open files)
2022-02-07 11:53:49 [alert] 13576#0: accept() failed (24: Too many open files)
2022-02-07 11:53:49 [alert] 13576#0: accept() failed (24: Too many open files)
2022-02-07 11:53:49 [alert] 13576#0: accept() failed (24: Too many open files)
2022-02-07 11:53:49 [alert] 13576#0: accept() failed (24: Too many open files)
2022-02-07 11:53:49 [alert] 13576#0: accept() failed (24: Too many open files)
2022-02-07 11:53:49 [alert] 13576#0: accept() failed (24: Too many open files)
2022-02-07 11:53:49 [alert] 13576#0: accept() failed (24: Too many open files)
根据日志输出的信息,我们知道因为打开的文件句柄太多,导致一直报错,那为什么会抱这个错误和如何解决呢?
问题分析过程
从输出日志我们基本能够确定导致nginx发生问题的原因,那是不是因为Nginx本身的问题呢?其实不全是,因为nginx无法打开这么多的文件句柄,首先在配置里我没有配置nginx能够打开的最大文件数,另外一个方面是因为cenots7系统本身对最大文件句柄数有限制,我也没有针对操作系统进行配置最大文件句柄数据,所以不全是Nginx才发生这些异常的。
在centos7服务器中,我们通过如下命令查看服务器默认配置的最大文件句柄数。
此时当nginx的连接数超过65536时,nginx的错误日志将会输出如下错误信息。
[alert] 13576#0: accept() failed (24: Too many open files)
问题解决方案
临时解决
将打开文件句柄数设置足够大。
ulimit -n 655360
同时修改nginx的配置文件,配置如下参数,注意:该配置要和error_log同级别。
error_log logs/error.log;
worker_rlimit_nofile 655350;
重启nginx,就可以解决nginx连接过多的问题,nginx就可以支持高并发,同时ulimit -n也会影响mysql的并发连接数,提高该值也会提高mysql的并发。
永久解决问题
如果我们想要让ulimits的数值永久生效,将ulimit命令放入/etc/profile里面或者修改/etc/security/limits.conf配置文件,修改里面的配置值
* soft nofile 655360
* hard nofile 655360
配置参数解释:
星号代表全局,soft为软件,hard为硬件,nofile为这里指可打开的文件句柄数。
注意:如果我们要想让limits.conf文件配置生效,要确保 pam_limits.so文件被加入到启动文件中。查看 /etc/pam.d/login 文件中是否存在如下配置。如果不存在,则需要添加上述配置项。
session required /lib64/security/pam\_limits.so