我们最近在我们的一个 nginx 盒子上开始出现以下错误:
2011/05/25 16:35:51 [alert] 3580#0: accept() failed (24: Too many open files)
检查 /etc/security/limits.conf,我们有以下内容:
* soft nofile 900000
* hard nofile 900000
但是当我们执行 cat /proc/{pid}/limits 时,它显示文件限制为 1024。当我们重新启动 nginx 时,问题已解决,/proc/{pid}/limits 显示为 900000。我想这可能是因为机器重新启动,并且在启动时 nginx 在应用限制之前启动。但是,我读到的有关限制和 pam 如何工作的所有内容都表明 ulimits 的工作方式并非如此。有人知道这是怎么回事吗?
编辑:抱歉,应该提到操作系统和其他东西。我们运行的是 CentOS,内核为 2.6.18-194.26.1.el5,以及 nginx 1.0.1
答案1
此错误报告似乎证实了你最初的怀疑:
这是对“如何为守护进程设置 ulimits?”这个问题的错误回答。/etc/security/limits.d 仅由 pam_limits 处理,它没有理由位于服务启动路径中。
另一方面,在手动重启时,nginx 会从您的 shell 继承限制。
解决方法:只需在 nginx 初始化脚本中调用 ulimit。您不能ulimit -n
以普通用户身份使用,但初始化脚本在启动时运行时应该具有足够的权限。