Contoh beban kerja NGINX Plus untuk klaster Amazon ECS - Amazon CloudWatch

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Contoh beban kerja NGINX Plus untuk klaster Amazon ECS

NGINXPlus adalah versi komersial dari. NGINX Anda harus memiliki sebuah lisensi untuk menggunakannya. Untuk informasi selengkapnya, lihat NGINXPlus

Eksportir NGINX Prometheus dapat mengikis dan mengekspos data sebagai metrik Prometheus. NGINX Contoh ini menggunakan eksportir bersama-sama dengan layanan proxy terbalik NGINX Plus untuk Amazon. ECS

Untuk informasi lebih lanjut tentang eksportir NGINX Prometheus, lihat di Github. nginx-prometheus-exporter Untuk informasi selengkapnya tentang proxy NGINX terbalik, lihat ecs-nginx-reverse-proxydi Github.

CloudWatch Agen dengan dukungan Prometheus menggores metrik NGINX Plus Prometheus berdasarkan konfigurasi penemuan layanan di cluster Amazon. ECS Anda dapat mengonfigurasi Eksportir NGINX Prometheus untuk mengekspos metrik pada port atau jalur yang berbeda. Jika Anda mengubah port atau jalur, perbarui ecs_service_discovery bagian dalam file konfigurasi CloudWatch agen.

Instal beban kerja sampel proxy terbalik NGINX Plus untuk kluster Amazon ECS

Ikuti langkah-langkah ini untuk menginstal beban kerja sampel proxy NGINX terbalik.

Membuat citra Docker

Untuk membuat gambar Docker untuk beban kerja sampel proxy terbalik NGINX Plus
  1. Unduh folder berikut dari repo proxy NGINX terbalik: https://github.com/awslabs/ecs-nginx-reverse-proxy/tree/master/reverse-proxy/.

  2. Temukan direktori app dan bangun sebuah citra dari direktori tersebut:

    docker build -t web-server-app ./path-to-app-directory
  3. Buat gambar khusus untuk NGINX Plus. Sebelum Anda dapat membuat gambar untuk NGINX Plus, Anda perlu mendapatkan kunci bernama nginx-repo.key dan SSL sertifikat nginx-repo.crt untuk NGINX Plus berlisensi Anda. Buat sebuah direktori dan simpan file nginx-repo.key dan nginx-repo.crt di dalamnya.

    Dalam direktori yang baru saja Anda buat, buatlah dua file berikut:

    • Sebuah Dockerfile sampel dengan konten berikut. File docker ini diadopsi dari file sampel yang disediakan di https://docs.nginx.com/nginx/admin- guide/installing-nginx/installing -nginx-docker/ #docker_plus_image. Perubahan penting yang kita lakukan adalah kita memuat file terpisah, yang disebut nginx.conf, yang akan dibuat pada langkah berikutnya.

      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;"]
    • Sebuah nginx.conf file, dimodifikasi dari 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. Membangun sebuah citra dari file yang ada dalam direktori baru Anda:

    docker build -t nginx-plus-reverse-proxy ./path-to-your-directory
  5. Unggah citra baru Anda ke sebuah repositori citra yang akan digunakan nanti.

Buat definisi tugas untuk menjalankan NGINX Plus dan aplikasi server web di Amazon ECS

Berikutnya, Anda menyiapkan penetapan tugas.

Definisi tugas ini memungkinkan pengumpulan dan ekspor metrik NGINX Plus Prometheus. NGINXContainer melacak input dari aplikasi, dan mengekspos data tersebut ke port 8080, seperti yang diatur. nginx.conf Wadah eksportir NGINX prometheus menggores metrik ini, dan mempostingnya ke port 9113, untuk digunakan di. CloudWatch

Untuk mengatur definisi tugas untuk NGINX contoh beban ECS kerja Amazon
  1. Buat JSON file definisi tugas dengan konten berikut. Ganti your-customized-nginx-plus-image dengan gambar URI untuk gambar NGINX Plus Anda yang disesuaikan, dan ganti your-web-server-app-image dengan gambar URI untuk gambar aplikasi server web Anda.

    { "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. Mendaftarkan penetapan tugas:

    aws ecs register-task-definition --cli-input-json file://path-to-your-task-definition-json
  3. Untuk membuat sebuah layanan untuk menjalankan tugas dengan memasukkan perintah berikut:

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

    Pastikan untuk tidak mengubah nama layanan. Kami akan menjalankan layanan CloudWatch agen menggunakan konfigurasi yang mencari tugas menggunakan pola nama layanan yang memulainya. Misalnya, bagi CloudWatch agen untuk menemukan tugas yang diluncurkan oleh perintah ini, Anda dapat menentukan nilai sd_service_name_pattern menjadi^nginx-plus-service$. Bagian selanjutnya menyediakan detail yang lebih lengkap.

Konfigurasikan CloudWatch agen untuk mengikis metrik NGINX Plus Prometheus

Langkah terakhir adalah mengonfigurasi CloudWatch agen untuk mengikis NGINX metrik. Dalam contoh ini, CloudWatch agen menemukan tugas melalui pola nama layanan, dan port 9113, tempat eksportir mengekspos metrik prometheus untuk. NGINX Dengan tugas yang ditemukan dan metrik yang tersedia, CloudWatch agen mulai memposting metrik yang dikumpulkan ke aliran log. nginx-prometheus-exporter

Untuk mengonfigurasi CloudWatch agen untuk mengikis metrik NGINX
  1. Unduh versi terbaru dari YAML file yang diperlukan dengan memasukkan perintah berikut.

    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. Buka file dengan editor teks, dan temukan konfirmasi CloudWatch agen lengkap di value kunci di bagianresource:CWAgentConfigSSMParameter. Kemudian, di bagian ecs_service_discovery, tambahkan bagian service_name_list_for_tasks berikut.

    "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. Dalam file yang sama, tambahkan bagian berikut di metric_declaration bagian untuk mengizinkan metrik NGINX Plus. Pastikan untuk mengikuti pola indentasi yang ada saat itu.

    { "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. Jika Anda belum memiliki CloudWatch agen yang digunakan di cluster ini, lewati ke langkah 8.

    Jika Anda sudah memiliki CloudWatch agen yang digunakan di ECS klaster Amazon dengan menggunakan AWS CloudFormation, Anda dapat membuat set perubahan dengan memasukkan perintah berikut:

    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. Buka AWS CloudFormation konsol di https://console.aws.amazon.com/cloudformation.

  6. Mengungkap changeset yang baru dibuat. nginx-plus-scraping-support Anda akan melihat satu perubahan diterapkan pada CWAgentConfigSSMParametersumber daya. Jalankan changeset dan tahan tugas CloudWatch agen dengan memasukkan perintah berikut:

    aws ecs update-service --cluster $ECS_CLUSTER_NAME \ --desired-count 0 \ --service cwagent-prometheus-replica-service-EC2-$ECS_NETWORK_MODE \ --region $AWS_REGION
  7. Tunggu sekitar 10 detik, kemudian masukkan perintah berikut.

    aws ecs update-service --cluster $ECS_CLUSTER_NAME \ --desired-count 1 \ --service cwagent-prometheus-replica-service-EC2-$ECS_NETWORK_MODE \ --region $AWS_REGION
  8. Jika Anda menginstal CloudWatch agen dengan pengumpulan metrik Prometheus di cluster untuk pertama kalinya, masukkan perintah berikut.

    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

Melihat metrik dan log NGINX Plus Anda

Anda sekarang dapat melihat metrik NGINX Plus yang dikumpulkan.

Untuk melihat metrik untuk beban kerja sampel NGINX Anda
  1. Buka CloudWatch konsol di https://console.aws.amazon.com/cloudwatch/.

  2. Di Wilayah tempat klaster Anda berjalan, pilih Metrik pada panel navigasi yang ada sebelah kiri. Temukan namespace ContainerInsights/Prometheus untuk melihat metriknya.

  3. Untuk melihat peristiwa CloudWatch Log, pilih Grup log di panel navigasi. Peristiwa ada di grup log /aws/containerinsights/your_cluster_name/prometheus, dalam aliran log nginx-plus-prometheus-exporter.