web-dev-qa-db-ja.com

nginx / Passengerアプリのファイル記述子の制限

Ubuntu14.04で実行されているPassenger4.0.45およびnginx1.6.0(Passengerインストーラーによってインストールされた)でRailsアプリを実行しています。高負荷の場合、Passengerはすべてのアプリケーションプロセスを再起動します。有効にした後パッセンジャーデバッグログで、パッセンジャーログに「クライアントを受け入れることができません:開いているファイルが多すぎます(errno = 24)」エラーが見つかりました。

Nginxは「worker_rlimit_nofile200000」で構成されています。 cat /proc/pid/limitsを使用してnginxに正しい制限があることを確認できます。ただし、Passengerで実行されているRailsアプリは、上限を取得していません。

すべてのユーザーに上限を与えるために/etc/security/limits.confに追加し、session required pam_limits.soと/ etc/pam.d/common-session-noninteractive`の両方に/etc/pam.d/common-sessionを追加しました。再起動しました。

走れる

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

そして私は高い数を取得します。

最後に、イニシャライザーに以下を追加して、Railsアプリ内で制限を設定しようとしました:

Process.setrlimit(Process::RLIMIT_NOFILE, 65535)

結果は次のとおりです。

Operation not permitted - setrlimit (Errno::EPERM)
2
Robin Daugherty

この問題を解決するためにPhusionから助けを得たので、これが私が思いついた解決策です。 nginxがUbuntuで起動すると、initスクリプトは/etc/default/nginxを探し、そこで見つかったコマンドを実行してから、実際にnginxを起動します。

したがって、(上記の制限設定に加えて)次の内容で/etc/default/nginxを追加します。

ulimit -Hn 200000
ulimit -Sn 200000

その後、nginxを再起動し、問題を修正しました。これは、nginxと、PassengerHelperAgentおよびRailsプロセスを含む、すべての乗客プロセスに適用されます。

1
Robin Daugherty