Назад | Перейти на главную страницу

Ограничение файлового дескриптора в приложении nginx / Passenger

Мы запускаем приложение 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.