linuxea:nginx流量监控模块nginx-module-vts使用


nginx-module-vts他可以记录单个页面的流量,http status的流量,后端代理的流量已经动态dns的流量,还有来自地区/国家的流量,其中可以进行限制流量,并且他还有一个页面,可以根据server_name进行统计域名的流量已经状态码,只需要简单的配置和编译就可以实现,如果希望使用docker,那就太好了,因为我已经为你准备好了示例 docker安装nginx1.14.0-vts

模块的下载

这里还加了luajit-2.0

[root@linuxea-VM-Node203 ~]# git clone git://github.com/vozlt/nginx-module-vts.git "/usr/local/nginx-module-vts"
[root@linuxea-VM-Node203 ~]# git clone git://github.com/vozlt/nginx-module-sts.git "/usr/local/nginx-module-sts"
[root@linuxea-VM-Node203 ~]# git clone git://github.com/vozlt/nginx-module-stream-sts.git "/usr/local/nginx-module-stream-sts"
### git clone lua_module
[root@linuxea-VM-Node203 ~]# curl -Lk https://github.com/simplresty/ngx_devel_kit/archive/v0.3.1rc1.tar.gz |tar xz -C /usr/local
[root@linuxea-VM-Node203 ~]#  curl -Lk https://github.com/openresty/lua-nginx-module/archive/v0.10.13.tar.gz |tar xz -C  /usr/local
[root@linuxea-VM-Node203 ~]#  curl -Lk http://luajit.org/download/LuaJIT-2.0.5.tar.gz |tar xz -C /usr/local
[root@linuxea-VM-Node203 ~]# cd /usr/local/LuaJIT-2.0.5 && make && make install 
[root@linuxea-VM-Node203 ~]# export LUAJIT_LIB=/usr/local/lib
[root@linuxea-VM-Node203 ~]# export LUAJIT_INC=/usr/local/include/luajit-2.0

编译安装

我们下载最新的nginx,创建用户,编译并添加模块

[root@linuxea-VM-Node203 ~]# useradd www -s /sbin/nologin -M
[root@linuxea-VM-Node203 ~]# curl -Lk http://nginx.org/download/nginx-1.14.0.tar.gz |tar xz -C /usr/local 
[root@linuxea-VM-Node203 ~]#  cd /usr/local/nginx-1.14.0 && ./configure \
--prefix=/usr/local/nginx \
--conf-path=/etc/nginx/nginx.conf \
--user=www \
--group=www \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_geoip_module \
--http-client-body-temp-path=/var/tmp/nginx/client \
--http-proxy-temp-path=/var/tmp/nginx/proxy \
--http-fastcgi-temp-path=/var/tmp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
--add-module=/usr/local/lua-nginx-module-0.10.13 \
--add-module=/usr/local/ngx_devel_kit-0.3.1rc1 \
--add-module=/usr/local/nginx-module-vts \
--with-stream \
--add-module=/usr/local/nginx-module-sts \
--add-module=/usr/local/nginx-module-stream-sts && make -j2 && make install
[root@linuxea-VM-Node203 /usr/local/nginx-1.14.]#  ln -s /usr/local/lib/libluajit-5.1.so.2 /lib/ 

nginx-module-vts配置文件

我分别编辑了两个conf文件include进去
加载主配置文件在http部分 : nginx-module-vts_zone.conf

geoip_country /etc/nginx/GeoIP.dat;  # 使用GeoIP计算各个国家/地区的流量
vhost_traffic_status_zone; # 必须的指令
vhost_traffic_status_filter_by_host on; # 以server_name的形式展示
#vhost_traffic_status_bypass_stats on; # 不会统计流量页面的数据流量
vhost_traffic_status_filter_by_set_key $geoip_country_code country::*; # # 使用GeoIP计算各个国家/地区的流量
    map $http_user_agent $filter_user_agent { # 计算单个用户代理的流量
        default 'unknown';
        ~iPhone ios;
        ~Android android;
        ~(MSIE|Mozilla) windows;
    }
vhost_traffic_status_filter_by_set_key $filter_user_agent agent::*; # 计算单个用户代理的流量

加载vhost的server部分: nginx-module-vts_zone.conf

vhost_traffic_status_set_by_filter $variable group/zone/name; # 获取存储在共享内存中的指定状态值。
vhost_traffic_status_filter_by_set_key $geoip_country_code country::$server_name; # 以server_name的形式展示
vhost_traffic_status_bypass_stats on; # 不会统计流量页面的数据流量
vhost_traffic_status_filter_by_set_key $status $server_name; # 计算详细的http状态代码的流量
vhost_traffic_status_filter_by_set_key $filter_user_agent agent::$server_name; # 计算单个用户代理的流量

或者可以这样
http段直接加

    vhost_traffic_status_zone;
    vhost_traffic_status_filter_by_host on; 

server段直接加

server {
    listen 8295;
    server_name localhost;
# disaned status vhost_traffic_status off;  
#   vhost_traffic_status off;
        location /status {
            vhost_traffic_status_display;
            vhost_traffic_status_display_format html;
        }
    }

打开浏览器web-name:8295/status

  • 这个模块本身是可以直接用来prometheus使用的,只要访问/status/format/prometheus即可,本地来搞一下看看效果,过滤一段试试
[root@linuxea-VM-Node203 /etc/nginx]# curl 10.10.240.203:8295/status/format/prometheus|grep nginx_vts_server_requests_total
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  7631  100  7631    0     0  10.3M      0 --:--:-- --:--:-- --:--:-- 7452k
# HELP nginx_vts_server_requests_total The requests counter
# TYPE nginx_vts_server_requests_total counter
nginx_vts_server_requests_total{host="10.10.240.203",code="1xx"} 0
nginx_vts_server_requests_total{host="10.10.240.203",code="2xx"} 1663
nginx_vts_server_requests_total{host="10.10.240.203",code="3xx"} 0
nginx_vts_server_requests_total{host="10.10.240.203",code="4xx"} 0
nginx_vts_server_requests_total{host="10.10.240.203",code="5xx"} 0
nginx_vts_server_requests_total{host="10.10.240.203",code="total"} 1663
nginx_vts_server_requests_total{host="linuxea.ds.com",code="1xx"} 0
nginx_vts_server_requests_total{host="linuxea.ds.com",code="2xx"} 0
nginx_vts_server_requests_total{host="linuxea.ds.com",code="3xx"} 294
nginx_vts_server_requests_total{host="linuxea.ds.com",code="4xx"} 0
nginx_vts_server_requests_total{host="linuxea.ds.com",code="5xx"} 0
nginx_vts_server_requests_total{host="linuxea.ds.com",code="total"} 294
nginx_vts_server_requests_total{host="*",code="1xx"} 0
nginx_vts_server_requests_total{host="*",code="2xx"} 1663
nginx_vts_server_requests_total{host="*",code="3xx"} 294
nginx_vts_server_requests_total{host="*",code="4xx"} 0
nginx_vts_server_requests_total{host="*",code="5xx"} 0
nginx_vts_server_requests_total{host="*",code="total"} 1957
[root@linuxea-VM-Node203 /etc/nginx]# 

当然这样一来安全就有些问题了

配置nginx认证

在公网上跑的时候出来iptables的防火墙对固定ip放行端口的同时,一定要在骚一些弄个用户验证
生成一个htpasswd的用户和密码,用户名:linuxea 密码:www.linuxea.com

[root@linuxea-VM-Node63 /etc/nginx/vhost]# htpasswd -c /usr/local/ngxpasswd linuxea
New password: 
Re-type new password: 
Adding password for user linuxea

添加到nginx的状态页面中来
主要添加如下:

    auth_basic "Please enter your id and password!";
    auth_basic_user_file /etc/nginx/ngxpasswd;

如下:

server {
    listen 8295;
    server_name localhost;
    auth_basic "Please enter your id and password!";
    auth_basic_user_file /etc/nginx/ngxpasswd;

    #disaned status vhost_traffic_status off;   
    vhost_traffic_status off;
    location /status {
        vhost_traffic_status_display;
        vhost_traffic_status_display_format html;
    }
}

接着打开就需要认证了

到此nginx认证完成

配置prometheus抓取端

打开prometheus进行配置文件配置,prometheus安装参考

  • metrics_path字段的位置需要写明/status/format/prometheus
  • basic_auth 用户和密码,在上面进行配置nginx的认证的那些
  - job_name: "nginx"
    metrics_path: /status/format/prometheus
    basic_auth:
      username: linuxea
      password: 'www.linuxea.com'
    static_configs:
    - targets:
      - '10.10.240.203:8295'
      labels:
        group: 'nginx'

添加到proentheus上可以抓取,

  • 如果有问题,你应该检查targets是否up

安装nginx-vts-exporter

事实上在我对比后,nginx-vts-exporter更适用prometheus抓取,里面有一些是nginx-module-vts没有的,so,我们进行安装nginx-vts-exporter

[root@linuxea-VM-Node203 /etc/nginx/vhost]# docker pull sophos/nginx-vts-exporter:latest
[root@linuxea-VM-Node203 ~]# docker run  -ti --rm --env NGINX_STATUS="http://linuxea:www.linuxea.com@localhost:8295/status/format/json" sophos/nginx-vts-exporter

这时候会启动9913端口,通过浏览器可以访问(你可能需要做好防火墙规则),因为之前加了验证,这里需要添加用户和密码http://linuxea:www.linuxea.com@localhost:8295/status/format/json

  • 通过9913端口可以查看所有的指标。我这里用linuxea做测试
[root@linuxea-VM-Node203 /etc/nginx/vhost]# curl http://10.10.240.203:9913/metrics|grep "linuxea"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  7028  100  7028    0     0  2013k      0 --:--:-- --:--:-- --:--:-- 2287k
nginx_server_bytes{direction="in",host="linuxea.ds.com"} 1.700065e+06
nginx_server_bytes{direction="out",host="linuxea.ds.com"} 1.240604e+06
nginx_server_cache{host="linuxea.ds.com",status="bypass"} 0
nginx_server_cache{host="linuxea.ds.com",status="expired"} 0
nginx_server_cache{host="linuxea.ds.com",status="hit"} 0
nginx_server_cache{host="linuxea.ds.com",status="miss"} 0
nginx_server_cache{host="linuxea.ds.com",status="revalidated"} 0
nginx_server_cache{host="linuxea.ds.com",status="scarce"} 0
nginx_server_cache{host="linuxea.ds.com",status="stale"} 0
nginx_server_cache{host="linuxea.ds.com",status="updating"} 0
nginx_server_requestMsec{host="linuxea.ds.com"} 0
nginx_server_requests{code="1xx",host="linuxea.ds.com"} 0
nginx_server_requests{code="2xx",host="linuxea.ds.com"} 40
nginx_server_requests{code="3xx",host="linuxea.ds.com"} 3792
nginx_server_requests{code="4xx",host="linuxea.ds.com"} 1
nginx_server_requests{code="5xx",host="linuxea.ds.com"} 0
nginx_server_requests{code="total",host="linuxea.ds.com"} 3833

直接使用prometheus
如:查看nginx_server_requests指标,host为linuxea.ds.com,30s的数据,只显示code和host字段

sum (irate(nginx_server_requests{host!="*",host="linuxea.ds.com",code!="total"}[30s])) by (code,host)


并且可以和grafana配合使用,我这里将官网的模板也inport进去了,你可以去我gitlhub下载nginx-vts-stats_rev2 (1).json,也可以去grafana下载
当你Import dashboard 后你会看到这样的一个画面

额外的nginx-module-sts配置

nginx http段添加stream_server_traffic_status_zone;
在http内include vhost/stream.conf;
在http外include stream_server.conf;
创建server段文件

[root@linuxea-VM-Node203 /etc/nginx]# cat vhost/stream.conf 
server {
    listen 82;
    server_name linuxea.ds.com;
    location /status {
        stream_server_traffic_status_display;
        stream_server_traffic_status_display_format html;
    }
    }

创建stream_server.conf 文件

[root@linuxea-VM-Node203 /etc/nginx]# cat stream_server.conf 
stream {
    geoip_country /etc/nginx/GeoIP.dat;
    server_traffic_status_zone;
    server_traffic_status_filter_by_set_key $geoip_country_code country::*;
    server {
        server_traffic_status_filter_by_set_key $geoip_country_code country::$server_addr:$server_port;
}

部分参数

对location指令的正则表达式匹配的单个storage的流量。

http {
    vhost_traffic_status_zone;

    ...

    server {

        ...

        location ~ ^/storage/(.+)/.*$ {
            set $volume $1;
            vhost_traffic_status_filter_by_set_key $volume storage::$server_name;
        }

        location /status {
            vhost_traffic_status_display;
            vhost_traffic_status_display_format html;
        }
    }
}

计算单个用户代理的流量

  • 计算个人的流量 http_user_agent
http {
    vhost_traffic_status_zone;

    map $http_user_agent $filter_user_agent {
        default 'unknown';
        ~iPhone ios;
        ~Android android;
        ~(MSIE|Mozilla) windows;
    }

    vhost_traffic_status_filter_by_set_key $filter_user_agent agent::*;

    ...

    server {

        ...

        vhost_traffic_status_filter_by_set_key $filter_user_agent agent::$server_name;

        location /status {
            vhost_traffic_status_display;
            vhost_traffic_status_display_format html;
        }
    }
}

http status code状态码的流量

http {
    vhost_traffic_status_zone;

    server {

        ...

        vhost_traffic_status_filter_by_set_key $status $server_name;

        location /status {
            vhost_traffic_status_display;
            vhost_traffic_status_display_format html;
        }
    }
}

计算动态dns的流量
如果域具有多个DNS A记录,则可以使用过滤器功能或proxy_pass中的变量计算域的各个IP的流量。

http {
    vhost_traffic_status_zone;

    upstream backend {
        elb.example.org:80;
    }

    ...

    server {

        ...

        location /backend {
            vhost_traffic_status_filter_by_set_key $upstream_addr upstream::backend;
            proxy_pass backend;
        }
    }
}
  • 计算域的各个IP的流量elb.example.org。如果elb.example.org有多个DNS A记录,将显示所有IP filterZones。在上述设置中,当NGINX启动或重新加载配置时,它会查询DNS服务器以解析域,并将DNS A记录缓存在内存中。因此,即使DNS管理员对DNS A记录进行了分区,DNS A记录也不会在内存中更改,除非NGINX重新启动或重新加载。
http {
    vhost_traffic_status_zone;

    resolver 10.10.10.53 valid=10s

    ...

    server {

        ...

        location /backend {
            set $backend_server elb.example.org;
            proxy_pass http://$backend_server;
        }
    }
}
  • 计算域的各个IP的流量elb.example.org。如果elb.example.org更改了DNS A记录,将同时显示旧IP和新IP ::nogroups。与第一个上游组设置不同,即使DNS管理员对DNS A记录进行了分析,第二个设置也能正常工作。
    永久保留统计数据
http {
    vhost_traffic_status_zone;
    vhost_traffic_status_dump /var/log/nginx/vts.db;

    ...

    server {

        ...

    }
}

vhost_traffic_status_filter_by_host on; 会更加不同的server_name进行统计
参考 : https://github.com/vozlt/nginx-module-vts

1 分享

您可以选择一种方式赞助本站

支付宝扫码赞助

支付宝扫码赞助

日期: 2018-08-13分类: Nginx

标签: nginx

发表评论