我们在运行在Ubuntu 14.04上的Passenger 4.0.45和nginx 1.6.0(由Passenger安装程序安装)中运行Rails应用程序。 Passenger重载重载所有的应用程序进程。 启用乘客debugging日志后,我发现乘客日志中的“不能接受客户端:太多打开的文件(errno = 24)”错误。
Nginxconfiguration了“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)
我从Phusion那里得到了一些帮助来解决这个问题,所以这里是我提出的解决scheme。 当nginx在Ubuntu上启动时,init脚本查找/etc/default/nginx
并在实际启动nginx之前运行在那里find的命令。
所以(除了上面的限制设置)添加/etc/default/nginx
与以下内容:
ulimit -Hn 200000 ulimit -Sn 200000
然后重新启动nginx,修复了这个问题。 这适用于nginx和所有乘客进程,包括PassengerHelperAgent和Rails进程。