用Prometheus进行nginx的监控可以自动的对相关server_name和upstream进行监控,你也可以自定义Prometheus的数据标签,实现对不同机房和不同项目的nginx进行监控。

监控Nginx主要用到以下三个模块:

nginx-module-vts:Nginx的监控模块,能够提供JSON格式的数据产出。

nginx-vts-exporter:主要用于收集Nginx的监控数据,并给Prometheus提供监控接口,默认端口号9913。

Prometheus:监控Nginx-vts-exporter提供的Nginx数据,并存储在时序数据库中,可以使用PromQL对时序数据进行查询和聚合。

nginx-module-vts模块的编译

nginx_vts_exporter依赖nginx-module-vts模块,安装此模块无需任何其他依赖。

如果未安装过nginx

# 下载编译模块
git clone git://github.com/vozlt/nginx-module-vts.git
  
# 编译配置
--add-module=/path/to/nginx-module-vts
# 下载官方的软件包并编译进vts模块,例如:
./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_sysguard_module  --add-module=nginx-module-vts

# 安装Nginx
#!/usr/bin/env bash
version="nginx-1.14.2.tar.gz"
user="nginx"
nginx=${version%.tar*}
path=/usr/local/src/$nginx
echo $path
if ! ping -c2 www.baidu.com &>/dev/null
then
	echo "网络不通,无法安装"
	exit
fi

yum install -y gcc gcc-c++ openssl-devel pcre-devel make zlib-devel wget psmisc
if [ ! -e $version ];then
	wget http://nginx.org/download/$version
fi
if ! id $user &>/dev/null
then
	useradd $user -M -s /sbin/nologin
fi

if [ ! -d /var/tmp/nginx ];then
	mkdir -p /var/tmp/nginx/{client,proxy,fastcgi,uwsgi,scgi}
fi
tar xf $version -C /usr/local/src
cd $path
./configure --user=nginx --group=nginx --prefix=/usr/local/nginx   --add-module=/usr/local/src/nginx-1.14.0/nginx-module-vts/ && make && make install

 

如果已安装过nginx

如果需重新编译,步骤如下:

1、查看当前编译参数:

#执行,/usr/sbin/nginx是我的安装路径,按需修改
/usr/sbin/nginx -V
#结果如下:
nginx version: nginx/1.21.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules
#下载已安装的nginx相同版本的包(如安装包还能找到的就不必下了)
wget -c https://nginx.org/download/nginx-1.21.1.tar.gz
tar zxvf nginx-1.21.1.tar.gz

2、在nginx编译时添加vts模块

下载最新可下载的版本并解压:

cd /data/pragram
wget -c https://github.com/hnlq715/nginx-vts-exporter/releases/download/v0.10.3/nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
tar zxvf nginx-vts-exporter-0.10.3.linux-amd64.tar.gz

现在软件包存放在/data/program下,因此编译时加入/data/program/nginx-module-vts/

# 找到nginx源码存放路径/data/program/nginx-1.21.1,重新编译:

cd /data/program/nginx-1.21.1
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --add-module=/data/program/nginx-module-vts/

#编译执行完成后,确认输出的结果中存在
adding module in /data/program/nginx-module-vts-master/
 + ngx_http_vhost_traffic_status_module was configured
或
执行:/data/program/nginx-1.21.1/objs/nginx -V,看到输出结果最后出现:
--add-module=/data/program/nginx-module-vts/

则表示configure正确

#执行
make && make install

#备份并替换现用的nginx可执行文件,Nginx编译后,新的二进制文件会存放在objs目录下

cd /usr/sbin/
cp nginx nginx.bak
cp /data/program/nginx-1.21.1/objs/nginx ./

Nginx配置

#1.修改nginx.conf
vim /etc/nginx/nginx.conf
#在http中添加如下内容
http {
    ...
    vhost_traffic_status_zone;
    vhost_traffic_status_filter_by_host on;
    ...
}

#2.修改各vhost.conf
vim /etc/nginx/conf.d/default.conf
#在每个域名或端口的server加入如下内容
server {
    ...
  	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上

2 . 在不想统计流量的server区域禁用vhost_traffic_status,配置示例:

server {
...
vhost_traffic_status off;
...
}

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

监控数据查看

安装完vts模块后,可以通过nginx status接口进行监控数据的查看,比如:http://127.0.0.1:90/status:

在页面的最下方可以指定监控页面刷新的时间间隔,点击JSON,可以转为JSON格式输出。

Nginx的监控数据类型

nginx-vts-exporter的数据类型命名空间默认以“nginx”开头,主要有如下9个:

HELP是对监控条目的解释,TYPE的格式是监控条目名称+Prometheus数据类型

# HELP nginx_server_bytes request/response bytes
# TYPE nginx_server_bytes counter
# HELP nginx_server_cache cache counter
# TYPE nginx_server_cache counter
# HELP nginx_server_connections nginx connections# TYPE nginx_server_connections gauge
# HELP nginx_server_requestMsec average of request processing timesin milliseconds
# TYPE nginx_server_requestMsec gauge
# HELP nginx_server_requests requests counter,可以区分状态码

# TYPE nginx_server_requests counter
# HELP nginx_upstream_bytes request/response bytes
# TYPE nginx_upstream_bytes counter
# HELP nginx_upstream_requestMsec average of request processing timesin milliseconds
# TYPE nginx_upstream_requestMsec gauge
# HELP nginx_upstream_requests requests counter,可以区分状态码
# TYPE nginx_upstream_requests counter
# HELP nginx_upstream_responseMsec average of only upstream/backend response processing timesin milliseconds
# TYPE nginx_upstream_responseMsec gauge

Nginx监控在Prometheus的数据汇总

 常用监控汇总表达式:

DomainName对应nginx conf里的server_name,这里可以根据不同的server_name和upstream分别进行qps、2xx/3xx/4xx/5xx的状态码监控,另外也可以监控nginx每台后端server的qps和后端接口响应时间。

如果不需要区分server_name,可以把表达式里的$DomainName改为星号,“*****”代表所有;
求Nginx的QPS:
sum(irate(nginx_server_requests{code="total",host=~"$DomainName"}[5m]))

求4xx万分率(5xx类似,code=“5xx”):
(sum(irate(nginx_server_requests{code="4xx",host=~"$DomainName"}[5m])) / sum(irate(nginx_server_requests{code="total",host=~"$DomainName"}[5m]))) * 10000

求upstream的QPS(示例求group1的qps):
sum(irate(nginx_upstream_requests{code="total",upstream="group1"}[5m]))

求upstream后端server的响应时间(示例求group1的后端响应时间):
nginx_upstream_responseMsec{upstream=“group1”}
GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐