目录
使用Nginx-vtx-exporter在Prometheus里监控Nginx,网上多数文章都用的编译源码方式部署。
本文采用容器方式在K8S环境里部署,最详细步骤一步一步带着读者配置。
0. 涉及工具
- nginx-module-vts:Nginx virtual host traffic status module,Nginx的监控模块,能够提供JSON格式的数据产出。
- nginx-vts-exporter:Simple server that scrapes Nginx vts stats and exports them via HTTP for Prometheus consumption。主要用于收集Nginx的监控数据,并给Prometheus提供监控接口,默认端口号9913。
- Prometheus:监控Nginx-vts-exporter提供的Nginx数据,并存储在时序数据库中,可以使用PromQL对时序数据进行查询和聚合。
环境说明:本人测试环境K8S、Prometheus、Grafana均在不同主机上,且Prometheus、Grafana不是容器化部署。
1. 准备镜像
既然是容器化部署,直接找带vts模块的Nginx,可以用 https://hub.docker.com/r/skyscrapers/nginx
再找vts-exporter,可以用 https://hub.docker.com/r/arquivei/nginx-vts
docker pull下来,搞到docker harber里,待用。
2. K8S容器化部署
2.1 编写yaml文件
2.1.1 Nginx-vts.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-withvts0422
namespace: zhongxin
spec:
replicas: 1
selector:
matchLabels:
app: nginx-withvts0422
template:
metadata:
labels:
app: nginx-withvts0422
spec:
containers:
- name: nginx-withvts
image: 172.21.9.35:30002/si-tech/skyscrapers/nginx
ports:
- containerPort: 80
2.1.2 Nginx-vts-service.yml
apiVersion: v1
kind: Service
metadata:
name: nginxvts-service0422
namespace: zhongxin
labels:
app: nginx-withvts0422
spec:
type: NodePort
selector:
app: nginx-withvts0422
ports:
- port: 80
targetPort: 80
nodePort: 32500
2.1.3 exporter-vts.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: exporter-vts0422
namespace: zhongxin
spec:
replicas: 1
selector:
matchLabels:
app: exporter-vts0422
template:
metadata:
labels:
app: exporter-vts0422
spec:
containers:
- name: exporter-vts
image: 172.21.9.35:30002/si-tech/nginx-vts-exporter:latest
command: ["/bin/sh", "-c", "--"]
args: ["nginx-vts-exporter -nginx.scrape_uri=http://100.101.253.136/status/format/json"]
注:args部分本人因为K8S水平有限,采取了hard-code,恳请批评指正!
2.1.4 exporter-vts-service.yaml
apiVersion: v1
kind: Service
metadata:
name: export-vts-service0422
namespace: zhongxin
labels:
app: exporter-vts0422
spec:
type: NodePort
selector:
app: exporter-vts0422
ports:
- protocol: TCP
port: 9913
targetPort: 9913
nodePort: 32600
2.2 K8S加载
执行命令:
kubectl apply -f Nginx-vts.yml
kubectl apply -f Nginx-vts-service.yml
kubectl apply -f exporter-vts.yaml
kubectl apply -f exporter-vts-service.yaml
检查结果:
kubectl get pods -n zhongxin
kubectl get service -n zhongxin
可以看到创建的pod和service,说明创建成功。
2.3 修改部分内容
2.3.1 检查vts模块
kubectl -it exec nginx-withvts0422-74658c884f-6fc6f -n zhongxin -- /bin/sh
进入pod内部
执行命令: nginx -V
# 结果里 找 --add-module=/usr/src/nginx-module-vts 如果有,则装了vts模块
2.3.2 修改Nginx配置
在容器内部:
vi /etc/nginx/ngnix.conf
## http { } 内添加如下内容:
vhost_traffic_status_zone;
vhost_traffic_status_filter_by_host on;
server {
location /status {
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
注:作者当前K8S不熟练,否则可以直接改docker file或者自己做一个image
随后执行
/ # /usr/sbin/nginx -s reload
2022/04/24 07:07:53 [notice] 116#116: signal process started
2.3.3 检查Nginx
2.3.3.1 验证Nignx-vts
访问Nginx: http://hostIP:32500/
// 中间那段 hahahha 是作者自己加上去的测试...
2.3.3.2 验证vts
访问status: http://hostIP:32500/status
至此,Nginx-vts验证完毕。
2.3.4 验证exporter
访问metrics: http://hostIP:32600/metrics
出现上面所示结果(部分展示,实际很长,篇幅有限)
至此,Nginx-vts-exporter容器、服务部署正常。
3. 配置Prometheus
3.1 编辑配置
进入Prometheus所在主机,编辑Prometheus.yml文件,
加入如下:
- job_name: 'nginx-vts'
static_configs:
- targets: ["172.21.6.22:32600"]
3.2 验证结果:
3.2.1 命令行验证:
# ./promtool check config prometheus.yml
出现类似如下结果,说明配置无误,可以重启Prometheus
Checking prometheus.yml
SUCCESS: 0 rule files found
3.2.2 网页端验证:
至此,Prometheus部分配置完毕。
4. 配置Grafana
4.1 下载相应json
比如作者用的 2948 的dashboard
https://grafana.com/api/dashboards/2948/revisions/1/download
4.2 加载 dashboard
把刚才下载的2json文件内容直接贴进去
点击“load”,图形自动加载。
至此,Grafana配置完毕。记得保存一下Dashboard。
【完】
5. 传统的Prometheus监控Nginx
Prometheus监控通常需要使用exporter,Nginx的传统方式使用Nginx exporter,默认且常用的
原理:读取 Nginx status;例如:
Active connections: 3
server accepts handled requests
8 8 67
Reading: 0 Writing: 1 Waiting: 2 |
解释如下:
指标 | 含义 |
server | 表示Nginx启动到现在共处理了多少个连接 |
accepts | 表示Nginx启动到现在共成功创建多少次握手 |
handled requests | 表示总共处理了多少次请求 |
Reading | Nginx 读取到客户端的 Header 信息数 |
Writing | Nginx 返回给客户端 Header 信息数 |
Waiting | Nginx 已经处理完正在等候下一次请求指令的驻留链接 |