Nginx官网有介绍各种监控方案,以前我们常用stub_status和Log日志来实现Nginx监控。本文主要介绍基于 Prometheus 的2种监控方案 nginx-lua-prometheus
和 nginx-vts-exporter
- 官网介绍的监控方案: https://www.nginx.com/blog/monitoring-nginx/
- Prometheus 集成的 HTTP Exporter 方案: https://prometheus.io/docs/instrumenting/exporters/#http
Prometheus 监控 Nginx
这里采用的方案是 nginx-module-vts + nginx-vts-exporter 方案对 Nginx 状态进行监控。
nginx-module-vts 方案
- nginx-module-vts: Nginx 监控模块,能够提供 JSON 格式的数据输出;
- nginx-vts-exporter: 主要用于收集 Nginx 的监控数据,并给 Prometheus 提供监控接口,默认端口号是 9913;
- Prometheus: 监控Nginx-vts-exporter提供的Nginx数据,并存储在时序数据库中。
添加 nginx 模块
可以使用 nginx -V 查看当前 Nginx 所包含的模块
1
2
3
4
5nginx version: nginx/1.20.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.1.1k 25 Mar 2021
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module --with-openssl=../openssl-1.1.1k --with-pcre=../pcre-8.44 --with-pcre-jit --with-ld-opt=-ljemalloc获取最新的 nginx-module-vts 源码,以及所安装的 nginx 源码
1
2
3
4
5
6# 下载 nginx-module-vts
wget -P /usr/local/src https://github.com/vozlt/nginx-module-vts/archive/refs/tags/v0.1.18.tar.gz
tar xvf v0.1.18.tar.gz
# 下载 nginx 源码包
wget -P /usr/local/src https://nginx.org/download/nginx-1.20.1.tar.gz重新编译安装 nginx
1
2
3
4
5
6
7tar xf nginx-1.20.1.tar.gz && cd nginx-1.20.1/
# 编译 Nginx,添加 nginx-module-vts 模块,记得下载 openssl-1.1.1k 源码包并解压到 /usr/local/src 目录
./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module --with-openssl=../openssl-1.1.1k --with-pcre=../pcre-8.44 --with-pcre-jit --with-ld-opt=-ljemalloc --add-module=../nginx-module-vts-0.1.18/
# 编译安装
make && make install检查 nginx 模块是否加载
1
2
3
4
5
6# nginx -V
nginx version: nginx/1.20.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.1.1k 25 Mar 2021
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module --with-openssl=../openssl-1.1.1k --with-pcre=../pcre-8.44 --with-pcre-jit --with-ld-opt=-ljemalloc --add-module=../nginx-module-vts-0.1.18/
配置 Nginx
在 Nginx Server 中添加以下配置
1
2
3
4
5
6
7server {
listen 80;
location /nginx_status {
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}
}在 http 配置段添加以下内容
1
2
3
4
5vhost_traffic_status_zone; # 开启基础监控
vhost_traffic_status_filter_by_host on; # 开启此功能,会根据不同 server_name 进行统计,否则会默认把所有流量统计到第一个 server_name 上
vhost_traffic_status_filter on;
vhost_traffic_status_filter_by_set_key $status $server_name; # 开启详细装状态码统计
vhost_traffic_status_filter_by_set_key $uri uris::$server_name; # 开启 URL 分类重启 nginx,否则不会调用新编译构建的 nginx 二进制文件
1
2
3
4
5# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
# systemctl restart nginx打开浏览器,访问
http://xxx.xx.xxx.xxx/nginx_status
,效果如下:
安装 nginx-vts-exporter
下载 nginx-vts-exporter
1
wget https://github.com/hnlq715/nginx-vts-exporter/archive/refs/tags/v0.10.7.tar.gz
由于最新版的 nginx-vts-exporter 不提供二进制包了,而且源码编译时报错,所以这里使用 0.10.3 版本的二进制包
1
2
3
4
5
6# 下载安装包
wget https://github.com/hnlq715/nginx-vts-exporter/releases/download/v0.10.3/nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
# 安装
tar xvf nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
mv nginx-vts-exporter-0.10.3.linux-amd64 /usr/local/nginx-vts-exporter使用systemctl 管理nginx-vts-exporter进程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15cat >/usr/lib/systemd/system/nginx-vts-exporter.service <<EOF
[Unit]
Description=nginx-vts-exporter
After=network.target
[Service]
Restart=on-failure
ExecStart=/usr/local/nginx-vts-exporter/nginx-vts-exporter -nginx.scrape_uri=http://192.168.55.17/nginx_status/format/json
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now nginx-vts-exporter打开浏览器,测试访问
http://192.168.55.17:9913/metrics
配置 Prometheus 抓取指标
编辑 prometheus.yml 文件,在最下面增加如下内容
1
2
3
4
5
6
7
8
9
10
11
12
13# 以下是需要抓取的 Nginx 状态指标信息
- file_sd_configs:
- files:
- 'configs/nginx.yml'
refresh_interval: 10s
job_name: 'Nginx'
metrics_path: /metrics
metric_relabel_configs:
relabel_configs:
- source_labels: [__address__]
regex: (.*):(\d+)
target_label: instance
replacement: $1新建 configs/nginx.yml 文件,内容如下
1
2
3
4
5
6
7
8
9
10
11
12- labels:
env: 'prod'
region: 'dg2'
hostname: 'proxy'
targets:
- '192.168.55.17:9913'
- labels:
env: 'test'
region: 'aliyun'
hostname: 'aliyun-apps'
targets:
- '47.106.189.204:9913'刷新 Prometheus 配置
1
curl -X POST http://localhost:9090/-/reload
浏览器访问 Prometheus web界面,查看 Targes 是否以存在 nginx job
在 nginx-vts-exporter 项目仓库找,找到 dashboard 目录,下载 dashboard 配置文件,上传到 Grafana,然后稍加修改,效果如下