แก้ไขปัญหา DNS ภายใน Nginx

ฉันมีคอนเทนเนอร์ nginx ใน AWS ที่ทำพร็อกซีย้อนกลับสำหรับเว็บไซต์ของฉันเช่น https://example.com ฉันมีบริการแบ็กเอนด์ที่ลงทะเบียนใน DNS ภายในเครื่องโดยอัตโนมัติ - aws.local (ซึ่งทำโดย AWS ECS Auto-Discovery) ปัญหาที่ฉันมีคือ nginx จะแก้ไขชื่อเป็น IP เท่านั้นในระหว่างการเริ่มต้น ดังนั้นเมื่อคอนเทนเนอร์บริการถูกรีบูตและรับ IP ใหม่ nginx ยังคงลองใช้ IP เก่าและฉันมีข้อผิดพลาด "502 Bad Gateway"

นี่คือรหัสที่ฉันใช้:

worker_processes 1;
events { worker_connections 1024; }
http {
    sendfile on;
    include    /etc/nginx/mime.types;
    log_format  graylog2_json  '{ "timestamp": "$time_iso8601", '
                       '"remote_addr": "$remote_addr", '
                       '"body_bytes_sent": $body_bytes_sent, '
                       '"request_time": $request_time, '
                       '"response_status": $status, '
                       '"request": "$request", '
                       '"request_method": "$request_method", '
                       '"host": "$host",'
                       '"upstream_cache_status": "$upstream_cache_status",'
                       '"upstream_addr": "$upstream_addr",'
                       '"http_x_forwarded_for": "$http_x_forwarded_for",'
                       '"http_referrer": "$http_referer", '
                       '"http_user_agent": "$http_user_agent" }';


    upstream service1 {
        server service1.aws.local:8070;
    }

    upstream service2 {
        server service2.aws.local:8080;
    }

    resolver 10.0.0.2 valid=10s;

    server {
        listen 443 http2 ssl;
        server_name example.com;
        location /main {
            proxy_pass         http://service1;
        }

        location /auth {
            proxy_pass         http://service2;
        }

ฉันพบคำแนะนำในการเปลี่ยนการกำหนดค่า nginx เพื่อแก้ไขชื่อต่อคำขอ แต่จากนั้นฉันเห็นว่าเบราว์เซอร์ของฉันพยายามเปิด "service2.aws.local:8070" และล้มเหลวเนื่องจากชื่อ DNS ภายในของ AWS ฉันควรเห็น https://example.com/auth" บนเบราว์เซอร์ของฉัน

server {

        set $main service1.aws.local:2000;
        set $auth service2.aws.local:8070;

        location /main {
            proxy_http_version 1.1;
            proxy_pass http://$main;
        }
        location /auth {
            proxy_http_version 1.1;
            proxy_pass http://$auth;
        }

คุณช่วยฉันแก้ไขมันได้ไหม? ขอบคุณ !!!


person Michal Grzelak    schedule 15.05.2019    source แหล่งที่มา


คำตอบ (3)


TTL สำหรับบันทึก CloudMap Service Discovery ของคุณคืออะไร หากคุณทำการค้นหา NS จากคอนเทนเนอร์ NGINX (สมมติว่าโหมด EC2 และคุณสามารถดำเนินการลงในคอนเทนเนอร์ได้) มันจะส่งคืนบันทึกใหม่หรือไม่ หากไม่มีข้อมูลเพิ่มเติม ก็ยากที่จะพูด แต่ฉันกล้าที่จะบอกว่านี่เป็นปัญหา TTL ไม่ใช่ปัญหา NGINX/Service Discovery

ลด TTL ลงเหลือ 1 วินาทีแล้วดูว่าได้ผลหรือไม่

บันทึก DNS อ้างอิง AWS CloudMap API

person yandy    schedule 15.05.2019

TL;DR

resolver 169.254.169.253;
set $upstream "service1.aws.local";
proxy_pass http://$upstream:8070;

ด้านข้างของ ECS ฉันประสบปัญหาเดียวกันเมื่อใช้ Docker Compose

ตาม ความคิดเห็นของ six8 บน GitHub

nginx จะแก้ไขชื่อโฮสต์เมื่อเริ่มต้นเท่านั้น คุณสามารถใช้ตัวแปรกับ proxy_pass เพื่อให้ตัวแปรใช้ตัวแก้ไขสำหรับการค้นหารันไทม์

ดู:

https://forum.nginx.org/read.php?2,215830,215832#msg-215832

https://www.ruby-forum.com/topic/4407628

มันค่อนข้างน่ารำคาญ

ลิงก์ใดลิงก์หนึ่งด้านบนเป็นตัวอย่าง

resolver 127.0.0.1;
set $backend "foo.example.com";
proxy_pass http://$backend;

จำเป็นต้องมีส่วน resolver และเราไม่สามารถอ้างถึง upstreams ที่กำหนดไว้ที่นี่

ตาม คำตอบของ Ivan Frolov ใน StackExchange ที่อยู่ของ resolver ควรเป็น 169.254.169.253

person darw    schedule 31.05.2019

ฉันพบวิธีแก้ปัญหานี้อย่างสมบูรณ์แบบ Nginx "proxy_pass" ไม่สามารถใช้ข้อมูล "etc/hosts"

ฉันอยากจะแนะนำให้คุณใช้พร็อกซีย้อนกลับ HA-Proxy ใน ECS ฉันลองใช้พร็อกซีย้อนกลับ nginx แต่ล้มเหลว และประสบความสำเร็จกับ HA-Proxy มันง่ายกว่าการกำหนดค่า nginx

ขั้นแรก ให้ใช้ตัวเลือก "ลิงก์" ของ Docker และตั้งค่า "ตัวแปรสภาพแวดล้อม" (เช่น LINK_APP, LINK_PORT)

ประการที่สอง กรอก "ตัวแปรสภาพแวดล้อม" นี้ลงใน haproxy.cfg

นอกจากนี้ ฉันขอแนะนำให้คุณใช้ "การแมปพอร์ตแบบไดนามิก" กับ ALB ทำให้งานมีความยืดหยุ่นมากขึ้น

Taskdef.json :

# taskdef.json

{
    "executionRoleArn": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/<APP_NAME>_ecsTaskExecutionRole",
    "containerDefinitions": [
      {
        "name": "<APP_NAME>-rp",
        "image": "gnokoheat/ecs-reverse-proxy:latest",
        "essential": true,
        "memoryReservation": <MEMORY_RESV>,
        "portMappings": [
          {
            "hostPort": 0,
            "containerPort": 80,
            "protocol": "tcp"
          }
        ],
        "links": [
          "<APP_NAME>"
        ],
        "environment": [
          {
            "name": "LINK_PORT",
            "value": "<SERVICE_PORT>"
          },
          {
            "name": "LINK_APP",
            "value": "<APP_NAME>"
          }
        ]
      },
      {
        "name": "<APP_NAME>",
        "image": "<IMAGE_NAME>",
        "essential": true,
        "memoryReservation": <MEMORY_RESV>,
        "portMappings": [
          {
            "protocol": "tcp",
            "containerPort": <SERVICE_PORT>
          }
        ],
        "environment": [
          {
            "name": "PORT",
            "value": "<SERVICE_PORT>"
          },
          {
            "name": "APP_NAME",
            "value": "<APP_NAME>"
          }
        ]
      }
    ],
    "requiresCompatibilities": [
      "EC2"
    ],
    "networkMode": "bridge",
    "family": "<APP_NAME>"
  }

haproxy.cfg :

# haproxy.cfg

global
    daemon
    pidfile /var/run/haproxy.pid

defaults
    log global
    mode http
    retries 3
    timeout connect 5000
    timeout client 50000
    timeout server 50000

frontend http
    bind *:80

    http-request set-header X-Forwarded-Host %[req.hdr(Host)]

    compression algo gzip
    compression type text/css text/javascript text/plain application/json application/xml

    default_backend app

backend app
    server static "${LINK_APP}":"${LINK_PORT}"

Dockerfile(haproxy) :

FROM haproxy:1.7
USER root
COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg

ดู :

Github : https://github.com/gnokoheat/ecs-reverse-proxy

ภาพนักเทียบท่า: gnokoheat/ecs-reverse-proxy:latest

person GNOKOHEAT    schedule 15.10.2019