promethues监控nginx可选两个exporter,通过nginx_exporter主要是获取nginx-status中的内建的指标,nginx自身提供status信息,较为简单,promethues中对应的metrics也较少,想要监控更多的指标可以通过nginx-vts-exporter采集信息,依赖在编译nginx的时候添加nginx-module-vts模块来实现。nginx virtual host traffic status模块是nginx第三方模块之一,vts提供了访问虚拟主机状态的信息,包含server,upstream以及cache的当前状态,类似于NGINX Plus 提供的在线活动监控功能。
Nginx_exporter安装
修改nginx.conf中监听80端口的server段添加如下location配置
server {
listen 80;
..............................
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
}
................................
}
重新加载配置文件,访问测试是否可以获取监控信息
# nginx -s reload
# curl http://localhost/nginx_status
Active connections: 1 #活跃的连接数量
server accepts handled requests #总共处理了1959个连接 , 成功创建1959次握手, 总共处理了2198个请求
1959 1959 2198
Reading: 0 Writing: 1 Waiting: 0
读取客户端的连接数0
响应数据到客户端的数量1
Nginx已经处理完正在等候下一次请求指令的驻留连接0,
开启keep-alive的情况下,Waiting=active–(reading+writing)
下载nginx_exporter,需要使用go语言环境将源码编译成二进制可执行文件,完成后运行命令查看使用帮助
# ./nginx_exporter --help
Usage of ./nginx_exporter:
-insecure #若使用了https默认忽略服务证书
Ignore server certificate if using https (default true)
-nginx.scrape_uri string #访问nginx_status的地址,默认为localhost,可根据实际情况修改
URI to nginx stub status page (default "http://localhost/nginx_status")
-telemetry.address string #默认监听9113端口
Address on which to expose metrics. (default ":9113")
-telemetry.endpoint string
Path under which to expose metrics. (default "/metrics")
若不需要特殊设置,可直接启动exporter,成功运行后在promethues server端添加target
# nohup /opt/nginx_exporter &
Nginx-vts模块安装
克隆git仓库
# git clone git://github.com/vozlt/nginx-module-vts.git
添加nginx-module-vts模块,构建编译配置,完成后make&&make install
./configure --prefix=/usr/local/nginx \
--with-http_gzip_static_module \
.....................................
--add-module=/usr/local/src/nginx-module-vts
修改nginx配置文件
http {
......................................................
vhost_traffic_status_zone;
......................................................
server {
listen 80;
server_name localhost;
.......................................................
location /status {
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}
}
}
启动nginx,查看输出
# curl http://localhost/status/format/json
{
"hostName": "nginx-vts",
"nginxVersion": "1.12.2",
"loadMsec": 1523696640973,
"nowMsec": 1523706344593,
"connections": {
"active": 3,
"reading": 0,
"writing": 1,
"waiting": 2,
"accepted": 108,
"handled": 108,
"requests": 9728
},
"sharedZones": {
"name": "ngx_http_vhost_traffic_status",
"maxSize": 1048575,
"usedSize": 2446,
"usedNode": 1
},
"serverZones": {
"localhost": {
"requestCounter": 9727,
"inBytes": 3086128,
"outBytes": 33977540,
"responses": {
"1xx": 0,
"2xx": 9727,
"3xx": 0,
"4xx": 0,
"5xx": 0,
"miss": 0,
"bypass": 0,
"expired": 0,
"stale": 0,
"updating": 0,
"revalidated": 0,
"hit": 0,
"scarce": 0
},
"requestMsec": 0,
"requestMsecs": {
"times": [1523706282909, 1523706283914, 1523706284910, 1523706285913, 1523706333910, 1523706334914, 1523706335918, 1523706336914, 1523706337911, 1523706338911, 1523706339914, 1523706340911, 1523706341910, 1523706342911, 1523706343911],
"msecs": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
},
"overCounts": {
"maxIntegerSize": 18446744073709551615,
"requestCounter": 0,
"inBytes": 0,
"outBytes": 0,
"1xx": 0,
"2xx": 0,
"3xx": 0,
"4xx": 0,
"5xx": 0,
"miss": 0,
"bypass": 0,
"expired": 0,
"stale": 0,
"updating": 0,
"revalidated": 0,
"hit": 0,
"scarce": 0
}
},
"*": {
"requestCounter": 9727,
"inBytes": 3086128,
"outBytes": 33977540,
"responses": {
"1xx": 0,
"2xx": 9727,
"3xx": 0,
"4xx": 0,
"5xx": 0,
"miss": 0,
"bypass": 0,
"expired": 0,
"stale": 0,
"updating": 0,
"revalidated": 0,
"hit": 0,
"scarce": 0
},
"requestMsec": 0,
"requestMsecs": {
"times": [1523706283914, 1523706284910, 1523706285913, 1523706286317, 1523706334914, 1523706335918, 1523706336914, 1523706337911, 1523706338911, 1523706339914, 1523706340911, 1523706341910, 1523706342911, 1523706343911, 1523706281909],
"msecs": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
},
"overCounts": {
"maxIntegerSize": 18446744073709551615,
"requestCounter": 0,
"inBytes": 0,
"outBytes": 0,
"1xx": 0,
"2xx": 0,
"3xx": 0,
"4xx": 0,
"5xx": 0,
"miss": 0,
"bypass": 0,
"expired": 0,
"stale": 0,
"updating": 0,
"revalidated": 0,
"hit": 0,
"scarce": 0
}
}
}
}
TIPS:
若当前线上已运行的nginx在当初编译时未加载vts模块,想要通过vts获取监控指标需要重新编译,在第一次编译安装的configure命令后添加参数--add-module=/usr/local/src/nginx-module-vts,再替换可执行文件。重新编译后会在nginx源码根目录下新生成一个objs目录,此目录下的nginx为新生成的二进制文件
# ll objs
total 7032
drwxr-xr-x 3 root root 4096 Apr 14 14:31 addon
-rw-r--r-- 1 root root 17998 Apr 14 14:31 autoconf.err
-rw-r--r-- 1 root root 48900 Apr 14 14:31 Makefile
-rwxr-xr-x 1 root root 7000009 Apr 14 14:33 nginx
-rw-r--r-- 1 root root 5433 Apr 14 14:33 nginx.8
-rw-r--r-- 1 root root 7482 Apr 14 14:31 ngx_auto_config.h
-rw-r--r-- 1 root root 657 Apr 14 14:31 ngx_auto_headers.h
-rw-r--r-- 1 root root 6183 Apr 14 14:31 ngx_modules.c
-rw-r--r-- 1 root root 93680 Apr 14 14:33 ngx_modules.o
drwxr-xr-x 9 root root 4096 Apr 14 09:48 src
将第一次编译的二进制文件备份,然后替换新的
# cp /apollo/env/nginx/thirdparty.nginx-1.12/sbin/nginx /apollo/env/nginx/thirdparty.nginx-1.12/sbin/nginx.bak20180414
# cp /usr/local/src/nginx-1.12.2/objs/nginx /apollo/env/nginx/thirdparty.nginx-1.12/sbin/nginx
cp: overwrite `/apollo/env/nginx/thirdparty.nginx-1.12/sbin/nginx'? y
替换前需要先停止nginx服务,否则会报错
cp: cannot create regular file `/apollo/env/nginx/thirdparty.nginx-1.12/sbin/nginx': Text file busy
Nginx-vts-exporter安装
在需要加入监控的客户端主机下载nginx-vts-exporter解压
[root@nginx-vts ~]# tar xvf nginx-vts-exporter-0.10.3.linux-amd64.tar.gz -C /opt/
nginx-vts-exporter-0.10.3.linux-amd64/
nginx-vts-exporter-0.10.3.linux-amd64/LICENSE
nginx-vts-exporter-0.10.3.linux-amd64/nginx-vts-exporter
# cd /opt/nginx-vts-exporter-0.10.3.linux-amd64
# ls
LICENSE nginx-vts-exporter
# ./nginx-vts-exporter -h
Usage of ./nginx-vts-exporter:
-insecure
Ignore server certificate if using https (default true)
-metrics.namespace string
Prometheus metrics namespace. (default "nginx")
-nginx.scrape_timeout int
The number of seconds to wait for an HTTP response from the nginx.scrape_uri (default 2)
-nginx.scrape_uri string
URI to nginx stub status page (default "http://localhost/status")
-telemetry.address string
Address on which to expose metrics. (default ":9913")
-telemetry.endpoint string
Path under which to expose metrics. (default "/metrics")
-version
Print version information.
# nohup /opt/nginx-vts-exporter-0.10.3.linux-amd64/nginx-vts-exporter -nginx.scrape_uri=http://localhost/status/format/json &
成功运行后在promethues Server端添加target,访问http://clientIP:9913/metrics 可查看到相关的监控指标,Grafana官网提供了VTS Stats模板,复制模板ID即可导入新的dashboard