Nginx внутренний DNS решить проблему - PullRequest
0 голосов
/ 15 мая 2019

У меня есть контейнер nginx в AWS, который выполняет обратный прокси-сервер для моего веб-сайта, например, https://example.com. У меня есть серверные службы, которые автоматически регистрируются в локальном DNS - aws.local (это делается с помощью автоматического обнаружения AWS ECS).У меня проблема в том, что 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;
        }

Можете ли вы помочь мне исправить это?Спасибо !!!

Ответы [ 2 ]

0 голосов
/ 01 июня 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 / тема / 4407628

Это довольно раздражает.

Одна из приведенных выше ссылок дает пример

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

Необходима часть resolver. И мы не можем ссылаться на определенные upstream s здесь.

Согласно ответу Ивана Фролова на StackExchange , адрес resolver должен быть 169.254.169.253

0 голосов
/ 15 мая 2019

Что такое TTL для ваших записей CloudMap Service Discovery?Если вы выполняете поиск NS из контейнера NGINX (в режиме EC2, и вы можете выполнить его в контейнере), он возвращает новую запись?Без дополнительной информации трудно сказать, но я бы рискнул сказать, что это проблема TTL, а не проблема NGINX / Service Discovery.

Понизьте TTL до 1 секунды и посмотрите, работает ли это.

Справочная запись по API AWS CloudMap DNS-запись

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...