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)
この問題を解決するためにPhusionから助けを得たので、これが私が思いついた解決策です。 nginxがUbuntuで起動すると、initスクリプトは/etc/default/nginx
を探し、そこで見つかったコマンドを実行してから、実際にnginxを起動します。
したがって、(上記の制限設定に加えて)次の内容で/etc/default/nginx
を追加します。
ulimit -Hn 200000
ulimit -Sn 200000
その後、nginxを再起動し、問題を修正しました。これは、nginxと、PassengerHelperAgentおよびRailsプロセスを含む、すべての乗客プロセスに適用されます。