用Prometheus細化Nginx監控

國內用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對時序數據進行查詢和聚合。html

1、nginx-module-vts模塊的編譯
nginx_vts_exporter依賴nginx-module-vts模塊,安裝此模塊無需任何其餘依賴。模塊與Nginx的版本兼容性以下:linux

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早期版本未作驗證。
安裝步驟:nginx

  1. 下載模塊
    shell> git clone git://github.com/vozlt/nginx-module-vts.git
  2. 編譯配置
    在nginx編譯時添加vts模塊
    --add-module=/path/to/nginx-module-vts
    下載官方的軟件包並編譯進vts模塊,例如:git

    ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_sysguard_module  --add-module=nginx-module-vts
  3. 安裝:
    make && make install
    2、Nginx Conf配置
    更改Nginx Conf的配置,添加監控接口/status/:github

    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;
        }
    }
    }

配置建議: shell

  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等的域名監控信息。
    3、監控數據的查看
    安裝完vts模塊後,能夠經過nginx status接口進行監控數據的查看,好比:http://127.0.0.1/status數據庫

用Prometheus細化Nginx監控

在頁面的最下方能夠指定監控頁面刷新的時間間隔,點擊JSON,能夠轉爲JSON格式輸出。json

用Prometheus細化Nginx監控
3、nginx-vts-exporter的使用
exporter會收集nginx性能指標的JSON格式數據,並彙總後暴露監控接口給Prometheus。後端

它的安裝使用很簡單,開箱即用:ide

  1. 下載當前最新版本的軟件包:
    # wget -c https://github.com/hnlq715/nginx-vts-exporter/releases/download/v0.9.1/nginx-vts-exporter-0.9.1.linux-amd64.tar.gz
  2. 解壓後運行:
    # 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
    推薦exporter和nginx安裝在同一臺機器上,若是不在同一臺主機,把scrape_uri改成nginx主機的地址。
    nginx_vts_exporter的默認端口號:9913,對外暴露監控接口http://xxx:9913/metrics.

4、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 times in 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 times in 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 times in milliseconds
# TYPE nginx_upstream_responseMsec gauge

5、Nginx監控在Prometheus的數據彙總
經常使用監控彙總表達式:
DomainName對應nginx conf裏的server_name,這裏能夠根據不一樣的server_name和upstream分別進行qps、2xx/3xx/4xx/5xx的狀態碼監控,另外也能夠監控nginx每臺後端server的qps和後端接口響應時間。

若是不須要區分server_name,能夠把表達式裏的$DomainName改成星號,「*****」表明全部;

  1. 求Nginx的QPS:
    sum(irate(nginx_server_requests{code="total",host=~"$DomainName"}[5m]))
  2. 求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
  3. 求upstream的QPS(示例求group1的qps):
    sum(irate(nginx_upstream_requests{code="total",upstream="group1"}[5m]))
  4. 求upstream後端server的響應時間(示例求group1的後端響應時間):
    nginx_upstream_responseMsec{upstream=「group1」}

6、Nginx監控的展現
Dashboard的展現固然是使用grafana,本身根據表達式畫圖便可,監控圖相似:
用Prometheus細化Nginx監控

相關文章
相關標籤/搜索