亚马逊云服务器集群的 NGINX 工作负载示例 - Amazon CloudWatch
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

亚马逊云服务器集群的 NGINX 工作负载示例

NGINX Prometheus 导出器可以抓取和公开 NGINX 数据作为 Prometheus 指标。此示例将导出器与适用于亚马逊云服务器的 NGINX 反向代理服务结合使用。

有关 NGINX Prometheus 导出器的更多信息,请参阅。nginx-普罗米修斯-出口商(位于 GitHub 上)。有关 NGINX 反向代理的更多信息,请参阅。云服务器反向代理(位于 GitHub 上)。

支持 Prometheus 的 CloudWatch 代理根据亚马逊云服务器集群中的服务发现配置来抓取 NGINX Prometheus 指标。您可以将 NGINX Prometheus 导出程序配置为在不同端口或路径上公开指标。如果更改端口或路径,请更新ecs_service_discovery部分中,查看 CloudWatch 代理配置文件。

为 Amazon 云服务器群集安装 NGINX 反向代理示例工作负载

执行以下步骤以安装 NGINX REVERSE 代理示例工作负载。

创建 Docker 映像

为 NGINX 反向代理示例工作负载创建 Docker 映像的步骤

  1. 从 NGINX 反向代理回购中下载以下文件夹:https://github.com/awslabs/ecs-nginx-reverse-proxy/tree/master/reverse-proxy/

  2. 查找app目录并从该目录构建一个映像:

    docker build -t web-server-app ./path-to-app-directory
  3. 为 NGINX 构建自定义映像。首先,使用以下两个文件创建目录:

    • 码头文件示例:

      FROM nginx COPY nginx.conf /etc/nginx/nginx.conf
    • 一个nginx.conf文件,修改自https://github.com/awslabs/ecs-nginx-reverse-proxy/tree/master/reverse-proxy/

      events { worker_connections 768; } http { # Nginx will handle gzip compression of responses from the app server gzip on; gzip_proxied any; gzip_types text/plain application/json; gzip_min_length 1000; server{ listen 8080; location /stub_status { stub_status on; } } server { listen 80; # Nginx will reject anything not matching /api location /api { # Reject requests with unsupported HTTP method if ($request_method !~ ^(GET|POST|HEAD|OPTIONS|PUT|DELETE)$) { return 405; } # Only requests matching the whitelist expectations will # get sent to the application server proxy_pass http://app:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_cache_bypass $http_upgrade; } } }
      注意

      stub_status必须在同一端口上启用nginx-prometheus-exporter配置为从中刮取指标。在我们的示例任务定义中,nginx-prometheus-exporter配置为刮取端口 8080 中的指标。

  4. 从新目录中的文件构建映像:

    docker build -t nginx-reverse-proxy ./path-to-your-directory
  5. 将新映像上传到映像存储库以供日后使用。

创建任务定义以在亚马逊云服务器中运行 NGINX 和 Web 服务器应用程序

接下来,设置任务定义。

此任务定义允许收集和导出 NGINX Prometheus 度量。NGINX 容器跟踪来自应用程序的输入,并将该数据公开到端口 8080,如nginx.conf。NGINX 普罗米修斯导出器容器会抓取这些指标,并将它们发布到端口 9113,以便在 CloudWatch 中使用。

为 NGINX 示例亚马逊云服务器工作负载设置任务定义

  1. 使用以下内容创建任务定义 JSON 文件。Replace您自定义的 “金斯-亚姆格”替换为您的自定义 NGINX 映像的图像 URI,并将您的 Web 服务器-应用程序-映像替换为 Web 服务器应用程序映像的图像 URI。

    { "containerDefinitions": [ { "name": "nginx", "image": "your-customized-nginx-image", "memory": 256, "cpu": 256, "essential": true, "portMappings": [ { "containerPort": 80, "protocol": "tcp" } ], "links": [ "app" ] }, { "name": "app", "image": "your-web-server-app-image", "memory": 256, "cpu": 256, "essential": true }, { "name": "nginx-prometheus-exporter", "image": "docker.io/nginx/nginx-prometheus-exporter:0.8.0", "memory": 256, "cpu": 256, "essential": true, "command": [ "-nginx.scrape-uri", "http://nginx:8080/stub_status" ], "links":[ "nginx" ], "portMappings":[ { "containerPort": 9113, "protocol": "tcp" } ] } ], "networkMode": "bridge", "placementConstraints": [], "family": "nginx-sample-stack" }
  2. 输入以下命令来注册任务定义。

    aws ecs register-task-definition --cli-input-json file://path-to-your-task-definition-json
  3. 输入以下命令来创建运行任务的服务:

    请确保不要更改服务名称。我们将使用配置运行 CloudWatch 代理服务,该配置使用启动任务的服务的名称模式搜索任务。例如,要使 CloudWatch 代理查找由此命令启动的任务,您可以指定sd_service_name_pattern要成为^nginx-service$。下一节将提供更多详细信息。

    aws ecs create-service \ --cluster your-cluster-name \ --service-name nginx-service \ --task-definition nginx-sample-stack:1 \ --desired-count 1

将 CloudWatch 代理配置为抓取 NGINX Prometheus 指标

最后一步是将 CloudWatch 代理配置为抓取 NGINX 指标。在此示例中,CloudWatch 代理通过服务名称模式和端口 9113 发现任务,导出程序在其中公开 NGINX 的 Prometheus 度量。在发现任务和可用的指标后,CloudWatch 代理开始将收集的指标发布到日志流nginx-普罗米修斯-出口商

CloudWatch 代理配置为刮取 NGINX 指标

  1. 输入以下命令,下载必要的 YAML 文件的最新版本。

    curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/cloudformation-quickstart/cwagent-ecs-prometheus-metric-for-bridge-host.yaml
  2. 使用文本编辑器打开 CloudWatch 件,然后在value键位于resource:CWAgentConfigSSMParameter部分。然后,在ecs_service_discovery部分中,添加以下内容service_name_list_for_tasks部分。

    "service_name_list_for_tasks": [ { "sd_job_name": "nginx-prometheus-exporter", "sd_metrics_path": "/metrics", "sd_metrics_ports": "9113", "sd_service_name_pattern": "^nginx-service$" } ],
  3. 在同一文件中,向metric_declaration部分来允许 NGINX 指标。请务必遵循现有的缩进模式。

    { "source_labels": ["job"], "label_matcher": ".*nginx.*", "dimensions": [["ClusterName", "TaskDefinitionFamily", "ServiceName"]], "metric_selectors": [ "^nginx_.*$" ] },
  4. 如果尚未在此集群中部署 CloudWatch 代理,请跳到步骤 8。

    如果您已在亚马逊云服务器群集中部署了 CloudWatch 代理,通过使用Amazon CloudFormation,您可以通过输入以下命令创建更改集:

    ECS_CLUSTER_NAME=your_cluster_name AWS_REGION=your_aws_region ECS_NETWORK_MODE=bridge CREATE_IAM_ROLES=True ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name aws cloudformation create-change-set --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \ --template-body file://cwagent-ecs-prometheus-metric-for-bridge-host.yaml \ --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \ ParameterKey=CreateIAMRoles,ParameterValue=$CREATE_IAM_ROLES \ ParameterKey=ECSNetworkMode,ParameterValue=$ECS_NETWORK_MODE \ ParameterKey=TaskRoleName,ParameterValue=$ECS_TASK_ROLE_NAME \ ParameterKey=ExecutionRoleName,ParameterValue=$ECS_EXECUTION_ROLE_NAME \ --capabilities CAPABILITY_NAMED_IAM \ --region $AWS_REGION \ --change-set-name nginx-scraping-support
  5. 打开 Amazon CloudFormation 控制台,地址:https://console.aws.amazon.com/cloudformation

  6. 揭示新创建的变更集nginx 抓取支持。您应该看到一个应用于木条配置参数资源的费用。输入以下命令,运行更改集并重新启动 CloudWatch 代理任务:

    aws ecs update-service --cluster $ECS_CLUSTER_NAME \ --desired-count 0 \ --service cwagent-prometheus-replica-service-EC2-$ECS_NETWORK_MODE \ --region $AWS_REGION
  7. 等待大约 10 秒,然后输入以下命令。

    aws ecs update-service --cluster $ECS_CLUSTER_NAME \ --desired-count 1 \ --service cwagent-prometheus-replica-service-EC2-$ECS_NETWORK_MODE \ --region $AWS_REGION
  8. 如果首次在群集上安装具有收集 Prometheus 度量的 CloudWatch 代理,请输入以下命令。

    ECS_CLUSTER_NAME=your_cluster_name AWS_REGION=your_aws_region ECS_NETWORK_MODE=bridge CREATE_IAM_ROLES=True ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name aws cloudformation create-stack --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \ --template-body file://cwagent-ecs-prometheus-metric-for-bridge-host.yaml \ --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \ ParameterKey=CreateIAMRoles,ParameterValue=$CREATE_IAM_ROLES \ ParameterKey=ECSNetworkMode,ParameterValue=$ECS_NETWORK_MODE \ ParameterKey=TaskRoleName,ParameterValue=$ECS_TASK_ROLE_NAME \ ParameterKey=ExecutionRoleName,ParameterValue=$ECS_EXECUTION_ROLE_NAME \ --capabilities CAPABILITY_NAMED_IAM \ --region $AWS_REGION

查看 NGINX 指标和日志

您现在可以查看正在收集的 NGINX 指标。

查看示例 NGINX 工作负载的指标

  1. 通过以下网址打开 CloudWatch 控制台:https://console.aws.amazon.com/cloudwatch/

  2. 在运行集群的区域中,选择指标在左侧导航窗格中。查找集装箱景观/Prometheus命名空间来查看指标。

  3. 要查看 CloudWatch Logs 事件,请选择日志组在导航窗格中。这些事件位于日志组/aw/集装箱查看/您的群集名称/Prometheus,位置在日志流中nginx-普罗米修斯-出口商