Prometheus+Grafana构建云原生分布式监控系统(五)

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服务器------Nginxhttps://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编译的功能常用参数(按需选择)]

相关推荐
Leo July2 小时前
Kubernetes全解析:从容器编排到云原生实战
云原生·容器·kubernetes
峰顶听歌的鲸鱼11 小时前
Kubernetes介绍和部署
运维·笔记·云原生·容器·kubernetes·学习方法
一条闲鱼_mytube15 小时前
Istio 服务网格完全指南:从原理到实战
云原生·istio
汪碧康17 小时前
一文掌握k8s的升级更新策略
云原生·容器·kubernetes·k8s·亲和性·xkube
澄澈青空~17 小时前
畜牧业养牛技术与商家微服务解决方案
微服务·云原生·架构
a努力。19 小时前
虾皮Java面试被问:分布式Top K问题的解决方案
java·后端·云原生·面试·rpc·架构
AC赳赳老秦19 小时前
Prometheus + DeepSeek:自动生成巡检脚本与告警规则配置实战
前端·javascript·爬虫·搜索引擎·prometheus·easyui·deepseek
AC赳赳老秦21 小时前
Kubernetes 与 DeepSeek:高效 Pod 部署配置与资源调度优化指南
人工智能·云原生·容器·kubernetes·自动化·notepad++·deepseek