Среда Docker, обратный прокси-сервер nginx, локальный или глобальный

#docker #nginx #docker-compose

Вопрос:

Некоторые решения, основанные на docker, используют nginx в качестве обратного прокси-сервера по соображениям безопасности при подключении службы к Интернету. Было бы правильнее установить несколько служб docker с собственным nginx (обратный прокси-сервер) или создать один выделенный контейнер, содержащий службу nginx, и перенаправить на все «локальные» контейнеры?

Ответ №1:

Я бы почти всегда делал это только с одним прокси-сервером Nginx, хотя больше для простоты, чем для чего-либо, связанного с безопасностью.

Особенно важный шаблон связан с интерфейсами браузера. Ваш код React или Angular выполняется в браузере, а не в контейнере, поэтому он не может использовать сеть Docker; но как по причинам конфигурации во время развертывания, так и по причинам CORS гораздо лучше, если код и серверное приложение обслуживаются с одного хоста и порта. Если вы можете использовать /api/whatever в качестве внутреннего URL-адреса, не вставляя имя хоста или порт, он будет работать везде, где может быть развернута служба.

Это привело бы к такой настройке композиции, как:

 version: '3.8' services:  ingress:  image: nginx  volumes:  - ./nginx.conf:/etc/nginx/nginx.conf:ro  ports:  - '8888:80' # lt;-- this is the only published port  frontend:  build: frontend  # no ports:, volumes:, networks:, container_name:, _etc._  backend:  build: backend  environment:  - PGHOST=db  db:  image: postgresql  environment: { ... }  volumes:  - pgdata:/var/lib/postgresql/data volumes:  pgdata:  

В этом стеке единственное, до чего вы можете дотянуться извне Докера, — это ingress контейнер; больше ничего нет ports: . Это (производственная) настройка, которую вы хотите. (Я стараюсь свести к минимуму различия между настройками докеров dev и prod, но добавление дополнительных ports: функций, например, для прямого доступа к базе данных с psql и без docker exec , довольно полезно в не-prod.)

Затем конфигурация Nginx содержит всю необходимую маршрутизацию URL-адресов

 upstream backend { server backend:3000 } upstream frontend { server frontend:3000 }  server {  location / {  proxy_pass http://frontend;  }  location /api {  proxy_pass http://backend;  } }  

В этой конфигурации вы можете выполнять другие действия, такие как обеспечение (унифицированной) проверки подлинности, скрытие .../admin/... маршрутов и интеграция других служб в ваш API. Все это гораздо сложнее делать последовательно, если у вас много отдельных Nginx.