「Prometheus系列」實戰—Prometheus + Grafana——Nginx 監控

「Prometheus系列」實戰—Prometheus + Grafana——Nginx 監控

Nginx 是目前最流行的Web 服務器之一。上到BAT下到初創互聯網公司都會用Nginx 來作為重要的基礎設施,用於負載,Web server等。通常處於整個架構流量的入口處。當然在這之前還會有防火牆或者四層負載之類的,這裡我們簡化成流量的入口。便於大家理解。可想而知,重要程度是不言而喻的。那麼作為最重要的基礎設施,監控Nginx 的各項指標是非常重要的。它會反映出流量、請求以及後端服務器負載等重要的詳細指標。

Nginx 監控方式:

Nginx Plus: 內置監控模塊和界面
Nginx Open Source: 自帶的status 模塊
Nginx_vts_exporter: 通過第三方模塊,抓取相應的metrics 輸出給Prometheus 展示處理

本文重點講解下Prometheus + Grafana + Nginx_vts_exporter:

  • 官方Github地址:https://github.com/hnlq715/nginx-vts-exporter
  • 系統: Ubuntu 18.04
  • Prometheus: 2.11.1 (最新版)
  • Grafana :6.3.2(最新版)
  • Nginx: 1.16.0(最新版)
  • Nginx-vts-module:0.1.18(最新版)

概略

首先,為了理解組件之間的交互順序,我們大概畫出一個簡要的輪廓交互圖。

「Prometheus系列」實戰—Prometheus + Grafana——Nginx 監控

上圖顯示的非常簡單併合乎邏輯。ok,我們開始進入第一步並分析nginx_vts_module。

第一步。在Nginx 中編譯 virtual host traffic status module ( nginx_vts_module )

我們需要做的第一件事是在目標服務器上編譯安裝帶有顯示Metrics的模塊的NGINX。下面是幾種方式:

  • 也許你的Nginx編譯已經包含了vts模塊。您可以通過運行以下命令來檢查:
nginx -V 2>&1 | grep -o with-http_stub_status_module

如果看到如下輸出,那麼就是已經安裝了的,可以直接跳過安裝模塊步驟。

with-http_stub_status_module

否則,繼續如下模塊安裝

  • 下載最新版的Nginx 並解壓
cd /opt/ \\
&& wget https://nginx.org/download/nginx-1.16.0.tar.gz \\
&& tar xf nginx-1.16.0.tar.gz
  • 獲取Nginx-module-vts的最新代碼
curl -fSL https://github.com/vozlt/nginx-module-vts/archive/v0.1.18.tar.gz | tar xzf - -C /tmp
  • 安裝相關依賴
apt-get install openssl libssl-dev libperl-dev libpcre3 libpcre3-dev libxslt-dev libgd-dev libgeoip-dev google-perftools libgoogle-perftools-dev libldap-dev libzip-dev libcurl4-openssl-dev libldap2-dev 
  • 編譯Nginx
./configure \\
--prefix=/etc/nginx \\
--sbin-path=/usr/sbin/nginx \\
--modules-path=/usr/lib/nginx/modules \\
--conf-path=/etc/nginx/nginx.conf \\
--error-log-path=/var/log/nginx/error.log \\
--http-log-path=/var/log/nginx/access.log \\
--pid-path=/var/run/nginx.pid \\
--lock-path=/var/run/nginx.lock \\
--http-client-body-temp-path=/var/cache/nginx/client_temp \\
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \\
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \\
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \\
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \\
--user=nginx \\
--group=nginx \\
--with-http_ssl_module \\
--with-http_realip_module \\
--with-http_addition_module \\
--with-http_sub_module \\
--with-http_dav_module \\
--with-http_flv_module \\
--with-http_gunzip_module \\
--with-http_gzip_static_module \\
--with-http_random_index_module \\
--with-http_secure_link_module \\
--with-http_stub_status_module \\
--with-http_auth_request_module \\
--with-threads --with-stream \\
--with-stream_ssl_module \\
--with-http_slice_module \\
--with-mail \\
--with-mail_ssl_module \\
--with-file-aio \\
--with-http_v2_module \\

--with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2' \\
--with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,--as-needed' \\
--add-module=/tmp/nginx-module-vts-0.1.18
  • 完成後不報錯的話就可以直接編譯和安裝了
make 

make install
  • 沒有報錯的話就是安裝成功了

動態編譯

還有另一種方法可以在nginx構建中包含nginx-module-vts。我們之前遵循在nginx中編譯靜態模塊的路徑。現在讓我們討論模塊的動態添加。

在此之前,我們需要檢查我們的sources.list是否包含官方nginx源代碼。使用您喜歡的編輯器訪問/etc/apt/sources.list並加入如下內容。

deb http://nginx.org/packages/ubuntu/ bionic nginx
deb-src http://nginx.org/packages/ubuntu/ bionic nginx
...
  • 現在我們準備使用官方源來獲取nginx的源代碼。
cd /tmp
sudo mkdir nginx_source_code
apt source nginx

  • 同樣獲取 module
git clone git://github.com/vozlt/nginx-module-vts.git
  • 最後編譯這個模塊到Nginx 中
cd ./nginx-1.16.0
./configure --with-compat --add-dynamic-module=../nginx-module-vts/
make modules
cp objs/ngx_http_vhost_traffic_status_module.so /etc/nginx/modules/

好了,以上就是動態添加nginx-vts-module 模塊的方法(推薦)。

第二步,配置模塊獲取Mtrics的Nginx Location

現在,我們在Nginx 中配置相應的location 路徑來顯示監控指標。例如。我們打算在8080端口上配置location,顯示結果在 [target_server_ip] /status。

  • 在/etc/nginx/nginx.conf 配置文件的http 模塊中,添加如下:
http {
vhost_traffic_status_zone;
...
}
  • 如果你配置了動態模塊,那麼還需要在全局中顯性添加如下的模塊加載配置
load_module modules/ngx_http_vhost_traffic_status_module.so;
...
http {
vhost_traffic_status_zone;
...
}
  • 在server部分,我們會處理8080端口上location為/status的外部請求。location中配置了相應的模塊指令。這是一個基本配置。這裡(https://github.com/vozlt/nginx-module-vts#use-cases)有所有可用的指令和用法示例。
server {
listen 8080;
listen [::]:8080;
location / {
}
location /status {
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}
}

順便說一句,為了如果你想禁止公網或者外網的其他請求,只需要本機才可以訪問的話,可以在location中配置如下指令:

...
location /status {
...
allow any_ip_address; # E.g. localhost ip address
deny all;
}
...

非常完美!這一步就算成功了,我相信你會毫無問題地完成這一部分。因此,在瀏覽器中打開相應的URL轉到xxx.xxx.xxx.xxx:8080/status應該會發現類似的界面:

「Prometheus系列」實戰—Prometheus + Grafana——Nginx 監控

第三步,安裝部署Nginx-vts-exporter

  • 下載相應的Github 上面編譯好的二進制包
wget https://github.com/hnlq715/nginx-vts-exporter/releases/download/v0.10.3/nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
  • 下載完成後,解壓然後拷貝二進制文件到相應的bin目錄下
tar -xvf nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
cp nginx-vts-exporter-0.10.3.linux-amd64/nginx-vts-exporter /usr/local/bin

  • 創建用於運行exporter的用戶
sudo useradd — no-create-home — shell /bin/false nginx_vts_exporter
  • 創建用於後臺管理和啟動的systemd service
sudo touch /etc/systemd/system/nginx_vts_exporter.service
  • 把如下內容放入到service 文件中
[Unit]
Description=Nginx vts exporter
Wants=network-online.target
After=network-online.target
[Service]
User=nginx_vts_exporter
Group=nginx_vts_exporter
ExecStart=/usr/local/bin/nginx_vts_exporter -nginx.scrape_uri=http://localhost:8080/status/format/json
Restart=always
RestartSec=3
[Install]
WantedBy=default.target

ExecStart 就是我們配置啟動Exporter服務以導出監控指標的選項。只需按照這種方式:ExecStart=/usr/local/bin/nginx-vts-exporter -nginx.scrape_uri=http://xxx.xxx.xxx.xxx:8080/status/format/json

xxx.xxx.xxx.xxx 是Nginx 所在的服務器的IP地址。因此,我們將端口號設置為與上一步中配置nginx_vts_module時相同。另外請查看路徑 - ... / status / format / json。你可以在服務器上試試。結果將是JSON格式輸出監控指標。通過這種格式,nginx_vts_exporter就可以獲取到數據了。

  • 現在萬事俱備只欠東風了,systemd service 創建完成後,就需要啟動它了。
sudo systemctl daemon-reload
sudo systemctl enable nginx_vts_exporter
sudo systemctl start nginx_vts_exporter
sudo systemctl status nginx_vts_exporter
  • 如果成功了,打開瀏覽器輸入xxx.xxx.xxx.xxx:9913/metrics (exporter 默認運行在9913端口上的/metrics 路徑上):
「Prometheus系列」實戰—Prometheus + Grafana——Nginx 監控

使用Prometheus來抓取metrics

Prometheus是一個用Go編寫的開源的時序數據庫,最初由SoundCloud開發。

如下是Prometheus的簡單安裝步驟(通常Golang 語言開發的程序最終都是一個二進制文件,方便使用,感興趣的可以看我寫的Golang 極客系列)。我們還將prometheus添加到systemd服務以進行後臺啟動。在開始安裝之前,請在此(https://prometheus.io/download/)獲取最新Prometheus版本。

sudo useradd — no-create-home — shell /bin/false prometheus
wget https://github.com/.../prometheus-2.10.0.linux-amd64.tar.gz
tar -xvzf prometheus-2.11.1.linux-amd64.tar.gz
sudo cp prometheus-2.11.1.linux-amd64/prometheus /usr/local/bin/
sudo cp prometheus-2.11.1.linux-amd64/promtool /usr/local/bin/
sudo mkdir /etc/prometheus
sudo cp -r prometheus-2.11.1.linux-amd64/consoles/ \\
/etc/prometheus/consoles
sudo cp -r prometheus-2.11.1.linux-amd64/console_libraries/ \\
/etc/prometheus/console_libraries
sudo cp prometheus-2.11.1.linux-amd64/prometheus.yml \\
/etc/prometheus/
sudo chown -R prometheus:prometheus /etc/prometheus
sudo mkdir /var/lib/prometheus
sudo chown prometheus:prometheus /var/lib/prometheus
  • 現在可以修改/etc/prometheus/prometheus.yml,配置如何對接nginx exporter,獲取相應的監控指標。
有一點很重要! YAML文件中不允許使用tab。只能用兩個空格來分隔嵌套。

在static_configs塊中命名為'nginx_vts_exporter'(或任何其他名稱)的Job任務中,我們配置了用於抓取指標的targets。請注意,我們配置的目標路徑不是完整的xxx.xxx.xxx.xxx:9913/metrics路徑。這是有原因的。默認情況下,taget服務器的metrics路徑設置為... / metrics。您可以通過指定metrics_path來更改它。這次我們只設置一個target服務器。但是你可以設置任意數量的targets。

  • 用於單臺target
scrape_configs:
— job_name: ‘prometheus’
# leave it unchanged
— job_name: ‘nginx_vts_exporter’
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
— targets: [‘xxx.xxx.xxx.xxx:9913’]
  • 用於多臺target
scrape_configs:
— job_name: ‘prometheus’
# leave it unchanged
— job_name: ‘nginx_vts_exporter’
static_configs:
— targets: [‘xxx.xxx.xxx.xxx:9913’, 'yyy.yyy.yyy.yyy:9913', ...]
...
  • 或者多個jobs
scrape_configs:
— job_name: ‘prometheus’
# leave it unchanged
— job_name: ‘some job 1’
...
— job_name: ‘some job 2’
...
— job_name: ‘some job 3’
  • 修改完成後,我們可以為prometheus創建systemd service了。就像創建nginx_vts_exporter 一樣
sudo touch /etc/systemd/system/prometheus.service
  • 如下內容放到service 中
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target

[Service]
User=prometheus
Group=prometheus
ExecStart=/usr/local/bin/prometheus \\
— config.file /etc/prometheus/prometheus.yml \\
— storage.tsdb.path /var/lib/prometheus/ \\
— web.console.templates=/etc/prometheus/consoles \\
— web.console.libraries=/etc/prometheus/console_libraries

[Install]
WantedBy=default.target
  • 好了,最終同樣需要啟動Prometheus服務
sudo systemctl daemon-reload
sudo systemctl start prometheus
sudo systemctl status prometheus
sudo systemctl enable prometheus

好了,現在已經做了很多的工作,我們來看看Prometheus中的metrics。你可以通過訪問xxx.xxx.xxx.xxx:9090或者xxx.xxx.xxx.xxx:9090/metics 來查看具體數據。

「Prometheus系列」實戰—Prometheus + Grafana——Nginx 監控

在Prometheus的Web界面中,您可以查看路徑為xxx.xxx.xxx.xxx:9090/targets。在這裡,您可以看到我們之前在prometheus.yml文件中配置的target服務器。

「Prometheus系列」實戰—Prometheus + Grafana——Nginx 監控

「Prometheus系列」實戰—Prometheus + Grafana——Nginx 監控

這就是Prometheus 界面中看的。UI 比較簡單,所以我們會用更好方式來展示這些數據——可視化metrics的最佳方式之一是Grafana。我們來看看接下來的最後一部分。

Grafana 可視化

Grafana 是可以展示後端各種時序數據庫(比如Graphite, InfluxDB,當然還有Prometheus)的Web前端。

下載(https://grafana.com/grafana/download)並安裝最新的deb安裝包。

wget https://dl.grafana.com/oss/release/grafana_6.3.2_amd64.deb 
sudo dpkg -i grafana_6.3.2_amd64.deb
sudo systemctl start grafana-server
sudo systemctl status grafana-server
sudo systemctl enable grafana-server

注意:grafana 默認運行在3000端口上。現在可以打開瀏覽器輸入 xxx.xxx.xxx.xxx:3000。默認登陸名admin/admin.

  • 添加Prometheus 作為數據源。xxx.xxx.xxx.xxx:9090 替換為自己IP。
「Prometheus系列」實戰—Prometheus + Grafana——Nginx 監控

你可以自己從零開始創建自己的儀表盤。另一方面,Grafana 社區也提供了很多優秀的dashboard模板。可以直接導入(http://your-grafana-host:3000/dashboard/import

「Prometheus系列」實戰—Prometheus + Grafana——Nginx 監控

我們選擇了儀表盤模板id 為2949。在第一個輸入字段中鍵入2949,然後單擊下一步就會看到如下界面:

注意:如果已經存在了的話就是提示已存在,繼續導入就會覆蓋之前的儀表盤。

「Prometheus系列」實戰—Prometheus + Grafana——Nginx 監控

選擇在下拉前面的步驟中創建的名為“prometheus”的數據源,然後單擊“導入”按鈕,完成後就可以查看儀表盤的數據了。

「Prometheus系列」實戰—Prometheus + Grafana——Nginx 監控

稍微研究一下,你會發現這個界面非常簡單。你也可以自己創建屬於自己的儀表盤。

總結

當然,本文不會涉及到所有的功能。其他的豐富功能會在接下來系列博客中一一為大家呈現。


分享到:


相關文章: