NGinx и несколько контейнеров docker, но один поддомен

#docker #nginx #nginx-location #nginx-config

#docker #nginx #nginx-расположение #nginx-config

Вопрос:

Моя цель

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

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

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

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

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

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

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

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

Что у меня есть на данный момент

На данный момент у меня настроен обратный прокси-сервер NGinX и один контейнер docker для приложения 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 веб-сайта (каждый контейнер docker). Важно, чтобы /admin и /api отправлялись в правильные контейнеры docker, а не обрабатывались в папке «catch all». Я представляю, что у меня будет «универсальное» местоположение, которое фиксирует весь трафик, который НЕ НАЧИНАЕТСЯ С /admin ИЛИ / api.

Спасибо!

Ответ №1:

В вашей конфигурации 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 /

Комментарии:

1. 1)) Что мешает «location / {}» обработать запрос, а не два других. То есть, не будет ли «location / {}» просто перехватывать все запросы, прежде чем / admin и / api получат шанс? Может быть, порядок имеет значение? 2)) Должен ли я просто добавить эти два во второй раздел «сервер»? Нужен ли мне отдельный раздел «сервер» для каждого местоположения?

2. 1) nginx обрабатывает это почти полностью. Он будет искать наиболее конкретный префикс, поэтому все, что начинается с /admin , будет обрабатываться /admin местоположением. 2) Вы размещаете их в одном разделе сервера. Секция сервера может иметь несколько секций расположения.