Mark Ku's Blog

前言

Prometheus 和 Grafana 是 Kubernetes 生態系統中的常見組合,這篇文章+將展示如何使用 Prometheus 監控 Nginx 請求,並利用 Grafana 進行數據可視化。

了解 Nginx 的 stub_status

在啟動 Prometheus 容器應用前,讓我們先了解 Nginx 的 stub_status 模組,它提供了關於 Nginx 運行狀態的基本指標,Prometheus 主要是透過,stub_status 獲取 nginx 上的資訊。

設定 Dockerfile

首先,創建一個 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

訪問 Nginx 狀態頁面

啟動容器後,訪問 http://localhost:8881/nginx_status,你會看到類似以下的頁面:

Nginx Status
Nginx Status

Nginx 狀態資訊

Active connections: 2
目前有 2 個活動連線。

server accepts handled requests: 2 2 2

  • 2:已接受的連線數。
  • 2:已成功處理的連線數。
  • 2:總請求數(可能大於連線數,因為每個連線可以處理多個請求)。

Reading: 0 Writing: 1 Waiting: 1

  • Reading: 0:正在讀取請求的連線數。
  • Writing: 1:正在傳送響應的連線數。
  • Waiting: 1:空閒等待新請求的連線數(使用 HTTP Keep-Alive)。
    P.S.當前伺服器負載較輕,共有 2 個連線,其中 1 個正在處理請求,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 設定

編寫 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

查看 Prometheus Targets

在瀏覽器中打開 http://localhost:9090/targets,你可以查看 Prometheus 採集器的目標狀態。

Prometheus Targets
Prometheus Targets

使用 Prometheus 繪製 Nginx 指標圖表

切換 Prometheus 的 Graph 頁籤,搜尋nginx,可以根據 Nginx 的指標繪製即時圖表:

Prometheus Graph
Prometheus Graph

然而,Prometheus 的報表較為簡單。如果你需要更精美的圖表或更多篩選選項,可以使用 Grafana 來展示。

設定 Grafana 連接 Prometheus

  1. 打開 Grafana 儀表板(http://localhost:3007/)。
  2. 進入 "Connection" 部分,點擊 "Add new connection" 並選擇 "Prometheus"。
Grafana Prometheus
Grafana Prometheus

建立 Grafana Dashboard

你可以從 Grafana Dashboard 市集下載現成的模板,來展示 Nginx 的指標。

下載 Dashboard 範本

下載 Dashboard JSON

Download Dashboard Settings
Download Dashboard Settings

匯入 Dashboard 模板

回到 Grafana 儀表板,點擊 "New Import" 並導入你下載的 JSON 模板。 Import Dashboard Settings

執行 K6 壓測

撰寫 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 儀表板上的即時數據

進行壓力測試後,Grafana 儀表板將即時顯示 Nginx 的連線數量等指標。

Grafana Live Data
Grafana Live Data

相關程式碼

所有程式碼和設定檔都可以在 GitHub Repo 上找到。

參考資料

作者

Mark Ku

擁有 10+ 年經驗的資深軟體工程師,現為 AI 應用 Builder,專注於大型平台架構與簡化複雜系統設計,從電商系統到訂閱與收費平台,結合 AI Agent、AI 整合與自動化開發,打造高效率且可持續演進的產品技術基礎。閱讀更多

覺得這篇有幫助?

作者做的免費工具、每日 Podcast 與電子報,都在這裡。

Mark Ku · 本文採用 CC BY 4.0 授權,轉載請註明作者並附上原文連結。

留言

訂閱電子報

訂閱後即時收到新文章通知,不錯過任何技術分享。

提交即表示同意接收電子報,隨時可

熱門文章

View all
Mark Ku
··597

Oracle Cloud 永久免費方案 Linux 主機及固定 IP :0 元打造雲端解決方案

Oracle Cloud 永久免費方案 Linux 主機及固定 IP :0 元打造雲端解決方案
Mark Ku
··469

告別 Postman 收費陷阱!開源 Git 原生 API 測試神器 Bruno 實戰指南

告別 Postman 收費陷阱!開源 Git 原生 API 測試神器 Bruno 實戰指南
Mark Ku
··327

一款免費開源類似於 Notion 類知識庫系統 — Outline Wiki 佈署與備份全攻略

一款免費開源類似於 Notion 類知識庫系統 — Outline Wiki 佈署與備份全攻略
Mark Ku
··239

打造高效 API 管理平台:從 0 開始部署 Kong Gateway - Part 1

打造高效 API 管理平台:從 0 開始部署 Kong Gateway - Part 1
Mark Ku
··233

訓練自己的 AI 語音:硬體門檻、開源模型比較與 LoRA 微調

訓練自己的 AI 語音:硬體門檻、開源模型比較與 LoRA 微調
Mark Ku
··220

在 Ubuntu 上設置 Samba 來共享資料夾,讓 Windows 11 用戶可以存取

在 Ubuntu 上設置 Samba 來共享資料夾,讓 Windows 11 用戶可以存取