国内用nginx的比较多,nginx的监控比较老的方案可能是通过跑脚本定期收集nginx的status模块的数据,或者监控nginx的日志;后来阿里的tengine在国内开始流行,于是诞生了很多不错的lua模块;但是这些监控方案在有新的监控需求的时候,可能就需要再修改脚本或者更改nginx conf配置,有时候不是特别的方便。用prometheus进行nginx的监控可以自动的对相关server_name和upstream进行监控,你也可以自定义prometheus的数据标签,实现对不同机房和不同项目的nginx进行监控。
监控nginx主要用到以下三个模块:
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对时序数据进行查询和聚合。
一、nginx-module-vts模块的编译
nginx_vts_exporter依赖nginx-module-vts模块,安装此模块无需任何其他依赖。模块与nginx的版本兼容性如下:
1.11.x (last tested: 1.11.10)
1.10.x (last tested: 1.10.3)
1.8.x (last tested: 1.8.0)
1.6.x (last tested: 1.6.3)
1.4.x (last tested: 1.4.7)
同时适用于tengine,其他nginx早期版本未做验证。
安装步骤:
下载模块
<code>shell&gt; git clone git://github.com/vozlt/nginx-module-vts.git</code>
编译配置
在nginx编译时添加vts模块
<code>--add-module=/path/to/nginx-module-vts</code>
下载官方的软件包并编译进vts模块,例如:
安装:
<code>make && make install</code>
二、nginx conf配置
更改nginx conf的配置,添加监控接口/status/:
配置建议:
打开vhost过滤:
<code>vhost_traffic_status_filter_by_host on;</code>
开启此功能,在nginx配置有多个server_name的情况下,会根据不同的server_name进行流量的统计,否则默认会把流量全部计算到第一个server_name上。
在不想统计流量的server区域禁用vhost_traffic_status,配置示例:
假如nginx没有规范配置server_name或者无需进行监控的server上,那么建议在此vhost上禁用统计监控功能。否则会出现“127.0.0.1”,hostname等的域名监控信息。
三、监控数据的查看
安装完vts模块后,可以通过nginx status接口进行监控数据的查看,比如:http://127.0.0.1/status:
在页面的最下方可以指定监控页面刷新的时间间隔,点击json,可以转为json格式输出。
三、nginx-vts-exporter的使用
exporter会收集nginx性能指标的json格式数据,并汇总后暴露监控接口给prometheus。
它的安装使用很简单,开箱即用:
下载当前最新版本的软件包:
<code># wget -c https://github.com/hnlq715/nginx-vts-exporter/releases/download/v0.9.1/nginx-vts-exporter-0.9.1.linux-amd64.tar.gz</code>
解压后运行:
<code># nginx-vts-exporter-0.9.1.linux-amd64/nginx-vts-exporter -nginx.scrape_timeout 10 -nginx.scrape_uri http://127.0.0.1/status/format/json</code>
推荐exporter和nginx安装在同一台机器上,如果不在同一台主机,把scrape_uri改为nginx主机的地址。
nginx_vts_exporter的默认端口号:9913,对外暴露监控接口http://xxx:9913/metrics.
四、nginx的监控数据类型
nginx-vts-exporter的数据类型命名空间默认以“nginx”开头,主要有如下9个:
help是对监控条目的解释,type的格式是:监控条目名称+prometheus数据类型:
五、nginx监控在prometheus的数据汇总
常用监控汇总表达式:
domainname对应nginx conf里的server_name,这里可以根据不同的server_name和upstream分别进行qps、2xx/3xx/4xx/5xx的状态码监控,另外也可以监控nginx每台后端server的qps和后端接口响应时间。
如果不需要区分server_name,可以把表达式里的$domainname改为星号,“*****”代表所有;
求nginx的qps:
<code>sum(irate(nginx_server_requests{code="total",host=~"$domainname"}[5m]))</code>
求4xx万分率(5xx类似,code=“5xx”):
<code>(sum(irate(nginx_server_requests{code="4xx",host=~"$domainname"}[5m])) / sum(irate(nginx_server_requests{code="total",host=~"$domainname"}[5m]))) * 10000</code>
求upstream的qps(示例求group1的qps):
<code>sum(irate(nginx_upstream_requests{code="total",upstream="group1"}[5m]))</code>
求upstream后端server的响应时间(示例求group1的后端响应时间):
<code>nginx_upstream_responsemsec{upstream=“group1”}</code>
六、nginx监控的展示
dashboard的展示当然是使用grafana,自己根据表达式画图即可,监控图类似: