Перейти к содержанию

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.2.0, выпущенный 16 февраля 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% ответов"
  },

  "nginx_config": {
    "snippet": "proxy_buffer_size 4k;\nproxy_buffers 8 4k;\nproxy_read_timeout 10s;\nclient_body_buffer_size 8k;",
    "apply_to": "http, server, or location block"
  }
}

Скопируйте фрагмент, вставьте в вашу конфигурацию, перезагрузите. Готово.

Функции

Сбор метрик

  • Размеры заголовков ответа upstream → настройка proxy_buffer_size
  • Размеры тела ответа upstream → настройка proxy_buffers
  • Время ответа 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 Метрики размера тела и рекомендации
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 (рекомендует большие буферы)
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;
}

Связанные материалы