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

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

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

NGINX Plus 是 NGINX 的商业版本。您必须拥有使用许可证。有关更多信息,请参阅 。nginx Plus

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

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

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

安装亚马逊云服务器集群的 NGINX Plus 反向代理示例工作负载

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

创建 Docker 映像

为 NGINX Plus 反向代理示例工作负载创建 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 Plus 创建一个自定义映像。在为 NGINX Plus 构建映像之前,您需要获取名为nginx-repo.key和 SSL 证书nginx-repo.crt查看您授权的 NGINX Plus。创建一个目录并在其中存储nginx-repo.keynginx-repo.crt文件。

    在刚创建的目录中,创建以下两个文件:

    • 包含以下内容的 Dockerfile 示例。这个码头文件是从https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-docker/#docker_plus_image。我们所做的重要改变是我们加载一个单独的文件,名为nginx.conf,它将在接下来的步骤中创建。

      FROM debian:buster-slim LABEL maintainer="NGINX Docker Maintainers <docker-maint@nginx.com>“ # Define NGINX versions for NGINX Plus and NGINX Plus modules # Uncomment this block and the versioned nginxPackages block in the main RUN # instruction to install a specific release # ENV NGINX_VERSION 21 # ENV NJS_VERSION 0.3.9 # ENV PKG_RELEASE 1~buster # Download certificate and key from the customer portal (https://cs.nginx.com (https://cs.nginx.com/)) # and copy to the build context COPY nginx-repo.crt /etc/ssl/nginx/ COPY nginx-repo.key /etc/ssl/nginx/ # COPY nginx.conf /etc/ssl/nginx/nginx.conf RUN set -x \ # Create nginx user/group first, to be consistent throughout Docker variants && addgroup --system --gid 101 nginx \ && adduser --system --disabled-login --ingroup nginx --no-create-home --home /nonexistent --gecos "nginx user" --shell /bin/false --uid 101 nginx \ && apt-get update \ && apt-get install --no-install-recommends --no-install-suggests -y ca-certificates gnupg1 \ && \ NGINX_GPGKEY=573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62; \ found=''; \ for server in \ ha.pool.sks-keyservers.net (http://ha.pool.sks-keyservers.net/) \ hkp://keyserver.ubuntu.com:80 \ hkp://p80.pool.sks-keyservers.net:80 \ pgp.mit.edu (http://pgp.mit.edu/) \ ; do \ echo "Fetching GPG key $NGINX_GPGKEY from $server"; \ apt-key adv --keyserver "$server" --keyserver-options timeout=10 --recv-keys "$NGINX_GPGKEY" && found=yes && break; \ done; \ test -z "$found" && echo >&2 "error: failed to fetch GPG key $NGINX_GPGKEY" && exit 1; \ apt-get remove --purge --auto-remove -y gnupg1 && rm -rf /var/lib/apt/lists/* \ # Install the latest release of NGINX Plus and/or NGINX Plus modules # Uncomment individual modules if necessary # Use versioned packages over defaults to specify a release && nginxPackages=" \ nginx-plus \ # nginx-plus=${NGINX_VERSION}-${PKG_RELEASE} \ # nginx-plus-module-xslt \ # nginx-plus-module-xslt=${NGINX_VERSION}-${PKG_RELEASE} \ # nginx-plus-module-geoip \ # nginx-plus-module-geoip=${NGINX_VERSION}-${PKG_RELEASE} \ # nginx-plus-module-image-filter \ # nginx-plus-module-image-filter=${NGINX_VERSION}-${PKG_RELEASE} \ # nginx-plus-module-perl \ # nginx-plus-module-perl=${NGINX_VERSION}-${PKG_RELEASE} \ # nginx-plus-module-njs \ # nginx-plus-module-njs=${NGINX_VERSION}+${NJS_VERSION}-${PKG_RELEASE} \ " \ && echo "Acquire::https::plus-pkgs.nginx.com::Verify-Peer \"true\";" >> /etc/apt/apt.conf.d/90nginx \ && echo "Acquire::https::plus-pkgs.nginx.com::Verify-Host \"true\";" >> /etc/apt/apt.conf.d/90nginx \ && echo "Acquire::https::plus-pkgs.nginx.com::SslCert \"/etc/ssl/nginx/nginx-repo.crt\";" >> /etc/apt/apt.conf.d/90nginx \ && echo "Acquire::https::plus-pkgs.nginx.com::SslKey \"/etc/ssl/nginx/nginx-repo.key\";" >> /etc/apt/apt.conf.d/90nginx \ && printf "deb https://plus-pkgs.nginx.com/debian buster nginx-plus\n" > /etc/apt/sources.list.d/nginx-plus.list \ && apt-get update \ && apt-get install --no-install-recommends --no-install-suggests -y \ $nginxPackages \ gettext-base \ curl \ && apt-get remove --purge --auto-remove -y && rm -rf /var/lib/apt/lists/* /etc/apt/sources.list.d/nginx-plus.list \ && rm -rf /etc/apt/apt.conf.d/90nginx /etc/ssl/nginx # Forward request logs to Docker log collector RUN ln -sf /dev/stdout /var/log/nginx/access.log \ && ln -sf /dev/stderr /var/log/nginx/error.log COPY nginx.conf /etc/nginx/nginx.conf EXPOSE 80 STOPSIGNAL SIGTERM CMD ["nginx", "-g", "daemon off;"]
    • 一个nginx.conf文件,修改自https://github.com/awslabs/ecs-nginx-reverse-proxy/tree/master/reverse-proxy/nginx

      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; upstream backend { zone name 10m; server app:3000 weight=2; server app2:3000 weight=1; } server{ listen 8080; location /api { api write=on; } } match server_ok { status 100-599; } server { listen 80; status_zone zone; # 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://backend; health_check uri=/lorem-ipsum match=server_ok; 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; } } }
  4. 从新目录中的文件构建映像:

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

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

接下来,设置任务定义。

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

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

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

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

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

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

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

将 CloudWatch 代理配置为抓取 NGINX Plus 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-plus-prometheus-exporter", "sd_metrics_path": "/metrics", "sd_metrics_ports": "9113", "sd_service_name_pattern": "^nginx-plus.*" } ],
  3. 在同一文件中,向metric_declaration部分,以允许 NGINX Plus 指标。请务必遵循现有的缩进模式。

    { "source_labels": ["job"], "label_matcher": "^nginx-plus.*", "dimensions": [["ClusterName", "TaskDefinitionFamily", "ServiceName"]], "metric_selectors": [ "^nginxplus_connections_accepted$", "^nginxplus_connections_active$", "^nginxplus_connections_dropped$", "^nginxplus_connections_idle$", "^nginxplus_http_requests_total$", "^nginxplus_ssl_handshakes$", "^nginxplus_ssl_handshakes_failed$", "^nginxplus_up$", "^nginxplus_upstream_server_health_checks_fails$" ] }, { "source_labels": ["job"], "label_matcher": "^nginx-plus.*", "dimensions": [["ClusterName", "TaskDefinitionFamily", "ServiceName", "upstream"]], "metric_selectors": [ "^nginxplus_upstream_server_response_time$" ] }, { "source_labels": ["job"], "label_matcher": "^nginx-plus.*", "dimensions": [["ClusterName", "TaskDefinitionFamily", "ServiceName", "code"]], "metric_selectors": [ "^nginxplus_upstream_server_responses$", "^nginxplus_server_zone_responses$" ] },
  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-plus-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 Plus 指标和日志

您现在可以查看正在收集的 NGINX Plus 量度。

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

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

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

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