Docker Nginx Proxy: как маршрутизировать трафик в другой контейнер, используя путь, а не имя хоста

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

  • 10.200.200.210/ app1
  • 10.200.200.210/ app2
  • 10.200.200.210/ app3

Я хочу запускать каждое приложение в другом контейнере Docker, используя nginx в качестве прокси.

Я пробовал jwilder/nginx-proxy и отлично работает, если я использую разные доменные имена (app1.domain.com, app2.domain.com и т.д.), но я не могу использовать домены, мне нужно использовать один и тот же IP-адрес.

Также я не могу использовать разные порты, например:

  • 10.200.200.210:81/ app1
  • 10.200.200.210:82/ app2
  • 10.200.200.210:83/ app3

все должны работать на порту 80.

  • Есть ли способ настроить jwilder/nginx-proxy для этого?
  • Есть еще одно изображение Docker, например jwilder/nginx-proxy.
  • или PLS вы могли бы дать мне некоторый намек на создание контейнера докеров-докеров nginx?

Ответ 1

В случае, если кто-то все еще ищет ответ. jwilder/nginx-proxy позволяет вам использовать пользовательскую конфигурацию Nginx как для всего прокси, так и для per VIRTUAL_HOST.

Вот как вы можете сделать это с помощью конфигурации местоположения Per-VIRTUAL_HOST.

  1. Внутри вашей папки проектов создайте еще одну папку - "vhost.d".
  2. Создайте файл "whoami.local" с пользовательской конфигурацией nginx внутри папки "vhost.d". Этот файл должен иметь то же имя, что и VIRTUAL_HOST!

./vhost.d/whoami.local

location /app1 {
  proxy_pass http://app1:8000;
}

location /app2 {
  proxy_pass http://app2:8000;
}
  1. Создайте файл docker-compose.yml.

./docker-compose.yml

version: '3'

services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    ports:
    - "8080:80"
    volumes:
    - /var/run/docker.sock:/tmp/docker.sock:ro
    - /path/to/vhost.d:/etc/nginx/vhost.d:ro

  gateway:
    image: jwilder/whoami
    environment:
    - VIRTUAL_HOST=whoami.local

  app1:
    image: jwilder/whoami

  app2:
    image: jwilder/whoami
  1. Запустите docker-compose up
  2. Проверьте конфигурацию

В bash запустить:

$ curl -H "Host: whoami.local" localhost:8080
I'm 1ae273bce7a4
$ curl -H "Host: whoami.local" localhost:8080/app1
I'm 52b1a7b1992a
$ curl -H "Host: whoami.local" localhost:8080/app2
I'm 4adbd3f9e7a0
$ docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                  NAMES
6a659a4d4b0a        jwilder/nginx-proxy   "/app/docker-entrypo…"   54 seconds ago      Up 53 seconds       0.0.0.0:8080->80/tcp   nginxreverseproxy_nginx-proxy_1
4adbd3f9e7a0        jwilder/whoami        "/app/http"              54 seconds ago      Up 53 seconds       8000/tcp               nginxreverseproxy_app2_1
52b1a7b1992a        jwilder/whoami        "/app/http"              54 seconds ago      Up 53 seconds       8000/tcp               nginxreverseproxy_app1_1
1ae273bce7a4        jwilder/whoami        "/app/http"              54 seconds ago      Up 53 seconds       8000/tcp               nginxreverseproxy_gateway_1

Вы также можете добавить домен "whoami.local" в файл /etc/hosts и напрямую звонить в этот домен.

/и т.д./хосты

...
127.0.0.1   whoami.local
...

Результат:

$ curl whoami.local:8080
I'm 52ed6da1e86c
$ curl whoami.local:8080/app1
I'm 4116f51020da
$ curl whoami.local:8080/app2
I'm c4db24012582

Ответ 2

Просто используйте nginx для создания контейнера **, не забудьте установить net "host" **, который сделает ваш контейнерный ресурс тот же адрес и порт с host machine.mount nginx.conf файл и конфигурационная прокси-таблица. Например:

команда docker:

docker run --name http-proxy -v /host/nginx.conf:/etc/nginx/nginx.conf --net host -itd --restart always nginx

nginx.conf:

server {
  listen 80;
  location /app1 {
    proxy_pass YOUR_APP1_URL;
  }
  location /app2 {
    proxy_pass YOUR_APP2_URL;
  }
}

Ответ 4

просто поместите это в /etc/nginx/nginx.conf

    worker_processes  1;

    error_log  /var/log/nginx/error.log;

    events {
        worker_connections  1024;
    }


    http {
      server {
            listen 80;

            location /api {
                proxy_pass http://awesome-api;
                proxy_redirect     off;
                proxy_set_header   Host $host;
                proxy_set_header   X-Real-IP $remote_addr;
                proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header   X-Forwarded-Host $server_name;
            }
      }
    }