#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.