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

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

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

Nginx: accept4() failed (23: Too many open files in system) — Решение

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

Nginx перестает обрабатывать новые сетевые запросы, полностью блокируя стек сетевого ввода-вывода. В системном журнале ядра и error.log Nginx массово генерируется ошибка системного вызова: accept4() failed (23: Too many open files in system) while accepting new connection.

Код ядраОбозначение POSIXМасштаб проблемы
Код 24EMFILEПревышен лимит дескрипторов отдельного процесса
Код 23ENFILEПревышен глобальный лимит дескрипторов всей ОС Linux
fs.file-nrМетрика ядраТекущее число выделенных дескрипторов достигло fs.file-max
  • Сбой затрагивает не только Nginx, но и все остальные процессы на хосте (SSH, базы данных, Docker daemon перестают открывать сокеты и файлы).
  • Попытка выполнить системные команды в консоли может завершаться ошибкой -bash: ...: Too many open files in system.
  1. Проверьте текущее состояние системной таблицы дескрипторов ядра Linux:
    cat /proc/sys/fs/file-nr
    # Формат вывода: [выделено файлов] [неиспользуемые] [максимальный лимит]
  2. Увеличьте глобальный лимит файловых дескрипторов операционной системы через утилиту sysctl:
    sudo sysctl -w fs.file-max=2097152
    sudo sysctl -w fs.nr_open=2097152
  3. Зафиксируйте настройки на постоянной основе в конфигурационном файле /etc/sysctl.d/99-file-limits.conf:
    fs.file-max = 2097152
    fs.nr_open = 2097152
  4. Примените параметры ядра без перезагрузки системы:
    sudo sysctl -p /etc/sysctl.d/99-file-limits.conf
  5. Выявите процессы-виновники утечки дескрипторов:
    sudo lsof | awk '{print $1}' | sort | uniq -c | sort -rn | head -n 15
  6. Перезапустите стек веб-сервера: sudo systemctl restart nginx.
Внимание: Параметр fs.nr_open определяет жесткий потолок (hard limit), выше которого ни один отдельный процесс не может поднять свой RLIMIT_NOFILE. Значение fs.file-max задает суммарный лимит для всей операционной системы в целом.
Практический опыт инженера: Если `fs.file-nr` стремительно растет, проверьте систему на дескрипторные утечки в Java-приложениях или незакрытые пайпы в утилитах логирования (например, Fluentd/Vector).

Частые вопросы (FAQ)

В чем разница между ошибками ядра 24 и 23?

Ошибка 24 (EMFILE) означает, что лимит превысил конкретный воркер Nginx. Ошибка 23 (ENFILE) означает, что во всей операционной системе Linux закончились свободные слоты для открытия любых новых файлов и сокетов.

Что показывает третья цифра в /proc/sys/fs/file-nr?

Третья цифра отображает максимальное допустимое количество открытых файлов в системе (значение sysctl fs.file-max).

Может ли утечка сокетов в Docker контейнерах вызвать ошибку 23?

Да, поскольку таблица файловых дескрипторов ядра Linux является общей для всей системы, неконтролируемая утечка сокетов в любом изолированном контейнере исчерпает лимит для всего хоста.

Какое безопасное значение fs.file-max для highload серверов?

Для современных серверов с оперативной памятью от 16 ГБ стандартным промышленным значением является 2 097 152 (2 миллиона) дескрипторов.