При небольшой ddos атаке на сервер с CentOS в логе nginx стали появляться ошибки «failed (24: Too many open files)»
Стал вопрос об увеличении лимитов, тем более, что процессов было не много, памяти свободной достаточно, своп на нуле и процессор не был нагружен на 100%.
Решено было увеличить лимиты для nginx.
В сети нашлось неплохое решение. Используя его, а так же гугл, было пройден следующий путь :).
Определить текущее положение дел в системе, можно, давая команду:
for pid in `pidof nginx`; do echo "$(< /proc/$pid/cmdline)"; egrep 'files|Limit' /proc/$pid/limits; echo "Currently open files: $(ls -1 /proc/$pid/fd | wc -l)"; echo; done
В результате мы получаем отчет о количестве открытых файлов и текущих пределах.
1. Операционная система устанавливает некоторые лимиты на количество одновременно открытых файлов. Делается это с целью экономии памяти и ресурсов процессора, так как каждый открытый файл - это дополнительный дискриптор, под который отводится память. Мы можем самостоятельно устанавливать лимиты на количество открытых файлов, редактируя /etc/sysctl.conf:
# mcedit /etc/sysctl.conf
Добавляем в него строку
fs.file-max = 65535
Следом редактируем файл /etc/security/limits.conf:
# mcedit /etc/security/limits.conf
В нем мы устанавливаем мягкий и жестки лимиты для nginx:
nginx soft nofile 10000
nginx hard nofile 30000
Сохраняем оба файла и применяем изменения:
# sysctl -p
2. Все, что требовалось для ОС мы сделали, теперь обратимся к nginx:
Редактируем файл /etc/nginx/nginx.conf
# mcedit /etc/nginx/nginx.conf
Добавляем туда:
worker_rlimit_nofile 30000;
И делаем рестарт nginx:
# service nginx restart