в monitoring, nginx, prometheus

Использование модуля nginx-module-vts для сбора расширенной статистики Nginx

nginx
Была поставлена задача замерять количество входящего/исходящего траффика для определенного сайта. Сделать это можно с помощью Nginx virtual host traffic status module (nginx-module-vts) — давайте разберемся!

Прежде всего, необходимо собрать Nginx с поддержкой модуля nginx-module-vts — мы уже многократно использовали самостоятельные сборки (с http2, с APLN, с brotli, с PageSpeed и с ngx_cache_purge), поэтому никаких затруднений быть не должно.

Скачиваем и распаковываем исходники актуальной версии Nginx:

cd /opt/ && wget https://nginx.org/download/nginx-1.13.5.tar.gz && tar xf nginx-1.13.5.tar.gz

Получаем код модуля nginx-module-vts актуальной версии:

curl -fSL https://github.com/vozlt/nginx-module-vts/archive/v0.1.15.tar.gz | tar xzf - -C /tmp

Находясь в каталоге с исходниками Nginx собираем его:

./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules \
--conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module \
--with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module \
--with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module \
--with-http_stub_status_module --with-http_auth_request_module --with-threads --with-stream \
--with-stream_ssl_module --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio \
--with-http_v2_module --with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security \
-Wp,-D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,--as-needed' \
--add-module=/tmp/nginx-module-vts-0.1.15
make
make install
service nginx restart

В секции http конфигурационного файла /etc/nginx/nginx.conf добавляем следующую строку:

...
    vhost_traffic_status_zone;
...

В настройки сайта (секция server) добавим еще один локейшн (это вариант базовой настройки, все доступные директивы и примеры использования здесь):

server {
...
  location /vhost_status {
    vhost_traffic_status on;
    vhost_traffic_status_display;
    vhost_traffic_status_display_format html;
  }
...
}

Применяем изменения:

nginx -s reload

Через некоторое время можно перейти по адресу http://имя_сервера/vhost_status и посмотреть на собранные данные:

Статистика успешно собирается, но она ведется с момента старта веб-сервера Nginx. Если же нужно вывести данные за какой-то промежуток времени (час/день/неделя и т.д.), то следует перенаправлять данные метрики в систему мониторинга (например, Prometheus) и на их основе строить дашборды/графики (например, в Grafana).

Экспортер метрик конечно же будем запускать в docker-контейнере. Более того, если вы уже настраивали мониторинг docker c помощью Prometheus, то советую добавить описание еще одного сервиса (контейнера) в существующий файл docker-compose.yml:

version: '2'
services:
  ...
  prodvtsexporter:
    image: sophos/nginx-vts-exporter
    container_name: prodvtsexporter
    environment:
      - NGINX_HOST=http://my.example.com/vhost_status/format/json
    restart: unless-stopped
    expose:
      - 9913
    ports:
      - 9913:9913
...

Обновляем сервисы из файла с помощью команды:

docker-compose up -d

В конфигурационный файл prometheus.yml (в debian-based дистрибутивах находится в каталоге /etc/prometheus) добавляем следующие строки:

- job_name: 'prod_nginx_vts_exporter'
  static_configs:
    - targets: ['prodvtsexporter:9913']

и перезапускаем Prometheus для применения изменений.

Больше информации об экспортере можно найти тут, а готовый дашборд для Grafana находится здесь (конечно же его придется доработать и расширить под свои нужды).

Добавить комментарий