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

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