tuning: Модуль консультанта по настройке NGINX
Требуется план Pro (или выше) подписки GetPageSpeed NGINX Extras.
Установка
Вы можете установить этот модуль в любой дистрибутив на базе RHEL, включая, но не ограничиваясь:
- RedHat Enterprise Linux 7, 8, 9 и 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 и Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-tuning
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-tuning
Включите модуль, добавив следующее в начало файла /etc/nginx/nginx.conf:
load_module modules/ngx_http_tuning_module.so;
Этот документ описывает nginx-module-tuning v1.3.0, выпущенный 29 апреля 2026 года.
Рекомендации по настройке NGINX на основе данных реального трафика
Перестаньте гадать о размерах ваших буферов. Этот модуль наблюдает за вашими фактическими паттернами трафика и точно говорит, что нужно настроить.
Проблема
Каждое руководство по настройке прокси NGINX говорит вам настроить proxy_buffer_size, proxy_buffers и таймауты. Но какие значения следует использовать?
Традиционный подход включает выполнение команд curl против ваших бэкендов:
curl -s -w %{size_header} -o /dev/null https://backend.example.com
Это дает вам одну точку данных. Ваш реальный трафик имеет тысячи запросов в минуту, каждый с разными размерами заголовков, тел и временем ответа. Один curl ничего не говорит о 95-м процентиле, который вызывает ошибки upstream sent too big header в продакшене.
Решение
Этот модуль находится внутри NGINX, пассивно наблюдает за каждым проксируемым запросом и строит гистограммы фактического трафика. Когда вы будете готовы, запросите конечную точку /tuning-advisor:
{
"sample_size": 847293,
"uptime_seconds": 86400,
"requests_per_second": 9.81,
"proxy_buffer_size": {
"observed": { "avg": "1.8k", "max": "23.4k", "p95_approx": "4.0k" },
"recommendation": "OK",
"suggested_value": "4k",
"reason": "95% заголовков помещаются в 4k"
},
"proxy_buffers": {
"observed": { "avg": "12.3k", "max": "2.1m", "p95_approx": "32.0k" },
"recommendation": "OK",
"suggested_value": "8 4k",
"reason": "По умолчанию 32k (8x4k) достаточно для 95% ответов"
},
"ssl_buffer_size": {
"observed": { "avg": "12.3k", "max": "2.1m", "p95_approx": "32.0k" },
"recommendation": "OK",
"suggested_value": "16k",
"reason": "Большинство ответов превышают одну запись TLS; динамическое изменение размера записи или ssl_buffer_size 4k не дает измеримых преимуществ"
},
"nginx_config": {
"snippet": "proxy_buffer_size 4k;\nproxy_buffers 8 4k;\nproxy_read_timeout 10s;\nclient_body_buffer_size 8k;\nssl_buffer_size 16k;",
"apply_to": "http, server, или блок location"
}
}
Скопируйте фрагмент, вставьте в вашу конфигурацию, перезагрузите. Готово.
Особенности
Сбор метрик
- Размеры заголовков ответов от upstream → настройте
proxy_buffer_size - Размеры тел ответов от upstream → настройте
proxy_buffersиssl_buffer_size - Время ответа от upstream → настройте
proxy_read_timeout - Размеры тел запросов от клиента → настройте
client_body_buffer_size - Коэффициенты повторного использования соединений → оптимизируйте настройки keepalive
- Коэффициенты попадания/промаха кэша → оцените эффективность прокси-кэша
Производительность
- Безблокировочные атомарные операции — без мьютексов, без конфликтов между рабочими процессами
- Общая память — все рабочие процессы вносят вклад в одни и те же счетчики
- Процентиль на основе гистограммы — приближенный p95/p99 без хранения каждого значения
- Наносекундные накладные расходы — ~10 атомарных инкрементов на запрос
Форматы вывода
- JSON API с рекомендациями, причинами и готовыми к использованию фрагментами конфигурации
- Метрики Prometheus для интеграции с Grafana, Alertmanager и другими
- Конечная точка сброса для очистки счетчиков и начала новых окон наблюдения
Быстрый старт
load_module modules/ngx_http_tuning_module.so;
http {
# Включите сбор для всех проксируемых запросов
tuning_advisor on;
server {
# Откройте конечную точку настройки (ограничьте доступ!)
location = /tuning-advisor {
tuning_advisor_status;
allow 127.0.0.1;
allow 10.0.0.0/8;
deny all;
}
location / {
proxy_pass http://backend;
}
}
}
Затем запросите ее:
curl http://localhost/tuning-advisor | jq .
Справочник по конфигурации
tuning_advisor
tuning_advisor on | off;
| По умолчанию | off |
| Контекст | http, server, location |
Включает сбор метрик для проксируемых запросов в этом контексте.
tuning_advisor_shm_size
tuning_advisor_shm_size 1m;
| По умолчанию | 1m |
| Контекст | http |
Размер зоны общей памяти для агрегации метрик между рабочими процессами. 1 МБ достаточно для фиксированных счетчиков и гистограмм.
tuning_advisor_status
tuning_advisor_status;
| Контекст | location |
Включает обработчик статуса. Отвечает на GET (возвращает метрики), POST (сбрасывает метрики) и GET с ?reset (также сбрасывает).
Справочник API
GET /tuning-advisor
Возвращает JSON с наблюдаемыми метриками, рекомендациями и готовым к использованию фрагментом конфигурации.
Структура ответа:
| Раздел | Описание |
|---|---|
sample_size |
Общее количество проксируемых запросов |
uptime_seconds |
Секунды с момента начала сбора (или последнего сброса) |
requests_per_second |
Средняя скорость запросов |
proxy_buffer_size |
Метрики размера заголовка и рекомендации |
proxy_buffers |
Метрики размера тела и рекомендации |
ssl_buffer_size |
Рекомендация по размеру записи TLS, полученная из P95 тела |
proxy_read_timeout |
Метрики времени ответа и рекомендации |
client_body_buffer_size |
Метрики тела запроса и рекомендации |
connection_reuse |
Эффективность keepalive клиента и upstream |
proxy_cache |
Статистика попадания/промаха/обхода кэша |
nginx_config |
Фрагмент конфигурации для копирования и вставки |
histograms |
Сырые подсчеты ведер для индивидуального анализа |
GET /tuning-advisor?prometheus
Возвращает формат экспозиции Prometheus:
# HELP nginx_tuning_requests_total Общее количество проксируемых запросов
# TYPE nginx_tuning_requests_total counter
nginx_tuning_requests_total 847293
# HELP nginx_tuning_header_size_bucket Распределение размеров заголовков
# TYPE nginx_tuning_header_size_bucket histogram
nginx_tuning_header_size_bucket{le="1024"} 423841
nginx_tuning_header_size_bucket{le="2048"} 712453
nginx_tuning_header_size_bucket{le="4096"} 831029
nginx_tuning_header_size_bucket{le="+Inf"} 847293
Настройте сбор Prometheus:
scrape_configs:
- job_name: nginx-tuning
metrics_path: /tuning-advisor
params:
prometheus: ['1']
static_configs:
- targets: ['nginx:80']
POST /tuning-advisor
Сбрасывает все счетчики на ноль и возвращает подтверждение. Полезно для начала нового окна наблюдения после изменений конфигурации.
GET /tuning-advisor?reset
То же самое, что и POST — сбрасывает все метрики.
Логика рекомендаций
Модуль анализирует процентиль и предоставляет действенные рекомендации:
| Метрика | Рекомендация | Когда |
|---|---|---|
proxy_buffer_size |
OK |
p95 размер заголовка ≤ 4KB |
INCREASE |
p95 > 4KB (предлагает 8k, 16k или 32k) | |
WARNING |
p95 > 16KB (исследуйте upstream) | |
proxy_buffers |
OK |
p95 размер тела ≤ 32KB |
INCREASE |
p95 > 32KB (предлагает большие буферы) | |
ssl_buffer_size |
REDUCE до 4k |
p95 тело ≤ 4KB (размер записи в стиле Cloudflare) |
OK при 16k |
p95 тело > 4KB (по умолчанию подходит) | |
proxy_read_timeout |
CONSIDER_REDUCING |
p99 время ответа < 5s |
OK |
p99 между 5s и 30s | |
WARNING |
p99 > 30s (бэкенд слишком медленный) | |
connection_reuse |
EXCELLENT |
Клиент ≥ 80% повторного использования, upstream ≥ 70% |
WARNING |
Низкое повторное использование (предлагает настройку keepalive) | |
proxy_cache |
EXCELLENT |
Коэффициент попадания ≥ 80% |
WARNING |
Коэффициент попадания < 20% | |
| ## |
Гистограммы
Модуль использует экспоненциальные ведерные гистограммы для приближения процентилей без хранения каждого значения:
Размеры ведер: <1k, 1-2k, 2-4k, 4-8k, 8-16k, 16-32k, 32-64k, >64k
Временные ведра: <10ms, 10-50ms, 50-100ms, 100-500ms, 500ms-1s, 1-5s, 5-10s, >10s
Сырые подсчеты ведер доступны в разделе histograms JSON-ответа для индивидуального анализа.
Соображения безопасности
Конечная точка /tuning-advisor раскрывает информацию о ваших паттернах трафика. Всегда ограничивайте доступ:
location = /tuning-advisor {
tuning_advisor_status;
# Разрешить только с localhost и внутренней сети
allow 127.0.0.1;
allow ::1;
allow 10.0.0.0/8;
allow 172.16.0.0/12;
allow 192.168.0.0/16;
deny all;
# Или требуйте аутентификацию
# auth_basic "Tuning Advisor";
# auth_basic_user_file /etc/nginx/.htpasswd;
}
Связанное чтение
- Настройка proxy_buffer_size в NGINX — глубокое погружение в размер буфера
- Объяснение директив таймаута NGINX — понимание всех настроек таймаута