nginx是我們常用反向代理軟件,它的監(jiān)控對于我們來說十分重要,今天介紹一些怎樣利用nginx-vts模塊和prometheus來實(shí)現(xiàn)對nginx的詳細(xì)監(jiān)控。
在使用vts之前,我們想要獲取nginx 狀態(tài)碼統(tǒng)計(jì),訪問量,響應(yīng)時(shí)間等都是通過es分析nginx訪問日志得到的,受限于公司es集群的規(guī)模,我們沒辦法做時(shí)間跨度過大的統(tǒng)計(jì)。后來調(diào)研vts模塊,發(fā)現(xiàn)我們這個(gè)模塊可以完全滿足我們的需求,并且查詢速度非???,查詢半年數(shù)據(jù)也能很快展示出來(我們prometheus只保留半年數(shù)據(jù))
安裝
1、下載模塊
https://github.com/vozlt/nginx-module-vts/releases
2、編譯
編譯參數(shù)添加--add-module=/path/to/nginx-module-vts
然后編譯
3、替換現(xiàn)有bin文件
4、reload nginx
通過nginx -V來查看模塊是否添加成功
配置
1、配置狀態(tài)訪問接口
在default server里添加狀態(tài)查看location,并做好相關(guān)訪問限制
location /status{
allow 127.0.0.1;
deny all;
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}
2、開啟vts統(tǒng)計(jì)
如果想統(tǒng)計(jì)所有的虛擬主機(jī),就在http配置中添加配置,否則就只在想要監(jiān)控的server中添加配置
配置說明:
vhost_traffic_status_zone; 開啟基礎(chǔ)監(jiān)控
vhost_traffic_status_filter on;
vhost_traffic_status_filter_by_set_key $status $server_name;
#開啟詳細(xì)狀態(tài)碼統(tǒng)計(jì)
vhost_traffic_status_filter on;
vhost_traffic_status_filter_by_set_key $uri uris::$server_name;
#開啟uri統(tǒng)計(jì)
此外還有基于地理信息的統(tǒng)計(jì),根據(jù)訪問量或訪問流量對nginx
做訪問限制,詳細(xì)使用見文檔:https://github.com/vozlt/nginx-module-vts#installation
監(jiān)控
prometheus增加nginx-vts的target即可
http://127.0.0.1/status/format/prometheus
nginx-vts v0.1.17之前的版本沒有支持promtheus格式的輸出,如果是v0.1.17之前的版本,需要通過nginx-vts-exporter 將nginx-vts輸出的信息轉(zhuǎn)換為prometheus識(shí)別的格式。當(dāng)然,建議最好還是使用最新的版本。
prometheus record rules:
- name: nginx
rules:
#虛擬主機(jī)rpm
- expr: sum by (host) (rate(nginx_vts_server_requests_total{code="total",host!="localhost"}[40s])*60)
record: 'nginx:total:rpm'
#虛擬主機(jī)狀態(tài)碼1xx的rpm
- expr: sum by (host) (rate(nginx_vts_server_requests_total{code="1xx",host!="localhost"}[40s])*60)
record: 'nginx:1xx:rpm'
#虛擬主機(jī)狀態(tài)碼2xx的rpm
- expr: sum by (host) (rate(nginx_vts_server_requests_total{code="2xx",host!="localhost"}[40s])*60)
record: 'nginx:2xx:rpm'
#虛擬主機(jī)狀態(tài)碼1xx的rpm
- expr: sum by (host) (rate(nginx_vts_server_requests_total{code="3xx",host!="localhost"}[40s])*60)
record: 'nginx:3xx:rpm'
#虛擬主機(jī)狀態(tài)碼5xx的rpm
- expr: sum by (host) (rate(nginx_vts_server_requests_total{code="5xx",host!="localhost"}[40s])*60)
record: 'nginx:5xx:rpm'
#虛擬主機(jī)異常訪問的rpm
- expr: sum by (host) (rate(nginx_vts_server_requests_total{code=~"[4-5]xx",host!="localhost"}[40s])*60)
record: 'nginx:error:rpm'
#nginx實(shí)例的rpm
- expr: sum by (hostname) (rate(nginx_vts_server_requests_total{code="total"}[40s])*60)
record: 'nginxhost:total:rpm'
#nginx實(shí)例狀態(tài)碼2xx的rpm
- expr: sum by (hostname) (rate(nginx_vts_server_requests_total{code="2xx"}[40s])*60)
record: 'nginxhost:2xx:rpm'
#nginx實(shí)例異常訪問的rpm
- expr: sum by (hostname) (rate(nginx_vts_server_requests_total{code=~"[4-5]xx"}[40s])*60)
record: 'nginxhost:error:rpm'
#虛擬主機(jī)的訪問異常率
- expr: 'nginx:error:rpm/nginx:total:rpm'
record: 'http:error:rate'
#nginx實(shí)例的的訪問異常率
- expr: 'nginxhost:error:rpm/nginxhost:total:rpm'
record: 'nginxhost:error:rate'
圖表展示


因?yàn)関ts-module 暴露出的metrics里,server和upstream并沒有關(guān)聯(lián)關(guān)系,所以為了能在grafana中通過選擇項(xiàng)目名稱來同時(shí)展示server信息和upstream信息,就需要在命名上做一些規(guī)范。
我們項(xiàng)目的命名方式: 機(jī)房名稱.運(yùn)行環(huán)境.項(xiàng)目屬組.項(xiàng)目名稱
例如:
azure.prod.ops.download
一個(gè)vhost的配置大概如下:
upstream azure.prod.ops.download {
server 192.168.12.1 weight=2;
server 192.168.12.2 weight=1;
}
server {
listen 80;
server_name
azure.prod.ops.download
download.domain1.com
download.domain2.com
;
access_log /usr/local/nginx/logs/azure.prod.ops.download_access.json json;
error_log /usr/local/nginx/logs/azure.prod.ops.download_error.log;
client_max_body_size 200m;
location / {
proxy_pass http://azure.prod.ops.download;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout http_404;
}
}
這樣通過同一個(gè)lebal就能選擇出server和upstream的信息。
如果一個(gè)server有多個(gè)upstream,就在后面添加子名稱,然后通過正則匹配前綴來獲取所有的upstream.
這樣prometheus也可根據(jù)idc名稱,運(yùn)行環(huán)境,項(xiàng)目組來編寫通用的alert rules。
補(bǔ)充:
1、參數(shù)vhost_traffic_status_filter_by_host
vts-module 默認(rèn)是將一個(gè)vhost的metrics匯總到第一個(gè)server_name 上顯示出來,如果想按域名分開統(tǒng)計(jì),可以開啟此參數(shù)。注意:如果一個(gè)vhost擁有多個(gè)域名,開啟此配置,在監(jiān)控和展示層面上會(huì)比較麻煩。
2、如果沒有url統(tǒng)計(jì)需求,謹(jǐn)慎開啟uri過濾。如果需要開啟,要做好相關(guān)限制,比如限制采集數(shù)量上限vhost_traffic_status_filter_max_node。盡量才用精確配置,比如將url過濾參數(shù)寫在需要監(jiān)控的localtion中,而不是整個(gè)server配置段里。還有做好反掃描配置。
3、如果在http段配置默認(rèn)采集所有vhosts 信息,可在server配置段內(nèi),通過vhost_traffic_status_bypass_stats on跳過采集
4、nginx-vts-modules 與模塊nginx_upstream_check_module沖突