Алгоритм действий состоит из следующих шагов:
1.Настройка Nginx на отдачу статусной страницы
2.Запуск Nginx-экспортера для сбора метрик с Nginx и отдачи их Prometheus-у
3.Настройка Prometheus-а для сбора метрик с Nginx-экспортера
4.Импортирование/настройка dashboard Grafana для визуализации метрик
5.Настрйка правил Prometheus для мониторинга Nginx показателей
1.Настройка Nginx на отдачу статусной страницы
Проверка поддержки Nginx-ом модуля http_stub_status_module и описание собираемых параметров с помощью этого модуля изложено ранее в этой статье
Добавляем поддержку nginx-статуса в дефолтном хосте
1 |
# less nginx/sites/default.conf |
1 2 3 4 5 6 7 |
location /nginx_status { stub_status on; access_log off; allow 127.0.0.1; allow 172.16.0.0/12; deny all; } |
Важно разрешит доступ к статусной странице Nginx для docker-подсети( 172.16.0.0/12)
Запрос на nginx контейнер будет идти с nginx-exporter-контейнера, который будет запущен в одной docker-сети с nginx-контейнером
Проверяем синтаксис конфигурационного файла Nginx
1 |
# docker-compose exec nginx nginx -t |
Перегружаем nginx
1 |
# docker-compose exec nginx nginx -s reload |
Заходим в любой контейнер,который находится в одной сети с nginx-контейнером и проверяем доступность статусной страницы(например, в контейнер с php-fpm)
1 |
# docker-compose exec php-fpm curl http://nginx/nginx_status |
1 2 3 4 |
Active connections: 4 server accepts handled requests 5107 5107 14373 Reading: 0 Writing: 1 Waiting: 3 |
2.Запуск Nginx-экспортера для сбора метрик с Nginx и отдачи их Prometheus-у
Если не используется docker-compose
Nginx-экспортер запускаем в той же docker-сети, в которой и запущен nginx-контейнер,чтобы средствами Docker экспортер смог разименовать имя nginx-контейнера в его IP-адрес и находясь с ним в одной подсети подключиться по этому IP-адресу для снятия с него метрик
1 |
# docker run -p 10.101.90.2:9113:9113 --name nginx-exporter --network laradock_frontend nginx/nginx-prometheus-exporter:0.4.2 -nginx.scrape-uri http://nginx:80/nginx_status -nginx.retries=10 -web.telemetry-path=/metrics |
1 |
nginx.scrape-uri |
– URI, на котором доступна статусная страница Nginx
1 |
nginx.retries |
– кол-во попыток,который будет делать экспортер при старте,чтобы снять метрики с nginx-контейнера, перед тем,как выдать ошибку о недоступности целевого nginx
1 |
web.telemetry-path |
– путь, на котором будут доступны метрики экспортера
Если используется docker-compose
В данном случае nginx-exporter добавим в docker-compose, с помощью которого запущенны различные приложения, включая Nginx, с которого собираются метрики
Добавляем nginx-exporter в docker-compose.yml
1 |
# nano docker-compose.yml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
… ### NGINX Exporter ######################################### nginx-exporter: image: nginx/nginx-prometheus-exporter:0.4.2 container_name: nginx-exporter restart: unless-stopped environment: - SCRAPE_URI=http://nginx/nginx_status - TELEMETRY_PATH=/metrics - NGINX_RETRIES=10 ports: - "10.101.90.1:9113:9113" networks: - frontend #mem_limit: 128m # for docker-compose v2 only #mem_reservation: 64m # for docker-compose v2 only logging: driver: "json-file" options: max-size: "5m" |
Проверка синтаксиса docker-compose-файла
1 |
# docker-compose config |
Создание и запуск nginx-exporter контейнера
1 |
# docker-compose up -d nginx-exporter |
Проверяем наличие запущенного nginx-exporter контейнера, который будет собирать метрики с nginx-сервера
1 |
# docker-compose ps | grep nginx-exporter |
1 |
nginx-exporter /usr/bin/exporter Up 10.103.90.1:9113->9113/tcp |
1 |
# netstat -nlptu | grep 9113 |
1 |
tcp 0 0 10.101.90.1:9113 0.0.0.0:* LISTEN 32709/docker-proxy |
С хоста, на котором запущен Nginx-контейнер, проверяем доступность метрик с nginx-экспортера
1 |
# curl 10.103.90.1:9113/metrics |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# HELP nginx_connections_accepted Accepted client connections # TYPE nginx_connections_accepted counter nginx_connections_accepted 5165 # HELP nginx_connections_active Active client connections # TYPE nginx_connections_active gauge nginx_connections_active 2 # HELP nginx_connections_handled Handled client connections # TYPE nginx_connections_handled counter nginx_connections_handled 5165 # HELP nginx_connections_reading Connections where NGINX is reading the request header # TYPE nginx_connections_reading gauge nginx_connections_reading 0 # HELP nginx_connections_waiting Idle client connections # TYPE nginx_connections_waiting gauge nginx_connections_waiting 1 # HELP nginx_connections_writing Connections where NGINX is writing the response back to the client # TYPE nginx_connections_writing gauge nginx_connections_writing 1 # HELP nginx_http_requests_total Total http requests # TYPE nginx_http_requests_total counter nginx_http_requests_total 14600 # HELP nginx_up Status of the last metric scrape # TYPE nginx_up gauge nginx_up 1 # HELP nginxexporter_build_info Exporter build information # TYPE nginxexporter_build_info gauge nginxexporter_build_info{gitCommit="f017367",version="0.4.2"} 1 |
С мониторинг хоста
1 |
# curl 10.101.90.1:9113/metrics |
Получаем также успешный ответ
3.Настройка Prometheus-а для сбора метрик с Nginx-экспортера
Добавляем nginx-экпортер в service discovery файл
1 |
# nano prometheus/sd/targets-nginx-exporter.yml |
1 2 3 4 5 |
- targets: - f3.mydomain.com:9113 labels: env: staging job: nginx-exporter |
Подключаем этот service discovery файл в Prometheus
1 |
# nano prometheus/prometheus.yml |
1 2 3 4 5 6 |
…… - job_name: 'nginx-exporter' file_sd_configs: - files: - sd/targets-nginx-exporter.yml …… |
Проверка синтаксиса конфиг.файла Prometheus и файлов с правилами
1 |
# (cd /home/myusername/monstack && ../prometheus-2.10.0.linux-amd64/promtool check config ./prometheus/prometheus.yml && echo OK || echo FAIL) |
Перечитываем конф.файл Prometheus
1 |
# curl -X POST https://adminuser:adminpassword@prometheus.mydomain.com/-/reload |
После чего проверяем в Prometheus наличие новой цели для мониторинга
1 |
Prometheus->Status->Target-> |
4.Импортирование/настройка dashboard Grafana для визуализации метрик
Импортируем дашбоард отсюда
https://github.com/nginxinc/nginx-prometheus-exporter/tree/master/grafana
Я изменил его под свои задачи
Nginx-dashboard.zip
5.Настрйка правил Prometheus для мониторинга Nginx показателей
Добавление несколько правил для мониторинга Nginx в Prometheus
1.Запущен ли Nginx (nginx_is_running)
2.Все ли принятые Nginx-ом подключения были обработаны (nginx_not_all_connections_are_handled)
3.Превышение текущего количества активных подключений определенного значения для нескольких(двух) сайтов(nginx_high_number_active_connections)
1 |
# nano prometheus/services_rules.yml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
groups: - name: nginx rules: - alert: nginx_is_running expr: nginx_up == 0 for: 30s labels: severity: critical annotations: summary: "Critical: Nginx is down on the host {{ $labels.instance }}." description: "Nginx has been down for more than 30 seconds" - alert: nginx_not_all_connections_are_handled expr: rate (nginx_connections_handled{job="nginx-exporter"}[5m]) / rate (nginx_connections_accepted{job="nginx-exporter"}[5m]) <1 for: 2m labels: severity: critical annotations: description: "Critical: Nginx does not handle all accept connections on the host {{ $labels.instance }} for more than 3 minutes" summary: "Nginx issue with handling connections" - alert: nginx_high_number_active_connections_f3.mydomain.com expr: nginx_connections_active{instance="f3.mydomain.com:9113",job="nginx-exporter"} > 3000 for: 3m labels: severity: critical annotations: description: "Critical: Nginx high number active connections on the host {{ $labels.instance }} for more than 3 minutes" summary: "Nginx high number active connections" - alert: nginx_high_number_active_connections_f4.mydomain.com expr: nginx_connections_active{instance="f4.mydomain.com:9113",job="nginx-exporter"} > 1500 for: 3m labels: severity: critical annotations: description: "Critical: Nginx high number active connections on the host {{ $labels.instance }} for more than 3 minutes" summary: "Nginx high number active connections" |
Источник:
https://github.com/nginxinc/nginx-prometheus-exporter
https://github.com/nginxinc/nginx-prometheus-exporter/tree/master/grafana
https://dimitr.im/monitoring-nginx-with-prometheus-and-grafana
http://nginx.org/en/docs/http/ngx_http_stub_status_module.html#stub_status