Использование модуля nginx_module_vts для сбора расширенной статистики Nginx
Oct 26, 2017 08:37 · 407 words · 2 minute read
Была поставлена задача замерять количество входящего/исходящего траффика для определенного сайта. Сделать это можно с помощью 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 находится здесь (конечно же его придется доработать и расширить под свои нужды).