簡體   English   中英

Docker 環境,nginx 反向代理,本地或全局

[英]Docker environment, nginx reverse proxy, Local or global

一些 docker-compose 解決方案在將服務暴露給 Internet 時,出於安全原因使用 nginx 作為反向代理。 安裝多個 docker 服務並擁有自己的 nginx(反向代理)或創建一個專用容器,保存 nginx 服務並重定向到所有“本地”容器會更正確嗎?

我幾乎總是只使用一個 Nginx 代理來做到這一點,盡管更多的是為了簡單而不是任何與安全相關的事情。

一個特別重要的模式是圍繞瀏覽器前端。 您的 React 或 Angular 代碼在瀏覽器中運行,而不是在容器中,因此它不能使用 Docker 網絡; 但是對於部署時配置和 CORS 的原因,如果代碼和后端應用程序從相同的主機和端口提供服務會更好。 如果您可以使用/api/whatever作為后端 URL,而無需嵌入主機名或端口,那么它將在可以部署服務的任何地方工作。

這將為您帶來這樣的 Compose 設置:

version: '3.8'
services:
  ingress:
    image: nginx
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    ports:
      - '8888:80'  # <-- 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:

在這個堆棧中,您唯一可以從 Docker 外部訪問的是ingress容器; 沒有其他東西有ports: . 這就是您想要的(生產)設置。 (我傾向於盡量減少 dev 和 prod Docker 設置之間的差異,但添加更多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,那么所有這些都很難始終如一地完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM