CloudWatch 解決方案:Amazon EC2 上的 NGINX 工作負載 - Amazon CloudWatch

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

CloudWatch 解決方案:Amazon EC2 上的 NGINX 工作負載

此解決方案可協助您透過 CloudWatch 代理程式,為在 EC2 執行個體上執行的 NGINX 應用程式設定開箱即用的指標收集功能。如需所有 CloudWatch 可觀測性解決方案的一般資訊,請參閱CloudWatch 可觀測性解決方案

要求

此解決方案適用於下列情況:

優勢

此解決方案提供 NGINX 監控功能,針對下列使用案例提供寶貴洞察:

  • 檢視連線指標以識別潛在瓶頸、連線問題或異常使用情況。

  • 分析 HTTP 請求量以了解 NGINX 上的整體流量負載。

以下是此解決方案的主要優勢:

  • 透過 CloudWatch 代理程式組態自動執行 NGINX 指標收集,免除手動檢測需求。

  • 提供預先設定的整合式 CloudWatch 儀表板,專門用於監控 NGINX 指標。儀表板將自動處理透過此解決方案設定之新 NGINX EC2 執行個體產生的指標,即使您第一次建立儀表板時這些指標不存在。

下圖是此解決方案之儀表板的範例。

NGINX 解決方案的儀表板範例。

成本

此解決方案會在您的帳戶中建立並使用資源。您需要支付標準用量的費用,包括下列項目:

  • CloudWatch 代理程式為此解決方案收集的所有指標,皆會採用內嵌指標格式 (EMF) 發布至 CloudWatch Logs。這些 CloudWatch 日誌將依據容量和保留期限計費。因此,對於此解決方案,您不需要為任何 PutMetricData API 呼叫付費。從您的日誌中擷取並匯入的指標將按自訂指標計費。此解決方案使用的指標數目取決於 EC2 主機的數目。

    • 為此解決方案設定的每個 NGINX EC2 主機總共可發布八個指標。

  • 一個自訂儀表板。

如需 CloudWatch 定價的詳細資訊,請參閱 Amazon CloudWatch 定價

定價計算器可協助您估算使用此解決方案的每月大致費用。

使用定價計算器來估算解決方案的每月費用
  1. 開啟 Amazon CloudWatch 定價計算器

  2. 針對選擇區域,選取 AWS 區域 您要部署解決方案的 。

  3. 指標區段中,對於指標數目,輸入 8 * number of EC2 instances configured for this solution

  4. 日誌區段中,對於標準日誌:資料擷取,輸入由 CloudWatch 代理程式在所有 EC2 主機上產生的預估每日日誌量。例如,五個 EC2 執行個體每天產生的資料量少於 1000 位元組。設定完成後,您可以使用 CloudWatch Logs 提供的 IncomingBytes 指標來檢查位元組用量。請務必選取適當的日誌群組。

  5. 日誌區段中,對於日誌儲存/存檔 (標準和付費日誌),選取 Yes to Store Logs: Assuming 1 month retention。如果決定對保留期進行自訂變更,請修改此值。

  6. 儀表板和警示區段中,對於儀表板數目,輸入 1

  7. 可以在定價計算器底部查看每月預估費用。

此解決方案的 CloudWatch 代理程式組態

CloudWatch 代理程式是在您的伺服器和容器化環境中持續自主執行的軟體。它從您的基礎結構和應用程式收集指標、日誌和追蹤,並將其傳送到 CloudWatch 和 X-Ray。

如需 CloudWatch 代理程式的詳細資訊,請參閱使用 CloudWatch 代理程式收集指標、日誌和追蹤

此解決方案中的代理程式組態會收集一組指標,協助您開始監控和觀測 NGINX 工作負載。CloudWatch 代理程式可以設定為,收集的 NGINX 指標數多於儀表板預設顯示的指標數。如需可以收集之所有 NGINX 指標的清單,請參閱 NGINX OSS 的指標

設定 CloudWatch 代理程式之前,必須先設定 NGINX 以公開其指標。其次,必須安裝和設定第三方 Prometheus 指標匯出工具。

公開 NGINX 指標

注意

針對 Linux,請使用下列命令。檢查 NGINX for Windows 頁面,以取得 Windows Server 中的等效指令。

必須先啟用 stub_status 模組。在 NGINX 設定檔中新增一個位置區塊。在 nginx.confserver 區塊中新增下列行,以啟用 NGINX 的 stub_status 模組:

location /nginx_status { stub_status on; allow 127.0.0.1; # Allow only localhost to access deny all; # Deny all other IPs }

重新載入 NGINX 前,請驗證您的 NGINX 組態:

sudo nginx -t

此驗證指令有助於防止任何意外錯誤,進而避免您的網站當機。以下範例展示的是成功的回應:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful

成功驗證經更新的組態後,請重新載入 NGINX (預期無輸出):

sudo systemctl reload nginx

此命令會指示 NGINX 程序重新載入組態。相較於完全重新啟動,重新載入的過程更為平穩。重新載入會以新組態啟動新的工作程序,並平穩地關閉舊的工作程序。

測試 NGINX 狀態端點:

curl http://127.0.0.1/nginx_status

以下範例展示的是成功的回應:

Active connections: 1 server accepts handled requests 6 6 6 Reading: 0 Writing: 1 Waiting: 0

下列範例展示的是失敗的回應 (先檢閱先前的步驟,再繼續):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <title>The page is not found</title> ...

設定 Prometheus 指標匯出工具

官方 GitHub 儲存庫下載最新的 NGINX Prometheus 匯出工具版本。必須下載平台的相關二進位檔。

下列範例展示的是 AMD64 的命令:

cd /tmp wget https://github.com/nginxinc/nginx-prometheus-exporter/releases/download/v1.3.0/nginx-prometheus-exporter_1.3.0_linux_amd64.tar.gz tar -xzvf nginx-prometheus-exporter_1.3.0_linux_amd64.tar.gz sudo cp nginx-prometheus-exporter /usr/local/bin/ rm /tmp/nginx-prometheus-exporter*

執行 Prometheus 匯出工具,並將其指向 NGINX 子狀態頁面:

nohup /usr/local/bin/nginx-prometheus-exporter -nginx.scrape-uri http://127.0.0.1/nginx_status &>/dev/null &

下列範例展示的是一則回應 (背景任務 ID 和 PID):

[1] 74699

測試 NGINX Prometheus 端點

驗證 NGINX Prometheus 匯出工具是否已開始公開相關指標:

curl http://localhost:port-number/metrics

以下範例展示的是成功的回應:

# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles. # TYPE go_gc_duration_seconds summary go_gc_duration_seconds{quantile="0"} 0 go_gc_duration_seconds{quantile="0.25"} 0 ... # HELP nginx_connections_accepted Accepted client connections # TYPE nginx_connections_accepted counter nginx_connections_accepted 14 # HELP nginx_connections_active Active client connections # TYPE nginx_connections_active gauge nginx_connections_active 1 ... # TYPE promhttp_metric_handler_requests_total counter promhttp_metric_handler_requests_total{code="200"} 1 promhttp_metric_handler_requests_total{code="500"} 0 promhttp_metric_handler_requests_total{code="503"} 0

此解決方案的代理程式組態

代理程式收集的指標在代理程式組態中定義。解決方案提供代理程式組態,以收集適用於解決方案儀表板的建議指標與適當維度。

部署解決方案的步驟稍後會在部署解決方案的代理程式中說明。以下資訊旨在協助您了解如何為您的環境自訂代理程式組態。

您必須為環境自訂代理程式和 Prometheus 組態的某些部分,例如 Prometheus 匯出工具使用的連接埠號碼。

可以透過下列命令驗證 Prometheus 匯出工具使用的連接埠:

sudo netstat -antp | grep nginx-prom

下列範例展示的是一則回應 (參閱連接埠值 9113):

tcp6 0 0 :::9113 :::* LISTEN 76398/nginx-prometh

NGINX 主機的代理程式組態

具有 Prometheus 監控功能的 CloudWatch 代理程式需要兩種組態來湊集 Prometheus 指標。每個組態將儲存為 SSM 參數儲存區中的獨立參數,如稍後的步驟 2:將建議的 CloudWatch 代理程式設定檔儲存在 Systems Manager 參數儲存區中中所述。

第一個設定針對的是 Prometheus 匯出工具,如 Prometheus 的 scrape_config 文件中所述。第二個組態適用於 CloudWatch 代理程式。

Prometheus 組態

port-number 替換為您伺服器的連接埠。

global: scrape_interval: 30s scrape_timeout: 10s scrape_configs: - job_name: 'nginx' metrics_path: /metrics static_configs: - targets: ['localhost:port-number'] ec2_sd_configs: - port: port-number relabel_configs: - source_labels: ['__meta_ec2_instance_id'] target_label: InstanceId metric_relabel_configs: - source_labels: ['__name__'] regex: 'nginx_up|nginx_http_requests_total|nginx_connections_.*' action: keep

CloudWatch 代理程式組態

根據先前的 CloudWatch 代理程式組態,這些指標會使用內嵌指標格式 (EMF) 透過 CloudWatch Logs 發布。這些日誌被設定為使用日誌群組 nginx。可以使用代表 CloudWatch 日誌的不同名稱來自訂 log_group_name

如果您使用的是 Windows Server,請在下列組態中將 prometheus_config_path 設定為 C:\\ProgramData\\Amazon\\AmazonCloudWatchAgent\\prometheus.yaml

{ "agent": { "metrics_collection_interval": 60 }, "logs": { "metrics_collected": { "prometheus": { "log_group_name": "nginx", "prometheus_config_path": "/opt/aws/amazon-cloudwatch-agent/etc/prometheus.yaml", "emf_processor": { "metric_declaration_dedup": true, "metric_namespace": "CWAgent", "metric_declaration":[ { "source_labels":["InstanceId"], "metric_selectors":["nginx_up", "nginx_http_requests_total", "nginx_connections*"], "dimensions": [["InstanceId"]] } ] } } } } }

部署解決方案的代理程式

安裝 CloudWatch 代理程式的方法有很多種,具體取決於使用案例。建議您使用 Systems Manager 安裝此解決方案。它提供主控台體驗,並可讓您更輕鬆地管理單一 AWS 帳戶中的受管伺服器機群。本節說明採用 Systems Manager,適用於您沒有以現有組態執行 CloudWatch 代理程式的情況。您可以依循確認 CloudWatch 代理程式正在執行中中的步驟,檢查 CloudWatch 代理程式是否正在執行。

如果您已在部署工作負載和管理代理程式組態的 EC2 主機上執行 CloudWatch 代理程式,可以略過本節中的說明,並依循現有部署機制來更新組態。請務必將新的 CloudWatch 代理程式和 Prometheus 組態與您的現有組態合併,然後部署合併的組態。如果您使用 Systems Manager 來儲存和管理 CloudWatch 代理程式的組態,可以將組態合併到現有的參數值。如需詳細資訊,請參閱管理 CloudWatch 代理程式設定檔

注意

使用 Systems Manager 部署下列 CloudWatch 代理程式組態,將取代或覆寫 EC2 執行個體上的任何現有 CloudWatch 代理程式組態。您可以根據自己的特定環境或使用案例修改此組態。組態中定義的指標,是儀表板提供解決方案需要滿足的最低要求。

部署程序包含以下步驟:

  • 步驟 1:確定目標 EC2 執行個體具有所需的 IAM 許可。

  • 步驟 2:將建議的代理程式設定檔儲存在 Systems Manager 參數儲存區中。

  • 步驟 3:使用 CloudFormation 堆疊在一或多個 EC2 執行個體上安裝 CloudWatch 代理程式。

  • 步驟 4:確認已正確完成代理程式設定。

步驟 1:確定目標 EC2 執行個體具有所需的 IAM 許可

您必須授與 Systems Manager 安裝和設定 CloudWatch 代理程式的許可。必須授與 CloudWatch 代理程式從 EC2 執行個體發布遙測到 CloudWatch 的許可。還必須授與 CloudWatch 代理程式 EC2 讀取存取權。需要 EC2 讀取存取權,才能將 EC2 InstanceId 新增為指標維度。此額外需求由 prometheus.yaml 驅動,如上所述,因其透過 EC2 服務探索使用 __meta_ec2_instance_id

確定連結至執行個體的 IAM 角色已連結 CloudWatchAgentServerPolicyAmazonSSMManagedInstanceCoreAmazonEC2ReadOnlyAccess IAM 政策。

步驟 2:將建議的 CloudWatch 代理程式設定檔儲存在 Systems Manager 參數儲存區中

參數儲存區透過安全地儲存和管理組態參數,簡化在 EC2 執行個體上安裝 CloudWatch 代理程式的流程,無需使用硬式編碼值。這可確保部署程序更安全、更靈活,實現集中式管理,並能更輕鬆地更新多個執行個體的組態。

依循下列步驟,將建議的 CloudWatch 代理程式設定檔儲存為參數儲存區中的參數。

建立 CloudWatch 代理程式設定檔作為參數
  1. 在 https://https://console.aws.amazon.com/systems-manager/ 開啟 AWS Systems Manager 主控台。

  2. 確認主控台上選取的區域是執行 NGINX 的區域。

  3. 從導覽窗格中,選擇應用程式管理參數儲存區

  4. 依循下列步驟為組態建立新的參數。

    1. 選擇 Create parameter (建立參數)

    2. 名稱方塊中,輸入您將用於在後續步驟中引用 CloudWatch 代理程式設定檔的名稱。例如 AmazonCloudWatch-NGINX-CloudWatchAgent-Configuration

    3. (選用) 在描述方塊中,輸入參數描述。

    4. 對於參數層,選擇標準

    5. 類型選擇字串

    6. 對於資料類型,選擇文字

    7. 方塊中,貼上 NGINX 主機的代理程式組態中列示的對應 JSON 區塊。請務必視需要進行自訂。例如相關的 log_group_name

    8. 選擇 Create parameter (建立參數)

建立 Prometheus 設定檔作為參數
  1. 在 https://https://console.aws.amazon.com/systems-manager/ 開啟 AWS Systems Manager 主控台。

  2. 從導覽窗格中,選擇應用程式管理參數儲存區

  3. 依循下列步驟為組態建立新的參數。

    1. 選擇 Create parameter (建立參數)

    2. 名稱方塊中,輸入您將用於在後續步驟中引用設定檔的名稱。例如 AmazonCloudWatch-NGINX-Prometheus-Configuration

    3. (選用) 在描述方塊中,輸入參數描述。

    4. 對於參數層,選擇標準

    5. 類型選擇字串

    6. 對於資料類型,選擇文字

    7. 方塊中,貼上 NGINX 主機的代理程式組態中列示的對應 YAML 區塊。請務必視需要進行自訂。例如,根據 targets 的相關連接埠號碼。

    8. 選擇 Create parameter (建立參數)

步驟 3:安裝 CloudWatch 代理程式並使用 CloudFormation 範本套用組態

您可以使用 AWS CloudFormation 安裝代理程式,並將其設定為使用您在先前步驟中建立的 CloudWatch 代理程式組態。

為此解決方案安裝和設定 CloudWatch 代理程式
  1. 使用此連結開啟 CloudFormation 快速建立堆疊精靈:https://https://console.aws.amazon.com/cloudformation/home?#/stacks/quickcreate?templateURL=https://aws-observability-solutions-prod-us-east-1.s3.us-east-1.amazonaws.com/CloudWatchAgent/CFN/v1.0.0/cw-agent-installation-template-with-prometheus-config-1.0.0.json

  2. 確認主控台上選取的區域是執行 NGINX 工作負載的區域。

  3. 對於​堆疊名稱,輸入可識別此堆疊的名稱,例如 CWAgentInstallationStack

  4. 參數區段中,執行以下動作:

    1. 針對 CloudWatchAgentConfigSSM,輸入您先前建立之代理程式組態的 AWS Systems Manager 參數名稱,例如 AmazonCloudWatch-NGINX-CloudWatchAgent-Configuration

    2. 針對 PrometheusConfigSSM,輸入您先前建立之代理程式組態的 AWS Systems Manager 參數名稱,例如 AmazonCloudWatch-NGINX-Prometheus-Configuration

    3. 若要選取目標執行個體,您有兩個選項。

      1. 對於 InstanceIds,指定以逗號分隔的執行個體 ID 清單,列出您想要使用此組態安裝 CloudWatch 代理程式的執行個體 ID。您可以列出一個或多個執行個體。

      2. 若要大規模部署,可以指定 TagKey 和對應的 TagValue,以鎖定使用此標籤和值的所有 EC2 執行個體。指定 TagKey 時,必須指定對應的 TagValue。(對於 Auto Scaling 群組,請為 TagKey 指定 aws:autoscaling:groupName,並為 TagValue 指定 Auto Scaling 群組名稱,以部署到 Auto Scaling 群組內的所有執行個體。)

  5. 檢閱設定,然後選擇建立堆疊

如果想要先編輯範本檔案以進行自訂,請選擇建立堆疊精靈下的上傳範本檔案選項,以上傳經編輯的範本。如需詳細資訊,請參閱在 CloudFormation 主控台上建立堆疊。可以使用以下連結下載範本:https://aws-observability-solutions-prod-us-east-1.s3.us-east-1.amazonaws.com/CloudWatchAgent/CFN/v1.0.0/cw-agent-installation-template-with-prometheus-config-1.0.0.json

注意

完成這個步驟後,此 Systems Manager 參數將與目標執行個體中執行的 CloudWatch 代理程式關聯。這表示:

  1. 如果刪除 Systems Manager 參數,代理程式將停止運作。

  2. 如果編輯 Systems Manager 參數,組態變更會自動套用至代理程式,排程頻率預設為 30 天。

  3. 如果想要即刻將變更套用至此 Systems Manager 參數,必須再次執行此步驟。如需關於關聯的更多資訊,請參閱在 Systems Manager 中使用關聯

步驟 4:確認代理程式設定已正確設定

您可以依循確認 CloudWatch 代理程式正在執行中中的步驟,檢查 CloudWatch 代理程式是否已安裝。若 CloudWatch 代理程式未安裝且未執行,請確認您已正確完成所有設定。

若所有設定皆正確無誤,您應可看到 NGINX 指標已發布至 CloudWatch。可以檢查 CloudWatch 主控台,以確認系統是否正在發布這些指標。

驗證 NGINX 指標是否已發布至 CloudWatch
  1. 透過 https://console.aws.amazon.com/cloudwatch/ 開啟 CloudWatch 主控台。

  2. 依序選擇指標所有指標

  3. 請確定您已選取部署解決方案的區域,然後選擇自訂命名空間CWAgent

  4. 搜尋 nginx_http_requests_total 等指標。如果您看到這些指標的結果,則指標會發布至 CloudWatch。

建立 NGINX 解決方案儀表板

此解決方案提供的儀表板會透過彙總和呈現所有執行個體的指標,呈現 NGINX 工作負載指標。儀表板會顯示每個指標的主要貢獻因子 (每個指標小工具的前 10 個因子) 明細。這可協助您快速識別對觀測指標有重大貢獻的極端值或執行個體。

若要建立儀表板,可以使用下列選項:

  • 使用 CloudWatch 主控台建立儀表板。

  • 使用 AWS CloudFormation 主控台部署儀表板。

  • 下載 AWS CloudFormation 基礎設施做為程式碼,並將其整合為持續整合 (CI) 自動化的一部分。

透過使用 CloudWatch 主控台建立儀表板,您可以在實際建立和收費之前預覽儀表板。

注意

在此解決方案 CloudFormation 中使用 建立的儀表板會顯示部署解決方案的區域指標。請務必在發佈 NGINX 指標的區域中建立 CloudFormation 堆疊。

如果已在 CloudWatch 代理程式組態中指定 CWAgent 以外的自訂命名空間,則必須變更儀表板的 CloudFormation 範本,將 CWAgent 替換為您正在使用的自訂命名空間。

透過 CloudWatch 主控台建立儀表板
  1. 使用此連結開啟 CloudWatch 主控台建立儀表板 https://console.aws.amazon.com/cloudwatch/home?#dashboards?dashboardTemplate=NginxOnEc2&referrer=os-catalog

  2. 確認主控台上選取的區域是執行 NGINX 工作負載的區域。

  3. 輸入儀表板的名稱,然後選擇建立儀表板

    為方便區分此儀表板與其他區域的類似儀表板,建議在儀表板名稱中包含區域名稱,例如 NGINXDashboard-us-east-1

  4. 預覽儀表板,然後選擇儲存以建立儀表板。

透過 建立儀表板 CloudFormation
  1. 使用此連結開啟 CloudFormation 快速建立堆疊精靈:https://https://console.aws.amazon.com/cloudformation/home?#/stacks/quickcreate?templateURL=https://aws-observability-solutions-prod-us-east-1.s3.us-east-1.amazonaws.com/NGINX_EC2/CloudWatch/CFN/v1.0.0/dashboard-template-1.0.0.json

  2. 確認主控台上選取的區域是執行 NGINX 工作負載的區域。

  3. 對於​堆疊名稱,輸入可識別此堆疊的名稱,例如 NGINXDashboardStack

  4. 參數區段的 DashboardName 參數下,指定儀表板名稱。

  5. 為方便區分此儀表板與其他區域的類似儀表板,建議在儀表板名稱中包含區域名稱,例如 NGINXDashboard-us-east-1

  6. 功能和轉換下,確認轉換的存取功能。請注意,CloudFormation 不會新增任何 IAM 資源。

  7. 檢閱設定,然後選擇建立堆疊

  8. 堆疊狀態變為 CREATE_COMPLETE 之後,請在所建立堆疊下方選擇資源索引標籤,然後選擇實體 ID 下方的連結以前往儀表板。也可以在 CloudWatch 主控台中存取儀表板,方法是選擇主控台左側導覽窗格中的儀表板,然後在自訂儀表板下尋找儀表板名稱。

如果想要先編輯範本檔案以進行自訂,請選擇建立堆疊精靈下的上傳範本檔案選項,以上傳經編輯的範本。如需詳細資訊,請參閱在CloudFormation 主控台上建立堆疊。可以使用以下連結下載範本:https://aws-observability-solutions-prod-us-east-1.s3.us-east-1.amazonaws.com/NGINX_EC2/CloudWatch/CFN/v1.0.0/dashboard-template-1.0.0.json

開始使用 NGINX 儀表板

以下是您可以嘗試使用新 NGINX 儀表板處理的一些任務。這些任務可讓您驗證儀表板是否運作正常,並提供實際操作經驗,協助您運用儀表板監控 NGINX 工作負載。當您嘗試這些功能時,可逐漸熟悉儀表板的操作介面,並學會解讀視覺化的指標資料。

檢閱連線指標

連線區段中,可以找到多數個關鍵指標,助您深入了解 NGINX 伺服器的用戶端連線處理。監控這些連線指標可協助您識別潛在瓶頸、連線問題或異常連線模式。

  • 接受的用戶端連線

  • 作用中的用戶端連線

  • 已處理的用戶端連線

  • 讀取請求的連線

  • 閒置用戶端連線

  • 寫入回應的連線

分析 HTTP 請求量

HTTP 請求區段中的 request 指標會顯示 NGINX 伺服器處理的 HTTP 請求總數。隨著時間的推移追蹤此指標,可協助您了解 NGINX 基礎結構的整體流量負載,據此規劃資源分配與擴展方案。