Думаю любой администратор, работавший с Nginx в Debian/Ubuntu под большой нагрузкой, сталкивался с сообщением «failed (24: Too many open files)» в логах. По дефолту в Debian лимит на количество открытых файлов равен 1024, по странному стечению обстоятельств лимит конектов у Nginx так же равен 1024. Очевидно, что сервер будет использовать файловые дескрипторы не только для соединения с клиентом, но и для загрузки библиотек, работы с логами, чтения статики или соединения с бэкендом. Естественно Nginx упирается в лимит файловых дескрипторов раньше, чем в лимит соединений.
К сожалению, не все знают как правильно бороться с этой проблемой. Наихудший путь - правка /etc/init.d/nginx, а бесполезный - правка /etc/security/limits.conf. Думаю, причины по которым не стоит править скрипты инициализации очевидны. Правка limits.conf не поможет, потому что это конфигурационный файл PAM, а он в запуске Nginx не участвует.
Универсальный метод - правка /etc/default/nginx, он будет работать с другими демонами, например OpenFire (естественно, править надо будет /etc/default/openfire). Добавим в файл строку:
ulimit -n 4048
проверим:
root@server:/etc# ps axu | grep nginx root 14572 0.0 0.0 30188 924 ? Ss 22:45 0:00 nginx: master process /usr/sbin/nginx www-data 14573 0.0 0.1 30576 1496 ? S 22:45 0:00 nginx: worker process root 14575 0.0 0.0 7568 868 pts/6 S+ 22:45 0:00 grep nginx root@lab:/etc# cat /proc/14573/limits *** Max open files 4048 4048 files ***
Способ второй, нативный. Nginx может поменять лимиты самостоятельно, достаточно воспользоваться директивой worker_rlimit_nofile.
Не забываем, что worker_rlimit_nofile должен быть больше, чем worker_connections. Формула worker_rlimit_nofile = worker_connections * 2 + 32 должна дать рабочее значение.
Комментариев нет:
Отправить комментарий