Мы запускаем приложение Rails в Passenger 4.0.45 и nginx 1.6.0 (установленное установщиком Passenger), работающее в Ubuntu 14.04. При большой нагрузке Passenger перезапускает все процессы приложения. После включения журналов отладки пассажиров я обнаружил в журналах пассажиров ошибки «Невозможно принять клиента: слишком много открытых файлов (errno = 24)».
Nginx настроен с "worker_rlimit_nofile 200000". С помощью cat /proc/pid/limits
Я могу подтвердить, что nginx имеет правильные ограничения. Однако наше приложение Rails, работающее в Passenger, не получает более высоких ограничений.
Я добавил к /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 решить эту проблему, так что вот решение, которое я придумал. Когда nginx запускается в Ubuntu, сценарий инициализации ищет /etc/default/nginx
и запускает найденные там команды до фактического запуска nginx.
Итак (в дополнение к настройкам ограничений выше) добавление /etc/default/nginx
со следующим содержанием:
ulimit -Hn 200000
ulimit -Sn 200000
а затем перезапустив nginx, проблема была исправлена. Это относится к nginx и всем процессам-пассажирам, включая PassengerHelperAgent и процессы Rails.