如何在 Docker Compose 中配置 Nginx 反向代理多个服务

文章导读
在 Docker Compose 中配置 Nginx 反向代理多个服务,最稳妥的方式是通过自定义网络将 Nginx 容器与后端服务容器互通,并利用挂载配置文件实现路径路由。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

在 Docker Compose 中配置 Nginx 反向代理多个服务,最稳妥的方式是通过自定义网络将 Nginx 容器与后端服务容器互通,并利用挂载配置文件实现路径路由。

先说结论:适合微服务或多服务并行部署场景,通过统一入口管理路由和负载均衡。

  • 适合:需要统一端口访问多个后端服务,或隐藏内部服务架构的场景。
  • 先准备:确保已安装 Docker 和 Docker Compose,并规划好服务间的网络通信。
  • 验收:通过外部请求验证路径转发是否正确,检查 Nginx 日志确认无报错。

命令速用版

如果你已经准备好了配置文件,可以直接使用以下命令启动服务:

docker-compose up -d

查看运行状态:

docker-compose ps

为什么会这样

Nginx 反向代理的核心作用是作为客户端与后端服务之间的“中间层”。在 Docker 环境中,容器默认网络隔离,外部无法直接访问所有服务端口。通过 Nginx 容器监听统一端口(如 80),内部通过 Docker 网络解析服务名(如 http://web1/),可以实现外部只暴露一个入口,内部灵活调度多个服务。

这种架构不仅隐藏了真实服务地址,提升安全性,还能在需要时轻松扩展后端实例数量,实现负载均衡。

分步处理

步骤 1:规划目录结构

建议在工作目录下创建以下文件结构,便于管理配置:

如何在 Docker Compose 中配置 Nginx 反向代理多个服务
./project
├── docker-compose.yml
├── nginx.conf
├── web1/
└── web2/

步骤 2:编写 docker-compose.yml

定义 Nginx 服务和后端服务,并确保它们在同一自定义网络中。注意使用服务名而非 localhost 进行通信。

version: '3.8'
services:
  web1:
    image: nginx:latest
    container_name: web1
    networks:
      - mynetwork
  web2:
    image: nginx:latest
    container_name: web2
    networks:
      - mynetwork
  nginx-proxy:
    image: nginx:latest
    container_name: nginx-proxy
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - web1
      - web2
    networks:
      - mynetwork
networks:
  mynetwork:

步骤 3:配置 Nginx 反向代理规则

创建 nginx.conf 文件,配置 location 块将不同路径转发到对应服务名。Docker 网络内部可以直接使用服务名作为域名。

server {
    listen 80;
    location /service1/ {
        proxy_pass http://web1/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
    location /service2/ {
        proxy_pass http://web2/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

步骤 4:启动服务

在 docker-compose.yml 所在目录执行启动命令。

怎么验证是否生效

1. 检查容器状态

如何在 Docker Compose 中配置 Nginx 反向代理多个服务

使用 docker-compose ps 确认所有服务状态为 Up。

2. 测试路径转发

在宿主机或外部浏览器访问:

  • http://localhost/service1/ 应返回 web1 服务内容。
  • http://localhost/service2/ 应返回 web2 服务内容。

3. 查看日志

如有问题,查看 Nginx 容器日志排查:

docker-compose logs nginx-proxy

常见坑

1. 网络不通

如何在 Docker Compose 中配置 Nginx 反向代理多个服务

确保 Nginx 容器和后端服务在同一个 networks 定义下。如果不在同一网络,Nginx 无法解析服务名。

2. 配置挂载错误

挂载配置文件时,确保宿主机路径正确。如果配置文件语法有误,Nginx 容器可能启动后立即退出。

3. 端口冲突

宿主机 80 端口可能被占用。如果冲突,可修改 ports 映射,如 "8080:80",访问时带上对应端口。

4. 服务名解析

proxy_pass 中不要写 localhost127.0.0.1,必须写 Docker Compose 中定义的服务名(如 web1)。

参考来源

  • 如何配置 Docker Compose 中的 Nginx 反向代理?
  • 实战 docker,构建 nginx 反向代理 tomcat,学习 link 和 docker-compose
  • Docker 部署 Nginx 代理多个服务:公网域名与内网 IP 场景全解
  • 使用 Docker 和 Nginx 实现反向代理:统一端口路由多服务的完整指南
  • 腾讯云开发者社区 - Nginx 反向代理负载均衡的容器化部署