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

  1. nginx-module-vts
  2. nginx-vts-exporter

nginx-module-vts 模块编译

Nginx virtual host traffic status module,Nginx的监控模块,能够提供JSON格式的数据产出。

  1. # 查看nginx 安装了哪些模块
  2. /usr/local/nginx/sbin/nginx -V
  3. # 下载 vts 模块
  4. cd /usr/local/src
  5. git clone git://github.com/vozlt/nginx-module-vts.git
  6. # 编译安装 nginx-module-vts 模块
  7. cd /usr/local/src/nginx-1.12.1/
  8. ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --pid-path=/usr/local/nginx/pid/nginx.pid --without-http_memcached_module --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --add-module=/usr/local/src/nginx-module-vts/
  9. make
  10. # 替换 nginx 启动文件
  11. mv /usr/local/nginx/sbin/nginx{,.old} && cp /usr/local/src/nginx-1.12.1/objs/nginx /usr/local/nginx/sbin/
  12. # 重启 nginx
  13. systemctl restart nginx

修改nginx 的配置文件 nginx.conf

  1. http {
  2. vhost_traffic_status_zone;
  3. # 开启此功能,在Nginx配置有多个server_name的情况下,会根据不同的server_name进行流量的统计,
  4. # 否则默认会把流量全部计算到第一个server_name上。
  5. vhost_traffic_status_filter_by_host on;
  6. ...
  7. server {
  8. # 在不想统计流量的server区域禁用vhost_traffic_status
  9. vhost_traffic_status off;
  10. # 假如nginx没有规范配置server_name或者无需进行监控的server上,那么建议在此vhost上禁用统计监控功能。
  11. # 否则会出现“127.0.0.1”,hostname等的域名监控信息
  12. ...
  13. location /status {
  14. vhost_traffic_status_display;
  15. vhost_traffic_status_display_format html;
  16. }
  17. }
  18. }

浏览器访问: http://{nginx_IP}/status 出现数据页面

nginx-vts-exporter

  1. docker pull sophos/nginx-vts-exporter:latest
  2. docker run -ti -d \
  3. --restart always \
  4. --name nginx-vts \
  5. -p 9913:9913 \
  6. --env NGINX_STATUS="http://localhost/status/format/json" \
  7. sophos/nginx-vts-exporter
  8. # NGINX_STATUS 要改成自己对应的主机。 一般情况下, nginx-vts-exporter 与 nginx 在同一个主机上。

浏览器访问: http://{nginx_vts_IP}:9913/metrics 出现数据页面

将nginx-vts 加入 prometheus中

  1. vim /usr/local/prometheus/prometheus.yml
  2. - job_name: nginx
  3. static_configs:
  4. - targets: ['192.168.2.210:9913']
  5. labels:
  6. instance: nginx-web-1
  7. # 重启 prometheus

grafana 模板

导入如下监控模版:
image.png

监控图表如下:
image.png

Nginx监控在Prometheus的数据汇总

  1. 常用监控汇总表达式:
  2. DomainName对应nginx conf里的server_name,这里可以根据不同的server_nameupstream分别进行qps2xx/3xx/4xx/5xx的状态码监控,另外也可以监控nginx每台后端serverqps和后端接口响应时间。
  3. 如果不需要区分server_name,可以把表达式里的$DomainName改为星号,“*****”代表所有;
  4. # 1. 求Nginx的QPS:
  5. sum(irate(nginx_server_requests{code="total",host=~"$DomainName"}[5m]))
  6. sum(irate(nginx_server_requests{instance=~"$Instance", code!="total"}[5m])) by (code)
  7. # 2. 求4xx万分率(5xx类似,code=“5xx”):
  8. (sum(irate(nginx_server_requests{code="4xx",host=~"$DomainName"}[5m])) / sum(irate(nginx_server_requests{code="total",host=~"$DomainName"}[5m]))) * 10000
  9. # 3. 求upstream的QPS(示例求group1的qps):
  10. sum(irate(nginx_upstream_requests{code="total",upstream="group1"}[5m]))
  11. # 4. 求upstream后端server的响应时间(示例求group1的后端响应时间):
  12. nginx_upstream_responseMsec{upstream=“group1”}
  13. nginx_upstream_responseMsec{backend="192.168.x.xxx:8803",instance="nginx-web-1",job="nginx",upstream="UPSTREAM_NAME"}