Недавно мы начали получать следующую ошибку в одном из наших ящиков nginx:
2011/05/25 16:35:51 [alert] 3580#0: accept() failed (24: Too many open files)
Проверяя /etc/security/limits.conf, мы получаем следующее:
* soft nofile 900000
* hard nofile 900000
но когда мы сделали cat / proc / {pid} / limits, он показал, что ограничение файла составляет 1024. Когда мы перезапустили nginx, проблема была исправлена, и / proc / {pid} / limits показал 900000. Я думаю, это могло быть вызвано потому что машина была перезагружена, и при загрузке nginx был запущен до того, как были применены ограничения. Однако все, что я читал о том, как работают лимиты и pam, предполагает, что на самом деле ulimit работает не так. Кто-нибудь знает, что здесь происходит?
Изменить: извините, следует упомянуть ОС и прочее. Мы запускаем CentOS с ядром 2.6.18-194.26.1.el5 и nginx 1.0.1
Этот отчет об ошибке похоже, подтверждает ваше первоначальное подозрение:
Это неправильный ответ на вопрос «как установить ulimit для процесса демона?» /etc/security/limits.d обрабатывается только pam_limits, у которого нет причин находиться в пути для запуска службы.
С другой стороны, при ручном перезапуске nginx наследует ограничения вашей оболочки.
Обходной путь: просто вызовите ulimit в initscript nginx. Вы не можете использовать ulimit -n
как обычный пользователь, но сценарий инициализации должен иметь достаточно прав при запуске при запуске.