NGINX_WORKER_LIMIT
Linux / DevOps
Тюнинг Nginx под High-Load: worker_processes, worker_connections и epoll
- Ошибка
worker_connections are not enough while connecting to upstreamв error.log. - Ошибка
24: Too many open filesпри всплеске трафика. - Высокое потребление CPU и длительное время ожидания установки TLS handshake.
1. Настройка глобальной секции /etc/nginx/nginx.conf
# Автоматическое определение по числу физических ядер CPU
worker_processes auto;
# Привязка воркеров к ядрам процессора для минимизации CPU cache misses
worker_cpu_affinity auto;
# Максимальный лимит открытых файловых дескрипторов на процесс воркера
worker_rlimit_nofile 1048576;
events {
# Максимальное количество одновременных соединений на один worker_process
worker_connections 65535;
# Использование эффективного мультиплексирования ввода-вывода Linux
use epoll;
# Принимать сразу все входящие соединения из очереди ядра
multi_accept on;
}2. Тюнинг системных лимитов ОС (limits.conf)
В файле /etc/security/limits.d/99-nginx.conf:
nginx soft nofile 1048576
nginx hard nofile 10485763. Настройка сетевого стека ядра для Nginx
В файле /etc/sysctl.d/99-nginx-tuning.conf:
# Увеличение длины очереди входящих соединений
net.core.somaxconn = 65535
# Диапазон локальных портов для исходящих upstream-соединений
net.ipv4.ip_local_port_range = 1024 65535
# Повторное использование сокетов TIME_WAIT
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15sysctl --system && nginx -t && systemctl restart nginx
Практический опыт инженера:
Значение worker_rlimit_nofile всегда должно быть не меньше, чем worker_connections * 2, так как на каждое клиентское проксируемое соединение расходуется минимум два файловых дескриптора сокета.
Частые вопросы (FAQ)
Как расс maxClients в Nginx?
Максимальное число одновременных клиентов равно: worker_processes * worker_connections. При использовании Nginx в качестве reverse proxy разделите результат на 2 (соединение с клиентом + соединение с upstream).
Что дает опция reuseport в директиве listen?
Опция listen 80 reuseport создает отдельный сокет прослушивания для каждого worker_process, позволяя ядру распределять входящие TCP-соединения между воркерами без блокировок мьютексов.