Доброго времени суток, читатель. Появилось свободное время, которое совпало с желанием написать небольшую заметку.
Итак, имеем nginx, проксирующий много траффика на бэкэнды. В какое то время трафика стало много настолько, что в error.log nginx’a стали сыпаться сообщения вида:
accept4() failed: Too many open files
Собственно вроде бы все просто, нужно увеличить лимиты открываемых файлов для nginx, но получилось не так быстро. Подробности ниже
Сначала пробовал как и все увеличить лимиты в
/etc/security/limits.conf
Добавил в конец файла строку
* hard nofile 8192
Перезагрузился и.. И ничего не произошло. Не произошло потому, что на пользователя root и процессы запущенные от него такая конструкция не повлияет и надо записывать в таком формате:
root hard nofile 8192
либо
root - nofile 8192
Если мы запишем с символом ‘*’ то лимиты применятся только на пользователей отличных от root.
Но в то время этого я не знал и поэтому продолжил в данном ключе изучение проблемы. Потом было решено подправить лимиты и в systemd, если юниты запускаются не через sysinit, то в принципе логично. Открываем
/etc/systemd/system.conf
и раскоменчивая строку, добавляем
DefaultLimitNOFILE=8192
эту же строчку пропишем и в
/etc/systemd/user.conf
Перезагружаемся
ulimit -Hn 8192
Да, это сработало
А теперь nginx. Так как сначала, все это затевалось вообще ради nginx и ошибки
accept4() failed: Too many open files
напишу как увеличить лимиты исключительно для nginx. В конфиге nginx
/etc/nginx/nginx.conf
добавляем строчку
worker_rlimit_nofile 16384;
и перезапускаем nginx. Все!