Prometheus 和 Grafana 是 Kubernetes 生態系統中的常見組合,這篇文章將展示如何使用 Prometheus 監控 Nginx 請求,並利用 Grafana 進行數據可視化。
stub_status
在啟動 Prometheus 容器應用前,讓我們先了解 Nginx 的 stub_status
模組,它提供了關於 Nginx 運行狀態的基本指標,Prometheus 主要是透過,stub_status 獲取 nginx 上的資訊。
首先,創建一個 Dockerfile,基於 Nginx 映像檔進行自訂設定:
FROM nginx COPY nginx.conf /etc/nginx/conf.d/default.conf
nginx.conf
接著,編寫 nginx.conf
設定文件來啟用 Nginx 的狀態頁面,這將暴露供 Prometheus 爬取:
server { listen 80; # 使用本地端口 server_name localhost; # 設定為 localhost location /nginx_status { stub_status on; # 啟用狀態模組 access_log off; allow all; # 允許所有 IP 訪問 } }
使用以下命令建置 Docker 映像並啟動容器:
docker build -t my-nginx:latest . docker run -d -p 8881:80 --name nginx-prometheus-exporter my-nginx:latest
啟動容器後,訪問 http://localhost:8881/nginx_status
,你會看到類似以下的頁面:
Active connections: 2
目前有 2 個活動連線。
server accepts handled requests: 2 2 2
Reading: 0 Writing: 1 Waiting: 1
grafana ( 報表呈現 ) > prometheus-exporter ( 主動爬取資料 ) > nginx/nginx-prometheus-exporter (將這些數據暴露給 Prometheus的工具 ) > nginx status ( 網站服務器,提供網頁伺服器的狀態 )
刪除先前的測試容器,接下來,我們建立 deployment.yaml
文件來部署包含所有服務的 Docker 容器。
deployment.yaml
範例version: "3.8" services: mynginx: build: ./nginx/ container_name: mynginx ports: - 8885:80 nginx-prometheus-exporter: image: nginx/nginx-prometheus-exporter container_name: nginx-prometheus-exporter command: -nginx.scrape-uri http://nginx:80/nginx_status ports: - 9113:9113 depends_on: - nginx prometheus: image: prom/prometheus:v2.35.0 container_name: prometheus volumes: - ./prometheus.yaml:/etc/prometheus/prometheus.yaml - ./prometheus_data:/prometheus command: - "--config.file=/etc/prometheus/prometheus.yaml" ports: - "9090:9090" renderer: image: grafana/grafana-image-renderer environment: BROWSER_TZ: Asia/Taipei ports: - "8082:8081" grafana: image: grafana/grafana container_name: grafana volumes: - ./grafana_data:/var/lib/grafana environment: GF_SECURITY_ADMIN_PASSWORD: pass GF_RENDERING_SERVER_URL: http://renderer:8082/render GF_RENDERING_CALLBACK_URL: http://grafana:3007/ GF_LOG_FILTERS: rendering:debug depends_on: - prometheus - renderer ports: - "3007:3000"
編寫 prometheus.yaml
來設定 Prometheus 如何抓取數據。
global: scrape_interval: 5s # 設定抓取頻率 external_labels: monitor: "my-monitor" scrape_configs: - job_name: "prometheus" static_configs: - targets: ["localhost:9090"] - job_name: "nginx_exporter" static_configs: - targets: ["nginx-prometheus-exporter:9113"]
使用 Docker Compose 啟動容器服務:
docker-compose -f ./deployment.yaml up -d
在瀏覽器中打開 http://localhost:9090/targets,你可以查看 Prometheus 採集器的目標狀態。
切換 Prometheus 的 Graph 頁籤,搜尋nginx
,可以根據 Nginx 的指標繪製即時圖表:
然而 ,Prometheus 的報表較為簡單。如果你需要更精美的圖表或更多篩選選項,可以使用 Grafana 來展示。
你可以從 Grafana Dashboard 市集下載現成的模板,來展示 Nginx 的指標。
回到 Grafana 儀表板,點擊 “New Import” 並導入你下載的 JSON 模板。
撰寫 K6 壓力測試腳本,模擬流量並驗證 Nginx 性能:
import http from 'k6/http'; import { check, sleep } from 'k6'; export const options = { stages: [ { duration: '30s', target: 3000 }, // 負載測試從 0 到 3000 個虛擬使用者,持續 30 秒 { duration: '1m30s', target: 3000 }, // 維持 3000 個虛擬使用者,持續 1 分 30 秒 { duration: '20s', target: 0 }, // 減少虛擬使用者數量 ] }; export default function () { const res = http.get('http://192.168.0.88:8885/nginx_status'); // your nginx ip check(res, { 'status was 200': (r) => r.status == 200 }); sleep(1); }
使用 Docker 版本的 K6,無需額外安裝,直接執行壓力測試:
// Windows 腳本 cat script.js | docker run --rm -i grafana/k6 run -
進行壓力測試後,Grafana 儀表板將即時顯示 Nginx 的連線數量等指標。