Nginx Too many open files;limite

报错日志

2019/07/25 08:31:31 [crit] 15929#15929: accept4() failed (24: Too many open files)
2019/07/25 08:31:31 [crit] 15930#15930: accept4() failed (24: Too many open files)
2019/07/25 08:31:31 [crit] 15930#15930: accept4() failed (24: Too many open files)
2019/07/25 08:31:31 [crit] 15930#15930: accept4() failed (24: Too many open files)

原因

出现这个错误可能是由于系统的ulimit限制和nginx自身的配置有关系,先来了解下概念。
什么是ulimit?
ulimit命令用来限制系统用户对shell资源的访问。如果不懂什么意思,下面一段内容可以帮助你理解:
假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下,这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就会受到巨大的挑战。
ulimit 用于限制 shell 启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。
简单来说,ulimit描述符可以对用户打开的文件数量进行限制(不止限制打开文件数量),让单个用户不至于打开较多的文件,导致系统奔溃或者资源不足的情况。

解决

修改系统 limit 限制

# 修改系统limit限制
vim /etc/security/limits.conf
# open files  (-n)
* soft nofile 65536
* hard nofile 65536

# max user processes   (-u)
* soft nproc 65565
* hard nproc 65565
# 退出登录重新连接查看参数配置
ulimite -a

如果某一项没有生效,在/etc/security/limits.d下的文件里设置,此文件中的配置会覆盖1中的文件,例如

*          soft    nproc     65565

如果还没生效,直接重启;

修改 nginx配置

# 修改了系统的 max open files,并不代表nginx的
# 先查看 nginx 的 ulimits:
grep 'open files' /proc/$( cat /var/run/nginx.pid )/limits

# 修改 nginx.conf,
# 添加:以下两点
worker_rlimit_nofile 65535; # (has to be smaller or equal to LimitNOFILE set above)
events {
    worker_connections  65535;
}

# 修改 nginx.service
sudo vim /lib/systemd/system/nginx.service # (仅适用于 ubuntu)
# 添加如下:
[Service]
LimitNOFILE=65535

# 重启服务:
sudo systemctl daemon-reload
sudo systemctl restart nginx
posted @ 2022-12-26 13:27  Star-Hitian  阅读(81)  评论(0编辑  收藏  举报