【问题标题】:Docker environment, nginx reverse proxy, Local or globalDocker 环境、nginx 反向代理、本地或全局
【发布时间】:2021-11-28 02:19:58
【问题描述】:

一些 docker-compose 解决方案在将服务公开到 Internet 时,出于安全原因使用 nginx 作为反向代理。安装多个 docker 服务,有自己的 nginx(反向代理)或创建一个专用容器,保存 nginx 服务,然后重定向到所有“本地”容器,会更正确吗?

【问题讨论】:

    标签: docker nginx docker-compose


    【解决方案1】:

    我几乎总是只使用一个 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,那么要始终如一地执行所有这些操作会困难得多。

    【讨论】:

      猜你喜欢
      • 2016-07-22
      • 2021-11-13
      • 1970-01-01
      • 2018-05-31
      • 2018-10-10
      • 2021-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多