prometheus通过nginx-vts-exporter监控nginx

概述

Prometheus监控Nginx有两种方式。一种是通过nginx_exporter监控,需要开启nginx_stub_status,主要是nginx自身的status信息,metrics数据相对较少;另一种是使用nginx-vts-exporter监控,但是需要在编译nginx的时候添加nginx-module-vts模块,监控数据较多,提供了包含serverupstream以及cache的相关监控指标,指标更加丰富,所以采用nginx-vts-exporter实现对nginx的监控。

nginx-module-vts安装与配置

版本选择

版本 地址
nginx 1.20.2 http://nginx.org/download/nginx-1.20.2.tar.gz
vts 0.2.1 https://github.com/vozlt/nginx-module-vts/archive/refs/tags/v0.2.1.tar.gz
nginx-vts-exporter 0.10.3【最新版没有二进制包】 https://github.com/hnlq715/nginx-vts-exporter/releases/download/v0.10.3/nginx-vts-exporter-0.10.3.linux-amd64.tar.gz

对现有nginx升级

安装nginx-module-vts

# 进入nginx安装目录
cd /data/nginx-1.20.2
# 下载新的nginx-module-vts
wget https://github.com/vozlt/nginx-module-vts/archive/refs/tags/v0.2.1.tar.gz
# 解压
tar -zxvf v0.2.1.tar.gz
# 预编译 需要新增--add-module=nginx-module-vts-0.2.1   --prefix是nginx的安装目录,需要跟现有的nginx保持一致
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-stream --add-module=nginx-module-vts-0.2.1
# 编译  (这里只make,不要make install,不然会覆盖。如果是新装nginx,可以继续make install)
make

调整启动脚本

# 停止nginx 并配置启动文件
cd /usr/local/nginx/sbin/
./nginx -s stop
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
# 复制新编译的配置文件
cp /data/nginx-1.20.2/objs/nginx /usr/local/nginx/sbin/

# 启动nginx
./nginx

# 查看nginx是否包含nginx-module-vts-0.2.1 configure arguments: 最后是否有 --add-module=nginx-module-vts-0.2.1
./nginx -V

☘️配置/status

cd /usr/local/nginx/conf/
# 备份原配置文件
cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak
# 修改nginx.conf配置,增加以下内容
http {

  	# 需要配置
    vhost_traffic_status_zone;  
    vhost_traffic_status_filter_by_host on;
    
    server {
        listen  80; #端口任意
				server_name localhost;

        # 主要是这个location配置
        location /status {
            vhost_traffic_status_display;
            vhost_traffic_status_display_format html;
        }
	}
}

配置说明:

  1. 打开vhost过滤

vhost_traffic_status_filter_by_host on;
开启此功能,在Nginx配置有多个server_name的情况下,会根据不同的server_name进行流量的统计,否则默认会把流量全部计算到第一个server_name上。

  1. 在不想统计流量的server区域禁用vhost_traffic_status,在sever中添加vhost_traffic_statusoff;

假如nginx没有规范配置server_name或者无需进行监控的server上,那么建议在此vhost上禁用统计监控功能。否则会出现“127.0.0.1”,hostname等的域名监控信息。

☕️重启nginx

cd /usr/local/nginx/sbin/
# 校验配置文件
./nginx -t
# 停止nginx
./nginx -s stop
# 启动nginx
./nginx -s stop

☘️验证

浏览器访问:http://ip:port/status
prometheus通过nginx-vts-exporter监控nginx_第1张图片

新安装nginx

在线安装脚本

默认安装的目录为/usr/local/nginx,可以通过脚本修改,nginx可以在有互联网的环境安装好,直接拷贝/usr/local/nginx目录到其他机器使用即可,注意原有配置文件迁移。

#!/bin/bash

# Nginx安装
nginxVersion="1.20.2"
vtsVersion="0.2.1"
installDir="/usr/local/nginx"

echo "yum install -y make zlib zlib-devel gcc-c++ libtool openssl openssl-devel pcre pcre-devel"
yum install -y make zlib zlib-devel gcc-c++ libtool openssl openssl-devel pcre pcre-devel

# wget命令不存在则先安装wget
_=$(command -v wget)
if [ "$?" != "0" ]; then
  yum install -y wget
fi

#下载nginx
echo "wget http://nginx.org/download/nginx-${nginxVersion}.tar.gz"
wget http://nginx.org/download/nginx-${nginxVersion}.tar.gz

echo "tar -zxvf nginx-${nginxVersion}.tar.gz"
tar -zxvf nginx-${nginxVersion}.tar.gz


# 下载vts 并重命名
echo "wget https://github.com/vozlt/nginx-module-vts/archive/refs/tags/v${vtsVersion}.tar.gz -O ${vtsVersion}.tar.gz"
wget https://github.com/vozlt/nginx-module-vts/archive/refs/tags/v${vtsVersion}.tar.gz -O ${vtsVersion}.tar.gz
# 解压
echo "tar -zxvf ${vtsVersion}.tar.gz"
tar -zxvf ${vtsVersion}.tar.gz

echo "cd nginx-${nginxVersion}"
# 目录不存在就退出
cd nginx-${nginxVersion} || exit
echo "当前目录:`pwd`"
echo "./configure --prefix=${installDir} --with-http_stub_status_module --with-http_ssl_module --with-stream --add-module=../nginx-module-vts-${vtsVersion}"
./configure --prefix=${installDir} --with-http_stub_status_module --with-http_ssl_module --with-stream --add-module=../nginx-module-vts-${vtsVersion} 

echo "make"
make
echo "make install"
make install

printf -- "\033[32m 安装完成,nginx目录为:${installDir} \033[0m\n"

echo "清理安装包"

echo "rm -rf ../nginx-${nginxVersion}.tar.gz"
rm -rf ../nginx-${nginxVersion}.tar.gz

echo "rm -rf ../nginx-${nginxVersion}"
rm -rf ../nginx-${nginxVersion}

echo "rm -rf ../nginx-module-vts-${vtsVersion}"
rm -rf ../nginx-module-vts-${vtsVersion}

printf -- '\033[32m 安装包清理完成 \033[0m\n'

️nginx-vts-exporter安装配置

注意:
要使用nginx-vts-exporter监控nginx状态,需要先对nginx添加vts模块,并进行相关配置才可以获取到数据。具体操作见上述流程

️在线安装脚本

#!/bin/bash

# 安装目录
installDir="/opt/gdmp/exporter"

# exporter名称启动文件名称
exporterName="nginx-vts-exporter"

# exporter安装包名称
exporterPackageName="nginx-vts-exporter-0.10.3.linux-amd64"
exporterPackageNameTar="${exporterPackageName}.tar.gz"
# exporter端口
exporterPort="9913"

# 描述信息
description="默认监控本机nginx 80 端口,需要修改配置需编辑/etc/systemd/system/${exporterName}.service注册服务,并执行systemctl daemon-reload&systemctl restart ${exporterName}重启${exporterName}服务"

if ! egrep "7.[0-9]" /etc/redhat-release &>/dev/null; then
  printf -- '\033[31m ERROR: 支持Centos 7版本 \033[0m\n'
  exit 1
fi

# 目录不存在,创建目录
function mkdirIfNotExist() {
  if [ ! -d "$1" ]; then
    echo "mkdir -p $1"
    mkdir -p $1
  fi
}

# 下载
wget https://github.com/hnlq715/nginx-vts-exporter/releases/download/v0.10.3/${exporterPackageName}.tar.gz -O ${exporterPackageName}.tar.gz

mkdirIfNotExist ${installDir}/${exporterName}

# 拷贝安装包
echo "/usr/bin/cp -rf ${exporterPackageNameTar} ${installDir}/"
/usr/bin/cp -rf ${exporterPackageNameTar} ${installDir}/

# service文件
cat >./nginx-vts-exporter.service <<EOF
[Unit]
Description=https://github.com/hnlq715/nginx-vts-exporter;port:9913
After=network-online.target

[Service]
ExecStart=/opt/gdmp/exporter/nginx-vts-exporter/nginx-vts-exporter -nginx.scrape_uri=http://127.0.0.1/status/format/json --telemetry.address=:9913
Restart=always
RestartSec=5
StartLimitInterval=0
StartLimitBurst=10

[Install]
WantedBy=multi-user.target
EOF

# 拷贝启动service文件
echo "/usr/bin/cp -f nginx-vts-exporter.service /etc/systemd/system/"
/usr/bin/cp -f nginx-vts-exporter.service /etc/systemd/system/
# 解压安装包
echo "tar -zxvf ${installDir}/${exporterPackageNameTar} -C ${installDir}/"
tar -zxvf ${installDir}/${exporterPackageNameTar} -C ${installDir}/

echo "解压 nginx-vts-exporter 客户端完成"

# 移动到安装目录
echo "/usr/bin/cp -rf ${installDir}/${exporterPackageName}/* ${installDir}/${exporterName}"
/usr/bin/cp -rf ${installDir}/${exporterPackageName}/* ${installDir}/${exporterName}

# 执行权限
echo "chmod +x ${installDir}/${exporterName}/${exporterName}"
chmod +x ${installDir}/${exporterName}/${exporterName}

systemctl daemon-reload
systemctl enable ${exporterName}
systemctl start ${exporterName}

echo "启动 ${exporterName} 客户端完成"


echo "注册 ${exporterName} 服务守护进程完成"

printf -- "\033[32m ${exporterName} 状态: \033[0m\n"
systemctl --type=service --state=active | grep ${exporterName}
printf -- "\033[32m exporter访问地址:http://127.0.0.1:${exporterPort}/metrics \033[0m\n"

echo ${description}

安装成功后,会默认安装到/usr/local/nginx中,出现错误需要查看安装日志

#!/bin/bash

# 安装目录
installDir="/opt/gdmp/exporter"

# exporter名称启动文件名称
exporterName="nginx-vts-exporter"

# exporter安装包名称
exporterPackageName="nginx-vts-exporter-0.10.3.linux-amd64"

echo "systemctl stop nginx-vts-exporter"
systemctl stop nginx-vts-exporter
systemctl daemon-reload
# 删除安装文件
echo "rm -rf ${installDir}/${exporterName}"
rm -rf ${installDir}/${exporterName}

# 安装服务文件
echo "rm -rf /etc/systemd/system/${exporterName}.service"
rm -rf /etc/systemd/system/${exporterName}.service

printf -- "\033[32m 卸载完成 \033[0m\n"

离线安装脚本

百度网盘

链接:https://pan.baidu.com/s/1oL3_HBMZmlmnk7ydloBzIw
提取码:gcjk

验证

访问:http://ip:9913/metrics
prometheus通过nginx-vts-exporter监控nginx_第2张图片

Prometheus配置

prometheus.yml

- job_name: 'nginx'
    scrape_interval: 30s
    static_configs:
      - targets: ['10.0.107.158:9913']
        labels:
          instance: '监控(10.0.107.158:9913)'

Grafana面板

面板地址

https://grafana.com/grafana/dashboards/2949-nginx-vts-stats/
编号:2949

☘️面板效果图

prometheus通过nginx-vts-exporter监控nginx_第3张图片

️监控指标说明

指标 说明
nginx_server_requests nginx_server_requests是指Nginx服务器接收到的请求数。它表示当前Nginx服务器正在处理的请求数量,包括正在处理的实时请求和等待处理的请求。nginx_server_requests可以用来衡量服务器的负载情况,以及服务器的性能是否满足需求。如果请求数量过高,服务器可能会出现瓶颈,导致响应时间变慢或者服务不可用。因此,对于高流量的网站或者应用程序,需要根据实际情况调整服务器的配置和性能,以确保服务器可以满足高并发请求的需求。
nginx_upstream_requests 统计各个upstream 请求总数,精确到状态码
nginx_server_connections 当前Nginx服务器的连接数。它表示当前正在处理的客户端连接数,包括等待连接的客户端连接和正在处理的客户端连接。状态active表示当前正在处理的客户端连接数。这些连接正在被服务器处理,包括接收请求、处理请求和发送响应等操作。状态writing表示当前正在向客户端发送响应数据的连接数。这些连接正在被服务器处理,但是服务器正在向客户端发送数据。状态reading表示当前正在从客户端接收请求数据的连接数。这些连接正在被服务器处理,但是服务器正在等待客户端发送请求数据。状态waiting表示当前正在等待可用连接的客户端连接数。这些连接正在等待服务器的处理,包括等待可用的处理线程或等待可用的网络资源等。
nginx_server_cache Nginx服务器的缓存系统,它可以缓存经过处理的响应数据,以提高服务器的响应速度和性能。bypass表示跳过缓存,直接向后端服务器请求数据。expired表示缓存已经过期,需要重新向后端服务器请求数据。hit表示请求命中缓存,服务器直接返回缓存数据。miss表示请求未命中缓存,服务器需要向后端服务器请求数据。revalidated表示缓存已过期,但是服务器向后端服务器请求数据时发现数据仍然有效,可以直接使用缓存数据。scarce表示缓存已经达到最大容量,无法继续缓存数据。stale表示缓存已过期,但是服务器仍然使用缓存数据,同时向后端服务器请求更新的数据。updating表示服务器正在向后端服务器请求更新缓存数据。
nginx_server_bytes nginx_server_bytes是指Nginx服务器发送和接收的字节数量。它包括服务器发送给客户端的响应数据和客户端发送给服务器的请求数据。其中,in表示接收的字节数量,也就是服务器从客户端接收的数据量。out表示发送的字节数量,也就是服务器向客户端发送的数据量。通过监控和分析nginx_server_bytes的in和out数据,可以帮助管理员了解服务器的网络流量和负载情况,从而优化服务器的配置和性能,提高网站或者应用程序的响应速度和稳定性。需要注意的是,in和out数据量的大小取决于服务器的网络流量和处理能力,以及客户端请求的数据量和请求频率等因素。因此,在优化服务器性能时,需要综合考虑服务器的配置、网络带宽、并发连接数、CPU利用率、内存使用率等因素,以提高服务器的性能和稳定性。
nginx_upstream_bytes 统计nginx各个 upstream 分组的字节总数,细分到进出
nginx_upstream_responseMsec nginx_upstream_responseMsec是指Nginx服务器与上游服务器之间的请求响应时间。它包括Nginx服务器向上游服务器发送请求的时间、上游服务器处理请求的时间和Nginx服务器接收响应的时间。nginx_upstream_responseMsec可以用于衡量Nginx服务器与上游服务器之间的网络延迟和响应时间,以及服务器的性能是否满足需求。如果响应时间过长,可能会导致用户等待时间过长,影响用户体验。如果服务器性能不足,可能会导致响应时间变慢或者服务不可用。通过对nginx_upstream_responseMsec进行监控和分析,可以帮助管理员了解服务器之间的网络延迟和性能瓶颈,从而优化服务器的配置和性能,提高网站或者应用程序的响应速度和稳定性。需要注意的是,nginx_upstream_responseMsec的大小取决于服务器之间的网络带宽、处理能力、响应时间等因素。因此,在优化服务器性能时,需要综合考虑服务器的配置、网络带宽、并发连接数、CPU利用率、内存使用率等因素,以提高服务器的性能和稳定性。

监控指标选取

指标 PromQL
近5分钟请求QPS sum by(gdmpId, gdmpType, gdmpName) (irate(nginx_upstream_requests[5m]))
连接数 sum by(gdmpId, gdmpType, gdmpName) (nginx_server_connections{status=~‘active|writing|reading|waiting’})

参考资料

  1. prometheus监控nginx的两种方式_搁潜的博客-CSDN博客
  2. prometheus + nginx-vts-exporter监控nginx(八)_k.o.b.e-24的博客-CSDN博客
  3. 用Prometheus细化Nginx监控_11969904的技术博客_51CTO博客

你可能感兴趣的:(prometheus,常用工具与脚本,nginx,prometheus,运维)