我们在 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 进程。