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

Oct 26, 2017 08:37 · 407 words · 2 minute read nginx

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

Прежде всего, необходимо собрать Nginx с поддержкой модуля nginx-module-vts — мы уже многократно использовали самостоятельные сборки (с http2, с ALPN, с 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 находится здесь (конечно же его придется доработать и расширить под свои нужды).

tweet Share