Рейтинг:1

connect () не удалось (111: соединение отклонено) при подключении к восходящему потоку со статическим веб-сайтом

флаг cn

Моя цель - иметь 2 контейнера докеров:

  • Контейнер nginx (на основе nginx:latest) для работы в качестве обратного прокси
  • контейнер со статическим сайтом (на основе nginx:alpine)

Позже я добавлю 1+ бэкэнд-сервисы .net core (пока не важно). В настоящее время, когда я пытаюсь получить доступ к своему веб-серверу, используя общедоступный IP-адрес, я получаю 502 Bad gateway. Вот моя текущая конфигурация:

docker-compose.yaml

версия: '3'
Сервисы:
  обратный прокси:
    изображение: nginx: последний
    имя_контейнера: обратный_прокси
    зависит от:
      - статический сайт
    тома:
      - ./reverse_proxy/nginx.conf:/etc/nginx/nginx.conf
    порты:
      - 80:80
  статический веб-сайт:
    изображение: см-статический-веб-сайт
    строить:
      контекст: ./веб-сайт
    имя_контейнера: sm_static_website
    порты:
      - "8080:80"

nginx.conf для обратного прокси:

рабочие_процессы авто;
включить /etc/nginx/modules-enabled/*.conf;

События {
    worker_connections 1024;
}

http {
    сервер {
            слушать 80 default_server;
            слушать [::]:80 default_server;

            имя_сервера х.х.х.х; # мой_публичный_ip

            место расположения / {
                    proxy_pass http://sm_static_website:8080;
                    proxy_set_header X-Forwarded-For $remote_addr;
            }
    }
}

Dockerfile для статического сайта:

ОТ nginx:alpine
РАБОЧИЙ КАТАЛОГ /html
КОПИРОВАТЬ . /var/www/html
ВЫСТАВИТЬ 8080

Из контейнера моего веб-сайта я вижу, что nginx работает/прослушивает 80:

netstat -tulpn | grep СЛУШАТЬ
TCP 0 0 127.0.0.11:41389 0.0.0.0:* ПРОСЛУШАТЬ -
TCP 0 0 0.0.0.0:80 0.0.0.0:* СЛУШАТЬ 1/nginx: master pro
tcp 0 0 :::80 :::* СПИСОК 1/nginx: master pro

С моего сервера я вижу, что и контейнеры remote_proxy, и контейнеры веб-сайтов прослушивают 80/8080 соответственно:

netstat -tulpn | grep СЛУШАТЬ
TCP 0 0 0.0.0.0:80 0.0.0.0:* ПРОСЛУШИВАТЬ 13936/докер-прокси
TCP 0 0 0.0.0.0:8080 0.0.0.0:* ПРОСЛУШИВАТЬ 13797/докер-прокси
tcp6 0 0 :::80 :::* ПРОСЛУШИВАТЬ 13942/докер-прокси
tcp6 0 0 :::8080 :::* ПРОСЛУШИВАТЬ 13804/докер-прокси

ps -aux на сервере возвращает:

корень 13936 0,0 0,0 1075140 3580 ? Sl 00:24 0:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 80 -container-ip 172.18.0.3 -container-port 80
корень 13797 0,0 0,0 1148872 3624 ? Sl 00:24 0:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8080 -container-ip 172.18.0.2 -container-port 80

В журнале контейнера веб-сайта ошибок нет, рабочие процессы запущены. Однако журнал обратного прокси показывает:

2022/05/20 01:20:29 [ошибка] 31#31: *1 connect() не удалось (111: соединение отклонено) при подключении к восходящему каналу, клиент: x.x.x.x, сервер: x.x.x.x, запрос: "GET / HTTP/1.1 ", вверх по течению: "http://172.19.0.2:8080/", хост: "x.x.x.x"

Любые идеи, что я делаю неправильно? Если я удалю строку Volumes: из docker-compose.yml, то получу страницу nginx по умолчанию из контейнера обратного прокси. Это указывает на то, что он правильно слушает, принимает запрос, но не перенаправляет его в контейнер веб-сайта.

Рейтинг:0
флаг in

порт директива в docker-compose определяет, какой порт открыт снаружи. Ваш обратный прокси-контейнер может получить доступ к службам внутри статический веб-сайт напрямую, когда они связаны друг с другом, поэтому здесь вы не используете открытый порт.

Поскольку ваш сайт внутри контейнера статический веб-сайт прослушивает порт 80, вам нужно использовать его вместо открытых портов.

Сначала вам нужно связать контейнеры вместе, для этого вы добавляете в обратный прокси блокировать:

ссылки:
  - статический сайт

Твой proxy_pass директива должна быть:

proxy_pass http://sm_static_website;

Если вы не хотите на самом деле подвергать статический веб-сайт контейнер наружу, вы можете удалить порты директива там.

Итак докер-compose.yml должно выглядеть так:

версия: '3'
Сервисы:
  обратный прокси:
    изображение: nginx: последний
    имя_контейнера: обратный_прокси
    зависит от:
      - статический веб-сайт
    тома:
      - ./reverse_proxy/nginx.conf:/etc/nginx/nginx.conf
    порты:
      - 80:80
    ссылки:
      - sm_static_веб-сайт
  статический веб-сайт:
    изображение: см-статический-веб-сайт
    строить:
      контекст: ./веб-сайт
    имя_контейнера: sm_static_website

ТБХ: Я никогда не находил полезным использовать имя_контейнера директива, я не уверен, нужно ли вам использовать определенное имя container_name sm_static_веб-сайт или просто статический веб-сайт в ссылки и в proxy_pass директивы. Если вы оставите это, это будет просто статический веб-сайт.

флаг cn
Спасибо, Джеральд, переход на порт 80 сработал. Впервые имею дело с linux и coker, поэтому этот вопрос новичка. P.S. Ссылки использует , так

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.