Nginx: worker_connections are not enough — Тюнинг под высокие нагрузки
Во время резкого наплыва посетителей или при DDoS-атаке Nginx перестает принимать новые TCP-соединения, возвращая клиентам сбои подключения или задержки. В error.log регистрируется критическое событие: 1024 worker_connections are not enough while connecting to upstream или worker_connections are not enough.
| Параметр | Значение по умолчанию | Влияние на масштабируемость |
|---|---|---|
worker_processes | 1 (или auto) | Количество рабочих процессов Nginx (по числу ядер CPU) |
worker_connections | 512 или 1024 | Максимум одновременных файловых дескрипторов на 1 worker |
| Теоретический предел соединений | worker_processes * worker_connections | Суммарный лимит одновременных сокетов веб-сервера |
Лимит дескрипторов ОС (ulimit -n) | 1024 | Системное ограничение открытых файлов на процесс |
- Nginx исчерпывает пул доступных соединений и начинает сбрасывать входящие запросы.
- При работе в режиме обратного прокси (reverse proxy) на каждый клиентский запрос Nginx тратит 2 соединения (одно к клиенту, второе к upstream-бэкенду).
- Откройте глобальный файл конфигурации
/etc/nginx/nginx.conf. - В секции
eventsи глобальном контексте увеличьте лимиты соединений и дескрипторов:# Запуск воркеров по числу ядер CPU: worker_processes auto; # Максимальное число открытых файлов на воркер на уровне ядра: worker_rlimit_nofile 65535; events { # Увеличиваем лимит соединений на один процесс: worker_connections 16384; # Использовать эффективный механизм мультиплексирования Linux: use epoll; # Принимать сразу все входящие соединения из очереди: multi_accept on; } - Увеличьте системные лимиты дескрипторов файлов в
/etc/security/limits.conf:nginx soft nofile 65535 nginx hard nofile 65535 www-data soft nofile 65535 www-data hard nofile 65535 - Оптимизируйте сетевой стек ядра Linux через
/etc/sysctl.conf:sudo sysctl -w net.core.somaxconn=65535 sudo sysctl -w net.ipv4.tcp_max_syn_backlog=65535 sudo sysctl -p - Проверьте конфигурацию и примените:
sudo nginx -t && sudo systemctl restart nginx.
(worker_processes * worker_connections) / 4 (с учетом сокетов к бэкенду, клиенту и дескрипторов файлов логов).Частые вопросы (FAQ)
Почему Nginx тратит 2 или более worker_connections на один запрос?
В режиме reverse proxy одно соединение держится с клиентом (браузером), а второе соединение Nginx открывает к апстриму (например, к PHP-FPM или Gunicorn). Дополнительные дескрипторы могут требоваться для чтения статических файлов и записи логов.
Что произойдет, если указать worker_connections 65535 без worker_rlimit_nofile?
Nginx упадет с ошибкой ядра 'Too many open files', так как стандартный системный ulimit операционной системы для непривилегированного пользователя равен всего 1024 дескрипторам.
Что делает директива multi_accept on?
По умолчанию воркер принимает по одному новому соединению за раз. multi_accept on указывает воркеру забирать сразу все накопившиеся в очереди сетевого сокета входящие подключения за один цикл epoll.
Как проверить текущее количество активных соединений Nginx?
Включите модуль stub_status (location /nginx_status { stub_status; allow 127.0.0.1; deny all; }) и выполните curl http://127.0.0.1/nginx_status.