NGinx и несколько док-контейнеров, но один поддомен - PullRequest
1 голос
/ 31 марта 2019

Моя цель

Я хочу использовать один докер-контейнер NGinx в качестве прокси.

Я хочу, чтобы он отвечал на трафик на моем домене: "sub.domain.com" и слушална портах 80 и 443.

Когда трафик поступает на / admin Я хочу, чтобы он направлял весь трафик в один докер-контейнер (скажем ... admin_container: 6000 ).

Когда трафик поступает на / api Я хочу, чтобы он направлял весь трафик в другой контейнер докера (скажем ... api_container: 5500 ).

Когда трафик поступает по любому другому пути ( / everything_else ) Я хочу, чтобы он направлял весь трафик в другой докер-контейнер (скажем ... website_container: 5000).

Некоторый полезный контекст

Очень быстро, позвольте мне предоставить некоторый контекст на случай, если это будет полезно.У меня есть сайт NodeJS, работающий в контейнере Docker.Я также хотел бы иметь раздел администратора, созданный с помощью ASP.NET Core, который работает во втором док-контейнере.Мне бы хотелось, чтобы оба этих сайта совместно использовали и использовали один проект ASP.NET Core Web Api, работающий в третьем док-контейнере.Итак, один проект NodeJS и два проекта ASP.NET Core, которые все живут на одном поддомене:

  • sub.domain.com /
    • Обслуживает основной сайт
  • sub.domain.com / admin
    • Обслуживает веб-сайт администратора
  • sub.domain.com / api
    • Обслуживает конечные точки API и управляет подключением к базе данных

Что у меня есть

Пока у меня настроен обратный прокси-сервер NGinX и один док-контейнер дляПриложение NodeJS.В настоящее время весь трафик на: 80 перенаправляется на 443. Весь трафик на 443 направляется в Docker-контейнер NodeJS, работающий в частном порядке на: 5000.Я признаю, что я не очень хорош в NGinx и не совсем понимаю, как это работает.

Файл NGinx.conf

worker_processes 2;

events { worker_connections 1024; }

http {
    sendfile on;
    proxy_buffer_size   128k;
    proxy_buffers   4 256k;
    proxy_busy_buffers_size   256k;

    upstream docker-nodejs {
        server nodejs_prod:5000;
    }

    server {
        listen 80;
        server_name sub.domain.com;
        return 301 https://$host$request_uri;
    }

    server {
        listen 443 ssl;
        server_name sub.domain.com;
        ssl_certificate     /etc/nginx/ssl/combined.crt;
        ssl_certificate_key /etc/nginx/ssl/mysecretkeyfile.key;

        location / {
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Forwarded-Proto https;
            proxy_set_header   X-Forwarded-Ssl on;
            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;
            proxy_pass         http://docker-nodejs;
        }
    }

}

Краткое примечание:В приведенном выше коде «nodejs_prod: 5000» относится к контейнеру с именем «nodejs_prod» и прослушивает порт 5000. Я не понимаю, как это работает, но это работает.Каким-то образом Docker создает записи DNS в частной сети, по одной для каждого имени контейнера.Я на самом деле использую docker-compose.

Мой актуальный вопрос: Как будет выглядеть этот файл NGinx.conf, когда у меня есть еще 2 веб-сайта (каждый контейнер докера).Важно, чтобы / admin и / api отправлялись в правильные контейнеры Docker, а не обрабатывались местоположением «catch all».Я представляю себе, что у меня будет «поймать все» местоположение, которое захватывает весь трафик, который НЕ НАЧИНАЕТСЯ С / admin ИЛИ /api.

Спасибо!

1 Ответ

1 голос
/ 31 марта 2019

В вашей конфигурации nginx вы хотите добавить правила местоположения, такие как

  location /admin {
    proxy_pass http://admin_container:6000/;
  }

  location /api {
    proxy_pass http://api_container:5500/;
  }

Это перенаправляет /admin на admin_container порт 6000 и /api на api_container и порт 5500.

docker-compose создает сеть между всеми своими контейнерами.Именно поэтому http://api_container:5500/ указывает на контейнер с именем api_container и порт 5500.Это может быть использовано для связи между контейнерами.Подробнее об этом можно прочитать здесь https://docs.docker.com/compose/networking/

...