prometheus nginx-vts-exporter部署搭建 監控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對時序數據進行查詢和聚合。

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

  • 1.15.x(最後測試:1.15.0)
  • 1.14.x(最後測試:1.14.0)
  • 1.13.x(最後測試:1.13.12)
  • 1.12.x(最後測試:1.12.2)
  • 1.11.x(最後測試:1.11.10)
  • 1.10.x(最後測試:1.10.3)
  • 1.8.x(最後測試:1.8.0)
  • 1.6.x(最後測試:1.6.3)
  • 1.4.x(最後測試:1.4.7)

早期版本未經過測試。


安裝步驟:

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

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

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

配置建議:

  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等的域名監控信息。
    三、監控數據的查看
    安裝完vts模塊後,可以通過nginx status接口進行監控數據的查看,比如:http://127.0.0.1/status

用Prometheus細化Nginx監控

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

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

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

  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.

四、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

五、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”}

六、Nginx監控的展示
Dashboard的展示當然是使用grafana,自己根據表達式畫圖即可,監控圖類似:
用Prometheus細化Nginx監控

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章