Carga de trabajo de muestra de NGINX Plus para clústeres de Amazon ECS
NGINX Plus es la versión comercial de NGINX. Debe contar con una licencia para utilizarla. Para obtener más información, consulte NGINX Plus
El exportador NGINX de Prometheus puede raspar y exponer datos de NGINX como las métricas de Prometheus. En este ejemplo se utiliza el exportador junto con el servicio proxy inverso NGINX Plus para Amazon ECS.
Para obtener más información sobre el exportador NGINX de Prometheus, consulte nginx-prometheus-exporter
El agente de CloudWatch compatible con Prometheus realiza el raspado de las métricas de NGINX Plus Prometheus basado en la configuración de detección de servicios en el clúster de Amazon ECS. Puede configurar el exportador NGINX de Prometheus para exponer las métricas en un puerto o una ruta diferente. Si cambia el puerto o la ruta, actualice la sección de ecs_service_discovery
en el archivo de configuración del agente de CloudWatch.
Instale la carga de trabajo de muestra del proxy inverso NGINX Plus para clústeres de Amazon ECS
Siga los pasos para instalar la carga de trabajo de muestra del proxy inverso NGINX.
Cree las imágenes de Docker
Para crear las imágenes de Docker para la carga de trabajo de muestra del proxy inverso NGINX Plus
-
Descargue la siguiente carpeta del repositorio del proxy inverso NGINX: https://github.com/awslabs/ecs-nginx-reverse-proxy/tree/master/reverse-proxy/
. -
Busque el directorio de la
app
y cree una imagen desde ese directorio:docker build -t web-server-app ./
path-to-app-directory
-
Cree una imagen personalizada para NGINX Plus. Antes de poder crear la imagen para NGINX Plus, debe obtener la clave llamada
nginx-repo.key
y el certificado SSLnginx-repo.crt
para la licencia de NGINX Plus. Cree un directorio y almacene en él langinx-repo.key
y los archivosnginx-repo.crt
.En el directorio que acaba de crear, cree los siguientes dos archivos:
-
Una muestra de Dockerfile con el siguiente contenido. Este archivo docker se adopta a partir de un archivo de muestra que se proporciona en https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-docker/#docker_plus_image
. El cambio importante que se realiza es que se carga un archivo por separado, llamado nginx.conf
, que se creará en el siguiente paso.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;"]
-
Un archivo
nginx.conf
, modificado desde 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; } } }
-
-
Cree una imagen a partir de los archivos en el directorio nuevo:
docker build -t nginx-plus-reverse-proxy ./
path-to-your-directory
-
Cargue las imágenes nuevas en un repositorio de imágenes para usarlas posteriormente.
Cree la definición de tarea para ejecutar NGINX Plus y la aplicación de servidor web en Amazon ECS
A continuación, se debe configurar la definición de tarea.
Esta definición de tarea permite la recopilación y exportación de métricas de NGINX Plus Prometheus. El contenedor NGINX realiza un seguimiento de la entrada desde la aplicación y expone esos datos al puerto 8080, como se establece en nginx.conf
. El contenedor exportador NGINX de Prometheus raspa estas métricas y las publica en el puerto 9113, para usarlas en CloudWatch.
Para configurar la definición de tarea para la carga de trabajo de muestra de NGINX de Amazon ECS
-
Cree un archivo JSON de definición de tarea con el siguiente contenido. Reemplace
your-customized-nginx-plus-image
por el URI de imagen para la imagen personalizada de NGINX Plus, y reemplaceyour-web-server-app-image
por el URI de imagen para la imagen de la aplicación del servidor web.{ "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" } -
Registre la definición de tarea:
aws ecs register-task-definition --cli-input-json file://
path-to-your-task-definition-json
-
Cree un servicio para ejecutar la tarea con el siguiente comando:
aws ecs create-service \ --cluster
your-cluster-name
\ --service-name nginx-plus-service \ --task-definition nginx-plus-sample-stack:1 \ --desired-count 1Asegúrese de no cambiar el nombre del servicio. Se ejecutará un servicio del agente de CloudWatch con una configuración que busca tareas mediante los patrones de nombres de los servicios que las iniciaron. Por ejemplo, para que el agente de CloudWatch encuentre la tarea que este comando ha lanzado, puede especificar que el valor de
sd_service_name_pattern
sea^nginx-plus-service$
. En la siguiente sección se proporcionan más detalles.
Configure el agente de CloudWatch para que raspe las métricas de NGINX Plus de Prometheus
El paso final es configurar el agente de CloudWatch para que realice el raspado de las métricas de NGINX. En este ejemplo, el agente de CloudWatch detecta la tarea mediante el patrón de nombre de servicio y el puerto 9113, donde el exportador expone las métricas de prometheus para NGINX. Con la tarea detectada y las métricas disponibles, el agente de CloudWatch comienza a publicar las métricas recopiladas en el flujo de registro nginx-prometheus-exporter.
Para configurar el agente de CloudWatch para que realice el raspado de las métricas de NGINX
-
Descargue la última versión del archivo YAML necesario con el siguiente comando.
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
-
Abra el archivo con un editor de texto y busque la configuración completa del agente CloudWatch en la clave de
value
en la secciónresource:CWAgentConfigSSMParameter
. A continuación, en la secciónecs_service_discovery
, agregue la siguiente secciónservice_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.*" } ],
-
En el mismo archivo, agregue la siguiente sección en la sección
metric_declaration
para permitir las métricas de NGINX Plus. Asegúrese de seguir el patrón de sangría existente.{ "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$" ] },
-
Si aún no tiene el agente de CloudWatch implementado en este clúster, diríjase directamente al paso 8.
Si ya implementó el agente de CloudWatch en el clúster de Amazon ECS mediante AWS CloudFormation, puede crear un conjunto de cambios con los siguientes comandos:
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 Abra la consola de AWS CloudFormation en https://console.aws.amazon.com/cloudformation
. -
Revise el conjunto de cambios recién creado nginx-plus-scraping-support. Se debería ver un cambio aplicado al recurso CWAgentConfigSSMParamete. Ejecute el conjunto de cambios y reinicie la tarea del agente de CloudWatch al ingresar el siguiente comando:
aws ecs update-service --cluster $ECS_CLUSTER_NAME \ --desired-count 0 \ --service cwagent-prometheus-replica-service-EC2-$ECS_NETWORK_MODE \ --region $AWS_REGION
-
Espere aproximadamente 10 segundos y, a continuación, ingrese el siguiente comando.
aws ecs update-service --cluster $ECS_CLUSTER_NAME \ --desired-count 1 \ --service cwagent-prometheus-replica-service-EC2-$ECS_NETWORK_MODE \ --region $AWS_REGION
-
Si va a instalar el agente de CloudWatch con la recopilación de métricas de Prometheus en el clúster por primera vez, ingrese los siguientes comandos.
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
Visualización de las métricas y los registros de NGINX Plus
Ahora se pueden visualizar las métricas de NGINX Plus que se están recopilando.
Para visualizar las métricas de la carga de trabajo de muestra de NGINX
Abra la consola de CloudWatch en https://console.aws.amazon.com/cloudwatch/
. -
En la Región en la que se está ejecutando el clúster, elija Metrics (Métricas) en el panel de navegación izquierdo. Busque el espacio de nombres ContainerInsights/Prometheus para ver las métricas.
-
Para ver los eventos de CloudWatch Logs, elija Log groups (Grupos de registros) en el panel de navegación. Los eventos están en el grupo de registro /aws/containerinsights/
your_cluster_name
/prometheus, en el flujo de registrosnginx-plus-prometheus-exporter
.