阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

解决Nginx出现“Too many open files”的问题

265次阅读
没有评论

共计 1842 个字符,预计需要花费 5 分钟才能阅读完成。




最近发现https://imgurl.org/ 自建 CDN 节点偶尔出现无法打开的情况,查看服务器负载不高,nginx 连接数大概在 1024 后就无法处理,按理说 nginx 处理 1024 左右的并发还是绰绰有余的,但就是出现无法打开的情况,查看 nginx 错误日志,出现大量的“Too many open files”错误,大致意思就是说 nginx 无法打开更多的文件,看来问题并不在并发数上面。

出现这个错误可能是由于系统的 ulimit 限制和 nginx 自身的配置有关系,先来了解下概念。

什么是 ulimit?

ulimit 命令用来限制系统用户对 shell 资源的访问。如果不懂什么意思,下面一段内容可以帮助你理解:

假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下,这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就会受到巨大的挑战。

ulimit 用于限制 shell 启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。

简单来说,ulimit 描述符可以对用户打开的文件数量进行限制(不止限制打开文件数量),让单个用户不至于打开较多的文件,导致系统奔溃或者资源不足的情况。

查看 ulimit

既然知道了 ulimit 是做什么的,首先要先知道系统底层限制到底是多少,ulimit 的参数如下:

-a:显示目前资源限制的设定;-c <core 文件上限 >:设定 core 文件的最大值,单位为区块;-d < 数据节区大小 >:程序数据节区的最大值,单位为 KB;-f < 文件大小 >:shell 所能建立的最大文件,单位为区块;-H:设定资源的硬性限制,也就是管理员所设下的限制;-m < 内存大小 >:指定可使用内存的上限,单位为 KB;-n < 文件数目 >:指定同一时间最多可开启的文件数;-p < 缓冲区大小 >:指定管道缓冲区的大小,单位 512 字节;-s < 堆叠大小 >:指定堆叠的上限,单位为 KB;-S:设定资源的弹性限制;-t <CPU 时间 >:指定 CPU 使用时间的上限,单位为秒;-u < 程序数目 >:用户最多可开启的程序数目;-v < 虚拟内存大小 >:指定可使用的虚拟内存上限,单位为 KB。

由于上述 nginx 错误是无法打开过多的文件,那么我们直接使用 ulimit -n 查看同一时间最多可开启的文件数。

[root@bwh-cdn conf]# ulimit -n
1024

从上述命令可以看出限制的 1024 个文件,这就导致 nginx 尝试打开更多的文件(超出 1024 个)的时候出现错误“Too many open files”

解决办法

修改 ulimit 限制

直接执行命令 ulimit -n 65535 修改打开文件数,65535指的是需要同一时间最多打开多少个文件,请根据自身情况适当修改。

ulimit 命令修改只对当前的 shell 有效,退出后失效,如果需要永久生效,需要修改 /etc/security/limits.conf 这个文件,在底部加入下面的配置:

* soft nproc 65535
* hard nproc 65535
* soft nofile 65535 
* hard nofile 65535
  • *:代表全局
  • soft:代表软件
  • hard:代表硬件
  • nproc:是代表最大进程数
  • nofile:是代表最大文件打开数

修改完毕后,再次执行命令:ulimit -n可以看到设置已经生效:

[root@rakcdn conf]# ulimit -n
65535

修改 nginx 打开文件限制

修改 nginx.conf 加入一行,并重载 nginx 配置:nginx -s reload

worker_rlimit_nofile 65535;

worker_rlimit_nofile 这个参数的含义是:“为 nginx 工作进程改变打开最多文件描述符数目的限制。用来在不重启主进程的情况下增加限制。”

总结

上述操作修改了 2 个地方,一个是 ulimit 限制,一个是 nginx 的 worker_rlimit_nofile 限制。修改后 nginx 读取更多的文件轻轻松松。

此文部分内容参考了:

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-22发表,共计1842字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中