Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
Nginx Error: epoll_create() failed (24: Too many open files) Linux / DevOps

Nginx Error: epoll_create() failed (24: Too many open files) — Решение

Обновлено: 18.08.2026  ·  Официальная база знаний

Веб-сервер перестает принимать новые клиентские подключения или падает при перезагрузке рабочих процессов. В системном журнале error.log регистрируется критическая ошибка исчерпания файловых дескрипторов: epoll_create() failed (24: Too many open files) или socket() failed (24: Too many open files) while connecting to upstream.

Уровень лимитаКонфигурационный файлСледствие превышения
Процесс Nginxworker_rlimit_nofileВоркер не может открыть дескрипторы для epoll и сокетов
Systemd ServiceLimitNOFILE=65535Systemd принудительно обрезает лимиты процессов сервиса
Пользователь ОС/etc/security/limits.confПользователи www-data / nginx ограничены значением 1024
  • Новые клиенты получают таймауты подключения (Connection timed out) или сброс TCP-сессий (Connection reset by peer).
  • Команда nginx -t может завершаться успешно, но мастер-процесс не способен породить рабочие воркеры.
  1. Увеличьте лимит открытых файлов в главном контексте конфигурации /etc/nginx/nginx.conf:
    # Директива должна находиться на самом верхнем уровне файла (вне блоков http/events):
    worker_rlimit_nofile 65535;
    
    events {
        worker_connections 16384;
    }
  2. Скорректируйте лимиты службы Nginx в systemd с помощью переопределения (override):
    sudo systemctl edit nginx.service
    
    # Внесите следующие строки:
    [Service]
    LimitNOFILE=65535
  3. Установите системные лимиты для учетных записей веб-сервера в /etc/security/limits.conf:
    nginx       soft    nofile   65535
    nginx       hard    nofile   65535
    www-data    soft    nofile   65535
    www-data    hard    nofile   65535
  4. Примените параметры systemd и полностью перезапустите службу веб-сервера:
    sudo systemctl daemon-reload
    sudo systemctl restart nginx
  5. Проверьте реальные действующие лимиты работающего процесса:
    cat /proc/$(pgrep -f "nginx: worker" | head -n 1)/limits | grep "Max open files"
Важно: Директива worker_connections не может превышать значение worker_rlimit_nofile. Для корректной работы всегда задавайте worker_rlimit_nofile как минимум в два раза больше, чем worker_connections.
Практический опыт инженера: Если сервер находится под SYN-флудом или спамом медленных соединений (Slowloris), дескрипторы исчерпываются за секунды. Обязательно настраивайте `reset_timedout_connection on;` и тайм-ауты закрытия сокетов.

Частые вопросы (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.