如何使用 Docker Compose 配置 Nginx 反向代理多服务

文章导读
使用 Docker Compose 3.7 或 3.8 版本配置 Nginx 反向代理时,通过将宿主机 80 端口映射到容器 80 端口,可实现统一入口转发到 8080、8081 等多个后端服务端口。
📋 目录
  1. 原因分析
  2. 解决方案
  3. 注意事项
  4. 参考来源
A A

如何使用 Docker Compose 配置 Nginx 反向代理多服务

使用 Docker Compose 3.7 或 3.8 版本配置 Nginx 反向代理时,通过将宿主机 80 端口映射到容器 80 端口,可实现统一入口转发到 8080、8081 等多个后端服务端口。

原因分析

Nginx 作为高性能 HTTP 和反向代理服务器,其核心优势在于低内存消耗和高并发处理能力。在 Docker 环境中配置反向代理时,需要解决容器间网络通信问题。根据腾讯云开发者社区 2026 年 4 月 24 日的资料,通过创建自定义 Docker 网络(如 nginx-proxy-network),Nginx 容器可以直接使用容器名称(如 service1、service2)作为 upstream 服务器地址,无需知道具体 IP。这是因为 Docker 的内置 DNS 服务会自动解析同网络内的容器名称。

解决方案

步骤一:创建 Docker 网络

首先创建自定义网络以提高容器间通信安全性:docker network create nginx-proxy-network。根据 2025 年 3 月 9 日的测试数据,使用自定义网络比默认 bridge 网络更稳定,容器间延迟降低约 15%。

步骤二:编写 docker-compose.yml 文件

创建 docker-compose.yml 文件,版本建议使用 3.7 或 3.8。参考 2020 年 4 月 3 日的配置示例:

version: '3.7'
services:
  proxy:
    image: jwilder/nginx-proxy:0.7.0
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
  service1:
    image: myapp-service
    environment:
      - VIRTUAL_HOST=service1.example.com
      - PORT=8080
    networks:
      - nginx-proxy-network
  service2:
    image: myapp-service
    environment:
      - VIRTUAL_HOST=service2.example.com
      - PORT=8081
    networks:
      - nginx-proxy-network
networks:
  nginx-proxy-network:
    external: true

步骤三:配置 Nginx 路由规则

如果使用原生 Nginx 镜像(nginx:latest 或 nginx:stable),需要手动配置 upstream。根据 2026 年 4 月 2 日的实战案例,upstream 配置如下:

upstream tomcat_client {
  server t01:8080 weight=1;
  server t02:8080 weight=1;
}
server {
  listen 80 default_server;
  location / {
    proxy_pass http://tomcat_client;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
  }
}

对于路径前缀转发,2025 年 3 月 9 日的指南显示:请求/service1/xxx 转发到 8080 端口,请求/service2/xxx 转发到 8081 端口,配置 location /service1/ { proxy_pass http://service1:8080/; }。

步骤四:使用 Nginx Proxy Manager(可选方案)

根据 2023 年 8 月 9 日的教程,Nginx Proxy Manager 提供图形化管理界面。默认管理员凭据为 Email: admin@example.com,Password: changeme。管理页面访问端口为 81,配置 docker-compose.yml 时需注意端口映射:'80:80'、'443:443'、'81:81'。

注意事项

1. 端口冲突问题:2023 年 8 月 9 日的用户反馈指出,如果已安装 Nginx,需先关闭否则 80 和 443 端口会冲突。

2. 容器名称依赖:2026 年 4 月 24 日的资料强调,upstream 配置中的服务器名称(如 web02、web03)必须与 docker-compose.yml 中定义的 container_name 一致,否则会出现 502 Bad Gateway 错误。

如何使用 Docker Compose 配置 Nginx 反向代理多服务

3. 防火墙配置:2018 年 10 月 22 日的实测表明,在做反向代理配置前需保证 Nginx 容器可以访问后端服务,最简单的方式是在宿主机上使用 iptables -F 命令清除防火墙规则进行测试。

4. SSL 证书路径:2025 年 7 月 13 日的公网部署方案显示,证书文件需挂载到 /etc/letsencrypt/live/域名/fullchain.pem 和 privkey.pem,权限设置为只读(:ro)。

5. Docker 版本兼容性:2020 年 4 月 3 日的测试环境使用 docker version 19.03.8 和 docker-compose version 1.23.2,建议使用最新版以避免已知问题。

参考来源

来源:腾讯云开发者社区 - Nginx 反向代理负载均衡的容器化部署(2026 年 4 月 24 日)

来源:腾讯云开发者社区 - Docker: nginx 反向代理和如何配置多个服务(2020 年 4 月 3 日)

来源:CSDN - 使用 Docker 和 Nginx 实现反向代理:统一端口路由多服务的完整指南(2025 年 3 月 9 日)

来源:博客园 - NginxProxyManager-反向代理神器,快速上手,图文教程(2023 年 8 月 9 日)