nginx/Passenger 应用程序中的文件描述符限制

nginx/Passenger 应用程序中的文件描述符限制

我们在 Ubuntu 14.04 上运行 Passenger 4.0.45 和 nginx 1.6.0(由 Passenger 安装程序安装)中的 Rails 应用程序。在高负载下,Passenger 会重新启动所有应用程序进程。启用 Passenger 调试日志后,我在 Passenger 日志中发现“无法接受客户端:打开的文件太多(errno=24)”错误。

Nginx 配置为“worker_rlimit_nofile 200000”。使用cat /proc/pid/limits我可以确认 nginx 具有正确的限制。但是,我们在 Passenger 中运行的 Rails 应用程序没有获得更高的限制。

我已经添加到/etc/security/limits.conf为所有用户提供高限制,并且我已经添加到session required pam_limits.so/etc/pam.d/common-session/etc/pam.d/common-session-noninteractive` 并重新启动。

我可以跑

su appuser --shell /bin/bash --command "ulimit -n"

我得到了一个很高的数字。

我最终尝试通过在初始化程序中添加以下内容来在 Rails 应用程序中设置限制:

Process.setrlimit(Process::RLIMIT_NOFILE, 65535)

结果是:

Operation not permitted - setrlimit (Errno::EPERM)

答案1

我得到了 Phusion 的帮助来解决这个问题,所以这是我想到的解决方案。当 nginx 在 Ubuntu 上启动时,init 脚本会/etc/default/nginx在实际启动 nginx 之前查找并运行在那里找到的命令。

因此(除了上述限制设置之外)还添加/etc/default/nginx以下内容:

ulimit -Hn 200000
ulimit -Sn 200000

然后重新启动 nginx,问题就解决了。这适用于 nginx 和所有乘客进程,包括 PassengerHelperAgent 和 Rails 进程。

相关内容