11 февраля, 2012

Nginx open file limit

Думаю любой администратор, работавший с 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 должна дать рабочее значение.

Комментариев нет:

Отправка комментария