Nginx Error: epoll_create() failed (24: Too many open files) — Решение
Веб-сервер перестает принимать новые клиентские подключения или падает при перезагрузке рабочих процессов. В системном журнале error.log регистрируется критическая ошибка исчерпания файловых дескрипторов: epoll_create() failed (24: Too many open files) или socket() failed (24: Too many open files) while connecting to upstream.
| Уровень лимита | Конфигурационный файл | Следствие превышения |
|---|---|---|
| Процесс Nginx | worker_rlimit_nofile | Воркер не может открыть дескрипторы для epoll и сокетов |
| Systemd Service | LimitNOFILE=65535 | Systemd принудительно обрезает лимиты процессов сервиса |
| Пользователь ОС | /etc/security/limits.conf | Пользователи www-data / nginx ограничены значением 1024 |
- Новые клиенты получают таймауты подключения (Connection timed out) или сброс TCP-сессий (Connection reset by peer).
- Команда
nginx -tможет завершаться успешно, но мастер-процесс не способен породить рабочие воркеры.
- Увеличьте лимит открытых файлов в главном контексте конфигурации
/etc/nginx/nginx.conf:# Директива должна находиться на самом верхнем уровне файла (вне блоков http/events): worker_rlimit_nofile 65535; events { worker_connections 16384; } - Скорректируйте лимиты службы Nginx в systemd с помощью переопределения (override):
sudo systemctl edit nginx.service # Внесите следующие строки: [Service] LimitNOFILE=65535 - Установите системные лимиты для учетных записей веб-сервера в
/etc/security/limits.conf:nginx soft nofile 65535 nginx hard nofile 65535 www-data soft nofile 65535 www-data hard nofile 65535 - Примените параметры systemd и полностью перезапустите службу веб-сервера:
sudo systemctl daemon-reload sudo systemctl restart nginx - Проверьте реальные действующие лимиты работающего процесса:
cat /proc/$(pgrep -f "nginx: worker" | head -n 1)/limits | grep "Max open files"
worker_connections не может превышать значение worker_rlimit_nofile. Для корректной работы всегда задавайте worker_rlimit_nofile как минимум в два раза больше, чем worker_connections.Частые вопросы (FAQ)
Что означает ошибка ядра (24: Too many open files)?
Это системная ошибка EMFILE. Она возникает, когда конкретный рабочий процесс исчерпал выделенный ему лимит файловых дескрипторов (включающих сетевые сокеты, файлы логов и epoll instances).
Почему правки в /etc/security/limits.conf не действуют на Nginx?
Службы, управляемые systemd, игнорируют настройки limits.conf (модуль PAM). Для них лимиты ресурсов задаются исключительно через директиву LimitNOFILE в unit-файле systemd.
Сколько файловых дескрипторов нужно на одно HTTP-соединение?
Для простого статического файла требуется минимум 2 дескриптора (сокет клиента + файл на диске). Для reverse-proxy соединения — минимум 2 сокета (клиент + бэкенд).
Как узнать текущее число открытых дескрипторов у Nginx?
Используйте команду: ls -l /proc/$(pgrep -f 'nginx: worker' | head -n 1)/fd | wc -l.