Полное руководство по оптимизации Nginx под Highload: от worker_processes до буферов ядра Linux
Когда веб-сервер начинает обрабатывать свыше 10,000 запросов в секунду (RPS), стандартная конфигурация nginx.conf из дистрибутива перестает справляться. Возникают таймауты 502/504, исчерпываются файловые дескрипторы, а ядро системы захлебывается в обработке сетевых пакетов. В этой статье мы пошагово разберем калибровку Nginx и сетевого стека Linux для достижения максимальной пропускной способности.
1. Тюнинг системных дескрипторов и worker-процессов
По умолчанию Nginx использует модель обработки событий на основе epoll в Linux. Основной параметр масштабирования — директива worker_processes. Рекомендуется ставить ее в значение auto, чтобы Nginx привязывался к числу доступных физических ядер CPU. Однако без правильного задания лимита дескрипторов worker_rlimit_nofile пул соединений упрется в потолок.
# Основной блок конфигурации nginx.conf
user nginx;
worker_processes auto;
worker_rlimit_nofile 65535;
pid /var/run/nginx.pid;
events {
worker_connections 16384;
use epoll;
multi_accept on;
}
2. Буферизация и сброс пакетов на диск
Чтобы избежать медленной дисковой подсистемы при отдаче статики и снизить context switching между процессами, крайне важно активировать отправку через системный вызов sendfile, а также отключить буферизацию заголовков TCP через комбинацию опций tcp_nopush и tcp_nodelay:
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# Тайм-ауты соединений (предотвращение медленных атак)
keepalive_timeout 30;
client_header_timeout 10;
client_body_timeout 10;
send_timeout 10;
# Размеры буферов для избежания I/O swap на диск
client_body_buffer_size 128k;
client_max_body_size 10m;
client_header_buffer_size 1k;
large_client_header_buffers 4 8k;
}
3. Gzip и сжатие на лету
Не устанавливайте степень сжатия gzip_comp_level выше 5 или 6. Прирост экономии трафика между уровнями 6 и 9 составляет доли процента, при этом утилизация центрального процессора возрастает почти экспоненциально.