Beispiel für NGINX-Plus-Workload für Amazon-ECS-Cluster
NGINX Plus ist die kommerzielle Version von NGINX. Sie müssen über eine Lizenz verfügen, um sie zu verwenden. Weitere Informationen finden Sie unter NGINX Plus
Der NGINX Prometheus Exporter kann NGINX-Daten als Prometheus-Metriken scrapen und verfügbar machen. In diesem Beispiel wird der Exporter zusammen mit dem NGINX-Plus-Reverse-Proxy-Service für Amazon ECS verwendet.
Weitere Informationen zum NGINX-Prometheus-Exporter finden Sie unter nginx-prometheus-exporter
Der CloudWatch-Agent mit Prometheus-Unterstützung erfasst die NGINX-Plus-Prometheus-Metriken basierend auf der Serviceerkennungskonfiguration im Amazon-ECS-Cluster. Sie können den NGINX Prometheus Exporter so konfigurieren, dass die Metriken auf einem anderen Port oder metrics_path verfügbar gemacht werden. Wenn Sie den Port oder den Pfad ändern, aktualisieren Sie den ecs_service_discovery-Abschnitt in der CloudWatch-Agentenkonfigurationsdatei.
Installieren Sie den NGINX-Plus-Reverse-Proxy-Beispiel-Workload für Amazon-ECS-Cluster
Zum Installieren des NGINX-Reverse-Proxy-Beispiel-Workloads führen Sie die folgenden Schritte aus.
Erstellen der Docker-Images
So erstellen Sie die Docker-Images für die NGINX-Plus-Reverse-Proxy-Beispiel-Workload
-
Laden Sie den folgenden Ordner aus dem NGINX-Reverse-Proxy-Repo herunter: https://github.com/awslabs/ecs-nginx-reverse-proxy/tree/master/reverse-proxy/
aus. -
Suchen Sie das
app-Verzeichnis und erstellen Sie ein Image aus diesem Verzeichnis:docker build -t web-server-app ./path-to-app-directory -
Erstellen Sie ein benutzerdefiniertes Image für NGINX Plus. Bevor Sie das Image für NGINX Plus erstellen können, benötigen Sie den Schlüssel mit dem Namen
nginx-repo.keyund das SSL-Zertifikatnginx-repo.crtfür Ihr lizenziertes NGINX Plus. Erstellen Sie ein Verzeichnis und speichern Sie darin Ihrenginx-repo.key- undnginx-repo.crt-Dateien.Erstellen Sie in dem Verzeichnis, das Sie gerade erstellt haben, die folgenden zwei Dateien:
-
Ein Beispiel-Dockerfile mit dem folgenden Inhalt. Diese Docker-Datei wird aus einer Beispieldatei übernommen, die unter https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-docker/#docker_plus_image
bereitgestellt wird. Die wichtige Änderung, die wir vornehmen, ist, dass wir eine separate Datei namens nginx.confladen, die im nächsten Schritt erstellt wird.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;"] -
Eine
nginx.conf-Datei, geändert von 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; } } }
-
-
Erstellen Sie ein Image aus Dateien in Ihrem neuen Verzeichnis:
docker build -t nginx-plus-reverse-proxy ./path-to-your-directory -
Laden Sie Ihre neuen Images zur späteren Verwendung in ein Bild-Repository hoch.
Erstellen Sie die Aufgabendefinition zum Ausführen von NGINX Plus und der Webserver-App in Amazon ECS
Als Nächstes richten Sie die Aufgabendefinition ein.
Diese Aufgabendefinition ermöglicht das Sammeln und Exportieren von NGINX-Plus-Prometheus-Metriken. Der NGINX-Container verfolgt die Eingaben von der App und stellt diese Daten an Port 8080 bereit, wie in nginx.conf festgelegt. Der NGINX-Prometheus-Exporter-Container scrapet diese Metriken und sendet sie zur Verwendung in CloudWatch an Port 9113.
So richten Sie die Aufgabendefinition für die NGINX-Beispiel-Amazon ECS-Workload ein
-
Erstellen Sie eine Aufgabendefinitions-JSON-Datei mit dem folgenden Inhalt. Ersetzen Sie
your-customized-nginx-plus-imagedurch den Image-URI für Ihr benutzerdefiniertes NGINX-Plus-Image und ersetzen Sieyour-web-server-app-imagedurch den Image-URI für Ihr Webserver-App-Image.{ "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" } -
Registrieren Sie die Aufgabendefinition:
aws ecs register-task-definition --cli-input-json file://path-to-your-task-definition-json -
Erstellen Sie einen Service zum Ausführen der Aufgabe, indem Sie den folgenden Befehl eingeben:
aws ecs create-service \ --clusteryour-cluster-name\ --service-name nginx-plus-service \ --task-definition nginx-plus-sample-stack:1 \ --desired-count 1Stellen Sie sicher, dass Sie den Servicenamen nicht ändern. Wir führen einen CloudWatch-Agenten-Service mit einer Konfiguration aus, die mithilfe der Namensmuster der Services, die sie gestartet haben, nach Aufgaben sucht. Damit der CloudWatch-Agent beispielsweise die von diesem Befehl gestartete Aufgabe findet, können Sie den Wert von
sd_service_name_patternauf^nginx-plus-service$festlegen. Im nächsten Abschnitt finden Sie weitere Details.
Konfigurieren Sie den CloudWatch-Agenten zum Scraping von NGINX-Plus-Prometheus-Metriken
Der letzte Schritt besteht darin, den CloudWatch-Agent so zu konfigurieren, dass er die NGINX-Metriken kratzt. In diesem Beispiel erkennt der CloudWatch-Agent die Aufgabe über das Servicenamenmuster und den Port 9113, wo der Exporteur die Prometheus-Metriken für NGINX verfügbar macht. Nachdem die Aufgabe erkannt und die Metriken verfügbar sind, beginnt der CloudWatch-Agent, die erfassten Metriken an den Protokollstream nginx-prometheus-exporter zu senden.
So konfigurieren Sie den CloudWatch-Agent für das Scraping der NGINX-Metriken
-
Laden Sie die neueste Version der erforderlichen YAML-Datei herunter, indem Sie den folgenden Befehl eingeben.
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 -
Öffnen Sie die Datei mit einem Texteditor und suchen Sie die vollständige CloudWatch-Agentenkonfiguration im Schlüssel
valueim Abschnittresource:CWAgentConfigSSMParameter. Fügen Sie dann imecs_service_discovery-Abschnitt den folgendenservice_name_list_for_tasks-Abschnitt hinzu."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.*" } ], -
Fügen Sie in derselben Datei den folgenden Abschnitt im Abschnitt
metric_declarationhinzu, um NGINX-Plus-Metriken zuzulassen. Beachten Sie unbedingt das vorhandene Einrückungsmuster.{ "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$" ] }, -
Wenn Sie den CloudWatch-Agenten noch nicht in diesem Cluster bereitgestellt haben, fahren Sie mit Schritt 8 fort.
Wenn Sie den CloudWatch-Agenten bereits mithilfe von AWS CloudFormation im Amazon-ECS-Cluster bereitgestellt haben, können Sie einen Änderungssatz erstellen, indem Sie die folgenden Befehle eingeben:
ECS_CLUSTER_NAME=your_cluster_nameAWS_REGION=your_aws_regionECS_NETWORK_MODE=bridge CREATE_IAM_ROLES=True ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_nameECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_nameaws 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 Öffnen Sie die CloudFormation-Konsole unter https://console.aws.amazon.com/cloudformation
. -
Sehen Sie sich den neu erstellten Änderungssatz nginx-plus-scraping-support an. Eine Änderung sollte auf die Ressource CWAgentConfigSSMParameter angewendet werden. Führen Sie den Änderungssatz aus und starten Sie die CloudWatch-Agent-Aufgabe neu, indem Sie die folgenden Befehle eingeben:
aws ecs update-service --cluster $ECS_CLUSTER_NAME \ --desired-count 0 \ --service cwagent-prometheus-replica-service-EC2-$ECS_NETWORK_MODE \ --region $AWS_REGION -
Warten Sie etwa 10 Sekunden und geben Sie den folgenden Befehl ein.
aws ecs update-service --cluster $ECS_CLUSTER_NAME \ --desired-count 1 \ --service cwagent-prometheus-replica-service-EC2-$ECS_NETWORK_MODE \ --region $AWS_REGION -
Wenn Sie den CloudWatch-Agent zum ersten Mal mit Prometheus-Metrik-Sammlung auf dem Cluster installieren, geben Sie die folgenden Befehle ein.
ECS_CLUSTER_NAME=your_cluster_nameAWS_REGION=your_aws_regionECS_NETWORK_MODE=bridge CREATE_IAM_ROLES=True ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_nameECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_nameaws 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
Anzeigen Ihrer NGINX-Plus-Metriken und -Protokolle
Sie können jetzt die gesammelten NGINX-Plus-Metriken anzeigen.
So zeigen Sie die Metriken für Ihren NGINX-Beispiel-Workload an
Öffnen Sie die CloudWatch-Konsole unter https://console.aws.amazon.com/cloudwatch/
. -
Wählen Sie in der Region, in der Ihr Cluster ausgeführt wird, im linken Navigationsbereich Metriken aus. Suchen Sie den ContainerInsights/Prometheus-Namespace, um die Metriken anzuzeigen.
-
Um die CloudWatch-Logs-Ereignisse anzuzeigen, wählen Sie im Navigationsbereich Log Groups (Protokollgruppen) aus. Die Ereignisse befinden sich in der Protokollgruppe /aws/containerinsights/
your_cluster_name/prometheus, im Protokoll-Streamnginx-plus-prometheus-exporter.