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

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

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

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

docker-compose.yaml

version: '3'
services:
  reverse-proxy:
    image: nginx:latest
    container_name: reverse_proxy
    depends_on:
      - static-website
    volumes:
      - ./reverse_proxy/nginx.conf:/etc/nginx/nginx.conf
    ports:
      - 80:80
  static-website:
    image: sm-static-website
    build:
      context: ./website
    container_name: sm_static_website
    ports:
      - "8080:80"

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

worker_processes auto;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 1024;
}

http {
    server {
            listen 80 default_server;
            listen [::]:80 default_server;

            server_name x.x.x.x; # my_public_ip

            location / {
                    proxy_pass              http://sm_static_website:8080;
                    proxy_set_header        X-Forwarded-For $remote_addr;
            }
    }
}

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

FROM nginx:alpine
WORKDIR /html
COPY . /var/www/html
EXPOSE 8080

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

netstat -tulpn | grep LISTEN
tcp        0      0 127.0.0.11:41389        0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1/nginx: master pro
tcp        0      0 :::80                   :::*                    LISTE       1/nginx: master pro

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

netstat -tulpn | grep LISTEN
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      13936/docker-proxy
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      13797/docker-proxy
tcp6       0      0 :::80                   :::*                    LISTEN      13942/docker-proxy
tcp6       0      0 :::8080                 :::*                    LISTEN      13804/docker-proxy

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

root       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
root       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 [error] 31#31: *1 connect() failed (111: Connection refused) while connecting to upstream, client: x.x.x.x, server: x.x.x.x, request: "GET / HTTP/1.1", upstream: "http://172.19.0.2:8080/", host: "x.x.x.x"

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

nginx docker обратный прокси docker-compose

1 ответ
1

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

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

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

links:
  - static-website

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

proxy_pass              http://sm_static_website;

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

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

version: '3'
services:
  reverse-proxy:
    image: nginx:latest
    container_name: reverse_proxy
    depends_on:
      - static-website
    volumes:
      - ./reverse_proxy/nginx.conf:/etc/nginx/nginx.conf
    ports:
      - 80:80
    links:
      - sm_static_website
  static-website:
    image: sm-static-website
    build:
      context: ./website
    container_name: sm_static_website

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

Джеральд Шнайдер

Добавить комментарий

Ваш адрес email не будет опубликован.