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

tuning: Модуль советника по настройке NGINX

Установка на Debian/Ubuntu

Эти документы применимы к APT-пакету nginx-module-tuning, предоставляемому репозиторием GetPageSpeed Extras.

  1. Настройте APT репозиторий, как описано в настройке APT репозитория.
  2. Установите модуль:
sudo apt-get update
sudo apt-get install nginx-module-tuning
Показать дистрибутивы и архитектуры
| Дистрибутив | Версия           | Компонент   | Архитектуры    |
|-------------|------------------|-------------|-----------------|
| debian      | bookworm         | main        | amd64, arm64    |
| debian      | bookworm-mainline| main        | amd64, arm64    |
| debian      | trixie           | main        | amd64, arm64    |
| debian      | trixie-mainline  | main        | amd64, arm64    |
| ubuntu      | focal            | main        | amd64, arm64    |
| ubuntu      | focal-mainline   | main        | amd64, arm64    |
| ubuntu      | jammy            | main        | amd64, arm64    |
| ubuntu      | jammy-mainline   | main        | amd64, arm64    |
| ubuntu      | noble            | main        | amd64, arm64    |
| ubuntu      | noble-mainline   | main        | amd64, arm64    |

Рекомендации по настройке 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"
  }
}

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

Особенности

Сбор метрик

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

    # Разрешите доступ только с локального хоста и внутренней сети
    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;
}

Связанное чтение