Prometheus+Grafana构建云原生分布式监控系统(四)
https://blog.csdn.net/xiaochenXIHUA/article/details/157174683
一、Prometheus监控Nginx
1.1、收集Nginx指标的三种方式
prometheus官方提供了多种收集 Nginx 指标的方式:
《1》【Nginx metric library】,这是一段Lua脚本(prometheus.lua),Nginx需要开启Lua支持(libnginx-mod-http-lua 模块)且该方式可收集到的数据内容较为简单有限。
《2》【Nginx VTS exporter】,这种方式比第一种要强大的多,安装方式更简单,支持的指标也更丰富,它依赖于【nginx-module-vts】模块,vts模块可以提供大量的 Nginx 指标数据,可以通过 JSON、HTML 等形式查看这些指标。【Nginx VTS exporter】 就是通过抓取【/status/format/json】接口来将 vts 的数据格式转换为 Prometheus 的格式。不过,在【nginx-module-vts 】最新的版本中增加了一个新接口:/status/format/prometheus,这个接口可以直接返回 Prometheus 的格式,从这点这也能看出 Prometheus的影响力,目前Nginx VTS exporter基本退役了,所以我们只需安装此模块即可。无需安装基于nginx的exporter。
《3》【推荐】在nginx中开启【nginx_stub_status】模块,然后从nginx官方下载【nginx-prometheus-exporter】即可,这是最简单,也是最权威的方式。
1.2、安装Nginx并添加nginx-module-vts模块到Nginx中
由于最新版的【nginx-module-vts】模块已经新增了【/status/format/prometheus】接口,可直接返回 Prometheus 的格式,因此只用给Nginx添加上【nginx-module-vts】模块即可。
使用源码安装配置Linux上的Web服务器------Nginx
https://coffeemilk.blog.csdn.net/article/details/150780215
bash
#在nginx中添加【nginx-module-vts】模块实现监控nginx状态
#1-安装所需依赖
yum -y install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
#2-下载【nginx-module-vts】源码文件并解压
wget https://github.com/vozlt/nginx-module-vts/archive/refs/tags/v0.2.5.tar.gz -c -P /data
cd /data
tar -zxvf v0.2.5.tar.gz -C /usr/local/
cd /usr/local/
cd nginx-module-vts-0.2.5/
ll
#3-进入nginx的源码目录中添加编译上【nginx-module-vts】模块
cd /data/nginx-1.28.1/
ls
./configure \
--prefix=/usr/local/nginx-1.28.1 \
--sbin-path=/usr/local/nginx-1.28.1/sbin/nginx \
--conf-path=/usr/local/nginx-1.28.1/conf/nginx.conf \
--pid-path=/usr/local/nginx-1.28.1/logs/nginx.pid \
--error-log-path=/usr/local/nginx-1.28.1/logs/error.log \
--http-log-path=/usr/local/nginx-1.28.1/logs/access.log \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-http_realip_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--add-module=/usr/local/nginx-module-vts-0.2.5/
make
make install





1.3、修改Nginx配置文件实现监控nginx状态
bash
#配置nginx用以获取nginx的状态信息提供给prometheus【需添加的内容如下】
http {
vhost_traffic_status_zone;
...
server {
...
location /status {
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}
}
}
#启动nginx服务让配置生效并查看进程与端口信息
systemctl start nginx.service
systemctl status nginx.service
ps -ef | grep nginx
netstat -antlp | grep nginx
#重启nginx成功后访问【IP/status】即可查看到nginx的监控信息
#或者访问【IP/status/format/prometheus】获取到prometheus可读取的格式数据
ip a





1.4、将nginx的监控状态添加到prometheus中
bash
#将nginx的监控状态添加到prometheus中
cd /usr/local/prometheus-3.5.0/
vi prometheus.yml
#【prometheus.yml】的最后【scrape_configs】下添加一个【job_name】
- job_name: "nginx"
metrics_path: /status/format/prometheus
static_configs:
- targets: ['192.168.1.37']
labels:
app: "nginx-module-vts"
#验证修改后的prometheus.yml文件的语法是否正确(结果显示SUCCESS则表示正确)
./promtool check config prometheus.yml
#验证prometheus.yml文件中的语法正确后热重载让配置生效
curl -XPOST localhost:9090/-/reload
#然后打开浏览器进入Prometheus Server的Web界面【IP:9090】查看【Status-->Target health】即可看到添加的nginx节点及其状态【up】表示在线【down】表示离线。





上图中几个状态的含义如下:
《1》accepts:接收到的客户端发来的连接数。
《2》Active :当前的活动连接数,包含处于等待状态的连接。
《3》handled:已经处理完成的连接数,一般情况下它的accepts值相同,如果不同说明nginx性能出现瓶颈。
《4》reading:正在读取请求头信息的连接数。
《5》requests:客户端请求总数。
《6》waiting:处于闲置状态正等待客户端发送请求的连接数。
《7》writing:正在发送相应报文的连接数。
二、在nginx加载【nginx_stub_status】监控nginx状态
2.1、在Nginx中加载【nginx_stub_status】模块实现监控nginx状态
bash
#在Nginx中加载【nginx_stub_status】模块实现监控nginx状态
#1-安装所需依赖
yum -y install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
#2-检查当前的nginx中是否已经加载了【nginx_stub_status】监控模块(执行如下命令显示该模块名称则表示已经加载,若没有任何显示则表示没有加载)
cd /usr/local/nginx-1.28.1/sbin/
./nginx -V
./nginx -V 2>&1 | grep -o with-http_stub_status_module
#3-进入nginx的源码目录中加载编译上【nginx_stub_status】模块
cd /data/nginx-1.28.1/
ls
make distclean
make clean
./configure \
--prefix=/usr/local/nginx-1.28.1 \
--sbin-path=/usr/local/nginx-1.28.1/sbin/nginx \
--conf-path=/usr/local/nginx-1.28.1/conf/nginx.conf \
--pid-path=/usr/local/nginx-1.28.1/logs/nginx.pid \
--error-log-path=/usr/local/nginx-1.28.1/logs/error.log \
--http-log-path=/usr/local/nginx-1.28.1/logs/access.log \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-http_realip_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module
make
make install




2.2、修改nginx的配置文件实现监控nginx状态
bash
#修改nginx的配置文件实现监控nginx状态
cd /usr/local/nginx-1.28.1/conf
ls
vi nginx.conf
#【nginx.conf】文件中新增一个server虚拟主机用来监控nginx的状态
server {
listen 8088;
server_name localhost;
location /nginx-status {
stub_status on;
access_log off;
}
}
#启动nginx服务让配置生效并查看进程与端口信息
systemctl start nginx.service
systemctl status nginx.service
ps -ef | grep nginx
netstat -antlp | grep nginx
#重启nginx成功后访问【IP/:8088/nginx-status】即可查看到nginx的监控信息
ip a




2.3、安装部署nginx-prometheus-exporter
bash
#安装部署nginx-prometheus-exporter
#1-下载nginx-prometheus-exporter
wget https://github.com/nginx/nginx-prometheus-exporter/releases/download/v1.5.1/nginx-prometheus-exporter_1.5.1_linux_amd64.tar.gz -c -P /data
#2-解压下载好的nginx-prometheus-exporter
cd /data
mkdir -p /usr/local/nginx-prometheus-exporter_1.5.1
tar -zxvf nginx-prometheus-exporter_1.5.1_linux_amd64.tar.gz -C /usr/local/nginx-prometheus-exporter_1.5.1
cd /usr/local/nginx-prometheus-exporter_1.5.1/
ll
#3-编写nginx-prometheus-exporter的服务
vi /usr/lib/systemd/system/nginx_prometheus_exporter.service
#【/usr/lib/systemd/system/nginx_prometheus_exporter.service】的完整文件
[Unit]
Description=Prometheus: the alerting system
Documentation=https://github.com/nginx/nginx-prometheus-exporter/
After=network.target nginx.service
[Service]
Type=simple
ExecStart=/usr/local/nginx-prometheus-exporter_1.5.1/nginx-prometheus-exporter --nginx.scrape-uri=http://192.168.1.37:8088/nginx-status
Restart=always
RestartSec=15s
[Install]
WantedBy=multi-user.target
#启动mysqld_exporter服务
systemctl daemon-reload
systemctl start nginx_prometheus_exporter.service
systemctl status nginx_prometheus_exporter.service
ps -ef | grep nginx-prometheus-exporter
netstat -antlp | grep 9113
#最后通过【本机IP:9113】在浏览器即可访问到nginx_prometheus_exporter收集到的nginx状态数据。
ip a
#注意2:若是启动nginx-prometheus-exporter报错,则需要【查看系统日志中nginx-prometheus-exporter相关的错误信息】后解决
journalctl -u nginx-prometheus-exporter -f








2.4、将nginx的监控状态添加到prometheus中
bash
#将nginx的监控状态添加到prometheus中
cd /usr/local/prometheus-3.5.0/
vi prometheus.yml
#【prometheus.yml】的最后【scrape_configs】下添加一个【job_name】
- job_name: "nginx"
metrics_path: /metrics
static_configs:
- targets: ['192.168.1.37:9113']
labels:
app: "nginx-prometheus-exporter"
#验证修改后的prometheus.yml文件的语法是否正确(结果显示SUCCESS则表示正确)
./promtool check config prometheus.yml
#验证prometheus.yml文件中的语法正确后热重载让配置生效
curl -XPOST localhost:9090/-/reload
#然后打开浏览器进入Prometheus Server的Web界面【IP:9090】查看【Status-->Target health】即可看到添加的nginx-prometheus-exporter节点及其状态【up】表示在线【down】表示离线。




2.5、Grafana中配置prometheus的nginx_exporter数据可视化
(若已经添加过数据源了则不用重复这个操作)登录到Grafana中(IP:3000)选择【连接】-->【添加新连接】-->【搜索Prometheus】后点击Prometheus-->点击右上角的【添加新数据源】则进入设置界面,在设置界面可以填写名称、与prometheus server的URL地址后点击最底部的【保存并测试】。
然后配置仪表盘(到【Grafana dashboards | Grafana Labs】官网获取更多的仪表盘模板。在Grafana的仪表盘界面中间输入框输入nginx即可列出所有nginx相关模板(如:我们选择【Nginx】模板进入后,获取到该模板的编号是【14900】【12708】)然后在浏览器上进入我们服务器上部署好的Grafana界面的【仪表盘】-->【新建】-->【导入】界面输入模板的编号或者JSON文件内容后点击【加载】后弹出的界面上可以修改模板名称、数据源为prometheus后点击【Import】)如下图所示:





三、Nginx源码编译的参数解析
|--------|----------------------|---------------------------------------------------------------------------------------------------------------------------------|
| 序号 | 核心基础参数 | 说明 |
| 1 | --prefix | 指定 Nginx 安装根目录(核心) bash #示例 --prefix=/usr/local/nginx |
| 2 | --user | 指定 Nginx 运行的普通用户 bash #示例 --user=nginx |
| 3 | --group | 指定 Nginx 运行的用户组 bash #示例 --group=nginx |
| 4 | --sbin-path | 指定 Nginx 主程序(可执行程序)路径【默认在 prefix/sbin/nginx】 bash #示例 --sbin-path=/usr/local/nginx/sbin/nginx |
| 5 | --conf-path | 指定主配置文件路径【默认在 prefix/conf/nginx.conf】 bash #示例 /usr/local/nginx/conf/nginx.conf |
| 6 | --pid-path | 指定 pid 文件路径【默认在 prefix/logs/nginx.pid】 bash #示例 /usr/local/nginx/logs/nginx.pid |
| 7 | --error-log-path | 指定错误日志路径 bash #示例1 --error-log-path=/usr/local/nginx/logs/error.log #示例2 --error-log-path=/var/log/nginx/error.log |
| 8 | --http-log-path | 指定 http 访问日志路径 bash #示例1 --http-log-path=/usr/local/nginx/logs/access.log #示例2 --http-log-path=/var/log/nginx/access.log |
[Nginx编译的核心基础参数解析]
|--------|---------------------|----------------------------------------------|------------------------------------------------------------------------------------------|
| 如下表的这些参数决定 Nginx 编译后所包含的功能模块,请根据业务需求选择: ||||
| 序号 | 所属模块 | 功能常用参数 | 说明 |
| 1 | HTTP 核心模块 | --with-http_ssl_module | 启用 HTTPS 支持(依赖 OpenSSL 库) |
| 2 | HTTP 核心模块 | --with-http_gzip_static_module | 启用 gzip 静态压缩模块 |
| 3 | HTTP 核心模块 | --with-http_stub_status_module | 启用 Nginx 状态监控模块(查看连接数、请求数等) |
| 4 | HTTP 核心模块 | --with-http_realip_module | 启用真实 IP 模块(获取客户端真实 IP,反向代理场景必配) |
| 5 | HTTP 核心模块 | --with-http_v2_module | 启用 HTTP/2 协议支持 |
| 6 | HTTP 核心模块 | --with-http_flv_module | 支持 FLV 格式视频的伪流媒体(Pseudo-Streaming),允许客户端对 FLV 文件进行 seek(拖拽播放) |
| 7 | HTTP 核心模块 | --with-http_mp4_module | 支持 MP4/M4V 格式视频的伪流媒体,解析 MP4 的 moov 原子,实现拖拽播放 |
| 8 | HTTP 核心模块 | --with-http_slice_module | 将大视频文件切片为小片段传输,降低单请求内存占用,提升并发能力 |
| 9 | HTTP 核心模块 | --with-stream + --with-stream_ssl_module | 基于 TCP/UDP 的纯流代理,可转发 RTMP/HLS/DASH 等视频流 |
| ||||
| 1 | 反向代理 / 缓存模块 | --with-http_proxy_module | 启用 HTTP 反向代理(默认启用,一般无需显式配置) |
| 2 | 反向代理 / 缓存模块 | --with-http_fastcgi_module | 支持 FastCGI(对接 PHP-FPM 必配) |
| 3 | 反向代理 / 缓存模块 | --with-http_uwsgi_module | 支持 uWSGI(对接 Python 应用) |
| 4 | 反向代理 / 缓存模块 | --with-http_scgi_module | 支持 SCGI 协议 |
| 5 | 反向代理 / 缓存模块 | --with-http_cache | 启用 HTTP 缓存功能 |
| ||||
| 1 | 其他扩展模块 | --with-stream | 启用 TCP/UDP 流代理(如代理 Redis、MySQL) |
| 2 | 其他扩展模块 | --with-stream_ssl_module | 启用 Stream 模块的 SSL 支持 |
| 3 | 其他扩展模块 | --add-module | 添加第三方模块(如 nginx-rtmp-module) bash #添加第三方模块示例 --add-module=/root/nginx-rtmp-module |
[Nginx编译的功能常用参数(按需选择)]