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
-
7631 100 7631 0 0 10.3M 0 --:--:-- --:--:-- --:--:-- 7452k
HELP nginx_vts_server_requests_total The requests counterTYPE nginx_vts_server_requests_total counter
nginx_vts_server_requests_total{host="10.10.240.203",code="1xx"} 0nginx_vts_server_requests_total{host="10.10.240.203",code="2xx"} 1663nginx_vts_server_requests_total{host="10.10.240.203",code="3xx"} 0nginx_vts_server_requests_total{host="10.10.240.203",code="4xx"} 0nginx_vts_server_requests_total{host="10.10.240.203",code="5xx"} 0nginx_vts_server_requests_total{host="10.10.240.203",code="total"} 1663nginx_vts_server_requests_total{host="linuxea.ds.com",code="1xx"} 0nginx_vts_server_requests_total{host="linuxea.ds.com",code="2xx"} 0nginx_vts_server_requests_total{host="linuxea.ds.com",code="3xx"} 294nginx_vts_server_requests_total{host="linuxea.ds.com",code="4xx"} 0nginx_vts_server_requests_total{host="linuxea.ds.com",code="5xx"} 0nginx_vts_server_requests_total{host="linuxea.ds.com",code="total"} 294nginx_vts_server_requests_total{host="*",code="1xx"} 0nginx_vts_server_requests_total{host="*",code="2xx"} 1663nginx_vts_server_requests_total{host="*",code="3xx"} 294nginx_vts_server_requests_total{host="*",code="4xx"} 0nginx_vts_server_requests_total{host="*",code="5xx"} 0nginx_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 linuxeaNew 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;
}}
接着打开就需要认证了 ![20180801-2.png][2] 到此nginx认证完成 #### 配置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记录,将显示所有IPfilterZones
。在上述设置中,当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