怎么在 Docker Compose 中配置 Nginx 反向代理多个服务

文章导读
在 Docker Compose 中配置 Nginx 反向代理多个服务,最推荐的做法是将 Nginx 容器与后端业务容器置于同一个自定义网络中,通过容器名进行内部通信,并利用 Nginx 的 location 规则按路径或域名分发请求。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

在 Docker Compose 中配置 Nginx 反向代理多个服务,最推荐的做法是将 Nginx 容器与后端业务容器置于同一个自定义网络中,通过容器名进行内部通信,并利用 Nginx 的 location 规则按路径或域名分发请求。

先说结论:这种方案适合微服务架构或多服务并行部署场景,能实现统一入口和负载均衡。

  • 适合:需要统一端口对外暴露、隐藏后端真实端口或实现负载均衡的场景。
  • 先准备:规划好 docker-compose.yml 结构,准备好 nginx.conf 配置文件及必要的目录挂载。
  • 验收:通过 curl 请求不同路径验证转发是否准确,并检查 Nginx 访问日志确认流量去向。

命令速用版

# 创建自定义网络(可选,compose 中也可定义)
docker network create nginx-proxy-network

# 启动服务
docker-compose up -d

# 查看容器状态
docker-compose ps

为什么会这样

Nginx 反向代理的核心作用是作为客户端与后端服务之间的“中间层”,它接受外部请求后转发给内部网络上的服务器,客户端只知道 Nginx 的地址,不知道后端服务的真实存在。在 Docker 环境中,利用 Docker Compose 可以将 Nginx 和多个后端服务(如 Tomcat、Spring Boot 应用等)编排在同一网络下,容器间可以通过容器名直接解析 IP,无需暴露后端端口到宿主机,既安全又便于管理。

分步处理

1. 规划网络与服务
所有服务应部署在同一个自定义 Docker 网络中,确保 Nginx 容器能解析到后端容器的名称。在 docker-compose.yml 中定义 networks 字段,将所有服务加入该网络。

2. 编写 docker-compose.yml
定义 Nginx 服务和后端服务。Nginx 服务需要映射 80 或 443 端口到宿主机,后端服务只需暴露给内部网络,无需映射端口到宿主机。配置数据卷将宿主机的 nginx.conf 挂载到容器内。

services:
  nginx-proxy:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
    networks:
      - mynetwork
    depends_on:
      - web1
      - web2
  web1:
    image: myapp:latest
    networks:
      - mynetwork
  web2:
    image: myapp:latest
    networks:
      - mynetwork
networks:
  mynetwork:

3. 配置 Nginx 路由规则
在挂载的配置文件中编写 upstream 和 location 规则。使用容器名作为 upstream 的地址,根据路径前缀转发到不同服务。

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

4. 启动与重载
使用 docker-compose up -d 启动。若修改了 Nginx 配置,可进入容器执行 nginx -s reload 或重启容器。

怎么在 Docker Compose 中配置 Nginx 反向代理多个服务

怎么验证是否生效

1. 连通性测试
在宿主机使用 curl 命令访问不同路径,观察返回内容是否来自对应的后端服务。

curl http://localhost/service1/
curl http://localhost/service2/

2. 日志检查
查看 Nginx 容器的访问日志,确认请求是否被记录且状态码为 200。日志文件通常挂载在宿主机的 ./log 目录下或直接在容器内 /var/log/nginx/access.log 查看。

常见坑

1. 网络不通
确保 Nginx 容器和后端容器在同一个 network 中,否则 Nginx 无法通过容器名解析到后端 IP。

2. 端口冲突
宿主机映射端口(如 80)如果被占用,启动会失败。后端服务容器内部端口(如 8080)不需要映射到宿主机,只需在 Nginx 配置中指向即可。

3. 配置语法错误
Nginx 配置文件 syntax 错误会导致容器启动失败或无法重载。启动前建议在本地或用 docker run `--rm` nginx nginx -t 测试配置语法。

参考来源

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