Обратный прокси-сервер nginx не работает в Docker-compose с сообщением об отказе в соединении - PullRequest
0 голосов
/ 10 января 2019

У меня есть docker-compose.yaml, подобное этому (сокращено для простоты):

# ...
services:
  my-ui:
    # ...
    ports:
    - 5402:8080
  networks:
  - my-net

networks:
  my-net:
    external:
      name: my-net

и я пытаюсь настроить nginx в качестве обратного прокси-сервера с этой конфигурацией:

upstream client {
  server my-ui:5402;
}

server {
  listen 80;

  location / {
    proxy_pass http://client;
  }
}

а это docker-compose.yaml у меня для nginx:

# ...
services:
  reverse-proxy:
    # ...
    ports:
    - 5500:80
    networks:
    - my-net

networks:
  my-net:
    external:
      name: my-net

Что происходит сейчас, так это то, что когда я запускаю my-ui и reverse-proxy (каждый из которых использует свой собственный docker-compose up), и я перехожу на http://localhost:5500, я получаю сообщение Bad Gateway, и мои nginx журналы говорит это:

connect() failed (111: Connection refused) while connecting to 
upstream, client: 172.19.0.1, server: , request: "GET / HTTP/1.1", 
upstream: "http://172.19.0.5:5402/", host: "localhost:5500"

Если я exec в мой nginx контейнер и использую ping:

ping my-ui
ping 172.19.0.5

Оба успешны, но если я хочу, например, curl:

curl -L http://my-ui
curl -L http://my-ui:5402
curl -L http://172.19.0.1

Все они терпят неудачу с сообщением connection refused. Что мне здесь не хватает?

PS: я не уверен, но было бы полезно добавить, что my-ui - это базовое vuejs приложение, работающее на сервере Webpack dev.

PS2: я также пытался передать заголовки хоста и т. Д., Но тот же результат

1 Ответ

0 голосов
/ 10 января 2019

Имя контейнера (my-ui) преобразуется в IP-адрес контейнера. Поэтому вы должны указать в восходящем направлении порт контейнера, а не порт, который вы сопоставили хосту.

upstream client {
  server my-ui:8080;
}

server {
  listen 80;

  location / {
    proxy_pass http://client;
  }
}

Вы также можете настроить свой апстрим с именем хост-машины и использовать назначенный порт. (server <name of host>:5402) Но это может стать довольно запутанным, и вы потеряете преимущество изоляции сервисов в сетях докеров.

Кроме того, вы также можете удалить сопоставление портов, если вам не нужен доступ к веб-сервису без обратного прокси:

# ...
services:
  reverse-proxy:
    # ...
    # ports:
    # - 5500:80
...