Nginx Status Module (ngx_http_stub_status_module) - встроенный инструмент для получения базовых метрик производительности веб-сервера. Модуль показывает активные соединения, общее количество принятых и обработанных запросов, а также состояния чтения, записи и ожидания. Это фундамент для мониторинга без сторонних плагинов или агентов.
Мониторинг Nginx критически важен для выявления узких мест, обнаружения аномалий в трафике и планирования мощностей. Без метрик вы работаете вслепую: не знаете, когда сервер приближается к пределу worker_connections, растёт ли очередь запросов или увеличивается доля ошибок. Stub_status даёт минимально необходимый набор данных, который закрывает 80% потребностей в наблюдаемости.
В коммерческой версии Nginx Plus доступен расширенный модуль статуса с детализацией по виртуальным хостам и upstream-серверам. Здесь мы фокусируемся на бесплатном решении, которое работает в любой стандартной сборке Nginx с поддержкой модуля. После настройки вы сможете подключить метрики к Prometheus и Grafana для визуализации и алертинга.
Что такое Nginx Status Module и зачем он нужен
ngx_http_stub_status_module предоставляет страницу с метриками в текстовом формате. При обращении к настроенному эндпоинту Nginx отдаёт данные о текущем состоянии: количество активных соединений, накопительные счётчики принятых и обработанных соединений, общее число запросов и распределение соединений по состояниям чтения, записи и ожидания.
Эти метрики помогают ответить на конкретные вопросы администратора:
- Сколько клиентов подключено к серверу прямо сейчас?
- Растёт ли нагрузка со временем?
- Есть ли соединения, которые сервер принял, но не смог обработать?
- Эффективно ли используются keep-alive соединения?
Без модуля вы вынуждены анализировать логи доступа или полагаться на системные утилиты вроде netstat, которые не дают картины на уровне приложения. Stub_status встроен в Nginx и работает с минимальными накладными расходами - сбор метрик не влияет на производительность обработки запросов.
Для полной картины мониторинга рекомендуем также изучить готовые конфигурации Prometheus и Grafana для мониторинга Nginx с алертингом на ошибки 502/504.
Шаг 1: Проверка и включение модуля ngx_http_stub_status_module
Перед настройкой эндпоинта убедитесь, что модуль присутствует в вашей сборке Nginx. Если модуль отсутствует, потребуется переустановка пакета или пересборка из исходников.
Как проверить наличие модуля в вашей сборке Nginx
Выполните команду, которая выводит параметры компиляции Nginx и фильтрует строку с именем модуля:
nginx -V 2>&1 | grep --color -o with-http_stub_status_moduleЕсли модуль присутствует, вывод будет содержать строку with-http_stub_status_module. Пустой вывод означает, что модуль не собран с вашим экземпляром Nginx.
Пример вывода при наличии модуля:
--with-http_stub_status_moduleПроверьте также полный список модулей без фильтрации, чтобы убедиться, что вывод не был обрезан:
nginx -V 2>&1Установка Nginx с поддержкой stub_status
Если модуль отсутствует, выберите подходящий способ установки в зависимости от операционной системы и способа развёртывания.
Ubuntu/Debian: стандартный пакет nginx может не включать модуль. Установите расширенную версию:
apt update
apt install nginx-fullПакет nginx-extras также содержит модуль и включает дополнительные возможности, такие как встроенный Perl и сторонние модули.
CentOS/RHEL: модуль включён в стандартный пакет из репозитория EPEL. Установка:
yum install nginxСборка из исходников: добавьте флаг при конфигурации:
./configure --with-http_stub_status_module [другие флаги]
make
make installDocker: официальный образ nginx:latest включает модуль. Проверьте командой внутри контейнера:
docker run --rm nginx:latest nginx -V 2>&1 | grep stub_statusЕсли вы используете минималистичный образ, соберите свой Dockerfile на базе официального:
FROM nginx:latest
# Модуль уже встроен, дополнительных действий не требуетсяПосле установки или пересборки обязательно проверьте конфигурацию и перезапустите сервис:
nginx -t && systemctl restart nginxШаг 2: Настройка защищённого эндпоинта для статусной страницы
Эндпоинт со статусом раскрывает информацию о нагрузке на сервер. Открытый доступ позволяет злоумышленнику оценить мощность инфраструктуры, обнаружить пики нагрузки и выбрать момент для атаки. Настройте минимум один уровень защиты - по IP-адресам или базовой HTTP-аутентификации. Рекомендуем комбинировать оба метода.
Базовая конфигурация location со stub_status
Минимальная конфигурация в серверном блоке:
server {
listen 8080;
server_name localhost;
location /nginx_status {
stub_status;
}
}Эта конфигурация открывает метрики всем, кто может обратиться к порту 8080. Используйте её только для тестирования в изолированной среде. В production немедленно добавьте ограничения.
Ограничение доступа по IP-адресам
Разрешите доступ только с доверенных адресов - серверов мониторинга, внутренней сети или VPN:
location /nginx_status {
stub_status;
allow 192.168.1.0/24;
allow 10.0.0.0/8;
allow 172.16.0.0/12;
deny all;
}Директивы обрабатываются последовательно: сначала проверяются разрешающие правила, затем запрещающее deny all блокирует всех остальных. Укажите конкретные IP-адреса ваших серверов Prometheus или экспортера вместо целых подсетей для более строгого контроля.
Добавление базовой HTTP-аутентификации
Базовая аутентификация добавляет второй уровень защиты. Даже если злоумышленник получит доступ к внутренней сети, ему потребуются учётные данные.
Создайте файл паролей утилитой htpasswd:
htpasswd -c /etc/nginx/.htpasswd monitor_userУтилита запросит пароль и создаст файл с хешем. Ключ -c используется только при первом создании файла - при повторном использовании он перезапишет существующих пользователей. Для добавления новых пользователей опустите этот ключ:
htpasswd /etc/nginx/.htpasswd another_userДобавьте директивы аутентификации в location:
location /nginx_status {
stub_status;
allow 192.168.1.100;
allow 10.0.0.50;
deny all;
auth_basic "Nginx Status";
auth_basic_user_file /etc/nginx/.htpasswd;
}Строка «Nginx Status» - это сообщение, которое увидит пользователь в диалоге ввода пароля. Укажите что-то информативное, но не раскрывающее внутренние детали.
Проверьте синтаксис конфигурации и перезагрузите Nginx:
nginx -t && systemctl reload nginxПротестируйте доступ с разрешённого IP:
curl -u monitor_user:password http://192.168.1.100:8080/nginx_statusИ с запрещённого - должны получить 403 Forbidden.
Шаг 3: Интерпретация метрик - что означают цифры
После настройки эндпоинта вы увидите страницу с данными в таком формате:
Active connections: 2
server accepts handled requests
15234 15234 28901
Reading: 0 Writing: 1 Waiting: 1Каждая строка содержит конкретную информацию о состоянии сервера. Разберём все поля детально.
Active connections и состояния Reading, Writing, Waiting
Active connections - общее количество открытых клиентских соединений в данный момент. В это число входят соединения, которые активно читают или пишут данные, а также ожидающие keep-alive соединения.
Три состояния соединений:
- Reading - Nginx читает заголовок запроса от клиента. Высокое значение указывает на медленных клиентов, отправляющих данные слишком долго, или на большое количество входящих соединений.
- Writing - Nginx читает тело запроса от клиента или отправляет ответ. Рост этого показателя сигнализирует о медленных бэкендах, которые долго формируют ответ, или о клиентах с плохим каналом.
- Waiting - keep-alive соединения, которые остаются открытыми после завершения запроса в ожидании следующего. Высокое значение - норма для сайтов с keep-alive. Это не проблема, пока количество не превышает лимит worker_connections.
Тревожный сигнал: сумма Reading и Writing постоянно высокая при небольшом количестве Waiting. Это означает, что соединения «застревают» в активных состояниях - вероятно, проблема с бэкендом или клиентской сетью.
Счётчики accepts, handled, requests
Вторая строка содержит накопительные счётчики с момента запуска Nginx:
- accepts - общее количество принятых клиентских соединений.
- handled - количество соединений, которые были успешно обработаны. Разница между accepts и handled показывает число соединений, принятых, но не обработанных - обычно из-за исчерпания лимита worker_connections.
- requests - общее количество обработанных запросов. Один клиент по keep-alive соединению может отправить несколько запросов, поэтому requests часто больше accepts.
Как использовать эти счётчики для расчёта RPS (запросов в секунду):
- Запишите значение requests в момент T1.
- Через 60 секунд запишите значение в момент T2.
- RPS = (requests_T2 - requests_T1) / 60.
Если handled стабильно меньше accepts, увеличьте worker_connections в конфигурации Nginx. Это прямое указание на то, что сервер не справляется с входящим потоком соединений.
Для более глубокого анализа логов и настройки алертинга используйте готовые скрипты анализа логов Nginx.
Шаг 4: Интеграция с Prometheus и Grafana
Stub_status отдаёт метрики в текстовом формате, который Prometheus не понимает. Для преобразования нужен экспортер - промежуточный сервис, который забирает данные с эндпоинта Nginx и отдаёт их в формате, совместимом с Prometheus.
Установка и запуск nginx-prometheus-exporter
Официальный экспортер от Nginx доступен на GitHub и в виде Docker-образа. Запуск через Docker - самый простой способ:
docker run -d \
--name nginx-exporter \
-p 9113:9113 \
nginx/nginx-prometheus-exporter:latest \
-nginx.scrape-uri=http://192.168.1.100:8080/nginx_statusФлаг -nginx.scrape-uri указывает URL вашего защищённого эндпоинта. Если настроена базовая аутентификация, добавьте учётные данные в URL:
-nginx.scrape-uri=http://monitor_user:password@192.168.1.100:8080/nginx_statusПроверьте, что экспортер отдаёт метрики:
curl http://localhost:9113/metricsВы увидите метрики в формате Prometheus: nginx_connections_active, nginx_http_requests_total и другие.
Настройка Prometheus для сбора метрик
Добавьте новый job в секцию scrape_configs файла prometheus.yml:
scrape_configs:
- job_name: 'nginx'
scrape_interval: 15s
static_configs:
- targets: ['192.168.1.50:9113']
labels:
environment: 'production'Перезагрузите Prometheus:
curl -X POST http://localhost:9090/-/reloadПроверьте, что target появился в веб-интерфейсе Prometheus по адресу http://localhost:9090/targets. Состояние должно быть «UP».
Создание дашборда в Grafana
Самый быстрый способ - импортировать готовый дашборд. В Grafana перейдите в Dashboards → Import и введите ID 11199 (популярный дашборд для Nginx). Укажите источник данных Prometheus и нажмите Import.
Для создания собственного дашборда добавьте базовые панели:
- Активные соединения:
nginx_connections_active- линейный график, показывает текущую нагрузку. - Запросы в секунду:
rate(nginx_http_requests_total[1m])- скорость поступления запросов. - Соединения в ожидании:
nginx_connections_waiting- мониторинг keep-alive соединений. - Соотношение accepts/handled:
rate(nginx_connections_accepted[1m]) - rate(nginx_connections_handled[1m])- отброшенные соединения.
Настройте алерты в Grafana на критические метрики: резкое падение handled относительно accepts или превышение порога активных соединений над 80% от worker_connections.
Для комплексного подхода к мониторингу Nginx изучите руководство по мониторингу upstream и health checks с готовыми конфигурациями для Prometheus и Grafana.
Диагностика и решение типичных проблем
При настройке stub_status администраторы сталкиваются с несколькими типовыми ошибками. Вот решения для каждой из них.
Ошибка «unknown directive stub_status»
Nginx не распознаёт директиву stub_status в конфигурации. При перезапуске или проверке синтаксиса выводится:
nginx: [emerg] unknown directive "stub_status"Причина: модуль ngx_http_stub_status_module не собран с вашим экземпляром Nginx.
Решение: проверьте наличие модуля командой nginx -V 2>&1 | grep stub_status. Если модуль отсутствует, переустановите пакет (nginx-full на Debian/Ubuntu) или пересоберите Nginx из исходников с флагом --with-http_stub_status_module. После установки проверьте, что вы запускаете именно новый бинарный файл, а не старый.
Проблемы с доступом: 403 и 404
Ошибка 403 Forbidden: доступ заблокирован директивами allow/deny.
- Проверьте порядок директив:
deny allдолжно быть последним. - Убедитесь, что IP-адрес клиента совпадает с указанным в allow. Если Nginx стоит за прокси или балансировщиком, он видит IP прокси, а не клиента. Используйте директиву
set_real_ip_fromиreal_ip_headerдля проброса реального IP. - Временно закомментируйте allow/deny для изоляции проблемы.
Ошибка 404 Not Found: location не совпадает с запросом.
- Проверьте, что location определён в правильном server block - том, который слушает порт, к которому вы обращаетесь.
- Убедитесь, что нет конфликтующих location с регулярными выражениями, которые перехватывают запрос раньше.
- Проверьте listen директиву: если указан конкретный IP, запрос на другой IP не попадёт в этот блок.
Ошибка 500 Internal Server Error: проблема с файлом паролей.
- Проверьте путь к файлу в
auth_basic_user_file. - Убедитесь, что файл читаем пользователем, от которого запущен Nginx (обычно www-data или nginx).
- Проверьте формат файла: каждая строка должна быть вида
user:hashed_password.
Экспортер не может подключиться к эндпоинту
Симптом: в логах экспортера ошибки соединения, в Prometheus target «DOWN».
- Проверьте сетевую доступность эндпоинта с хоста, где запущен экспортер:
curl http://nginx-host:8080/nginx_status. - Если используется Docker, убедитесь, что контейнер экспортера может достичь хоста с Nginx. На Linux используйте
--network hostилиhost.docker.internal. - Проверьте учётные данные в URL, если настроена аутентификация.
- Проверьте, что IP экспортера добавлен в allow на эндпоинте.
Для комплексной защиты production-среды после настройки мониторинга внедрите продвинутые меры безопасности Nginx: WAF, rate limiting и защиту от slowloris.
Заключение: полная картина мониторинга Nginx
Вы настроили Nginx Status Module, защитили эндпоинт от несанкционированного доступа, научились интерпретировать метрики и подключили их к Prometheus с Grafana. Эта связка даёт базовую, но эффективную систему наблюдаемости, которая работает без лицензионных затрат и внешних зависимостей.
Ключевые точки контроля: активные соединения не должны приближаться к лимиту worker_connections, разница между accepts и handled должна быть нулевой, а requests должны расти предсказуемо в соответствии с нагрузкой. Отклонения - сигнал к немедленному расследованию.
Stub_status не даёт разбивки по виртуальным хостам, не показывает время ответа бэкендов и не детализирует HTTP-коды ответов. Для этих задач потребуется Nginx Plus с расширенным Status API или дополнительные модули вроде ngx_http_vhost_traffic_status_module. Но для 80% сценариев - мониторинг здоровья сервера, выявление аномалий и планирование мощностей - встроенного модуля достаточно.
Проверьте настройки прямо сейчас: запросите эндпоинт, убедитесь, что метрики собираются экспортером и отображаются в Grafana. Настройте алерты на критические отклонения и спите спокойно.