在 Docker Compose 中配置 Nginx 反向代理多个服务,最稳妥的方式是通过自定义网络将 Nginx 容器与后端服务容器互通,并利用挂载配置文件实现路径路由。
先说结论:适合微服务或多服务并行部署场景,通过统一入口管理路由和负载均衡。
- 适合:需要统一端口访问多个后端服务,或隐藏内部服务架构的场景。
- 先准备:确保已安装 Docker 和 Docker Compose,并规划好服务间的网络通信。
- 验收:通过外部请求验证路径转发是否正确,检查 Nginx 日志确认无报错。
命令速用版
如果你已经准备好了配置文件,可以直接使用以下命令启动服务:
docker-compose up -d
查看运行状态:
docker-compose ps
为什么会这样
Nginx 反向代理的核心作用是作为客户端与后端服务之间的“中间层”。在 Docker 环境中,容器默认网络隔离,外部无法直接访问所有服务端口。通过 Nginx 容器监听统一端口(如 80),内部通过 Docker 网络解析服务名(如 http://web1/),可以实现外部只暴露一个入口,内部灵活调度多个服务。
这种架构不仅隐藏了真实服务地址,提升安全性,还能在需要时轻松扩展后端实例数量,实现负载均衡。
分步处理
步骤 1:规划目录结构
建议在工作目录下创建以下文件结构,便于管理配置:
./project
├── docker-compose.yml
├── nginx.conf
├── web1/
└── web2/
步骤 2:编写 docker-compose.yml
定义 Nginx 服务和后端服务,并确保它们在同一自定义网络中。注意使用服务名而非 localhost 进行通信。
version: '3.8'
services:web1:image: nginx:latestcontainer_name: web1networks:- mynetworkweb2:image: nginx:latestcontainer_name: web2networks:- mynetworknginx-proxy:image: nginx:latestcontainer_name: nginx-proxyports:- "80:80"volumes:- ./nginx.conf:/etc/nginx/conf.d/default.confdepends_on:- web1- web2networks:- 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 ps 确认所有服务状态为 Up。
2. 测试路径转发
在宿主机或外部浏览器访问:
http://localhost/service1/应返回 web1 服务内容。http://localhost/service2/应返回 web2 服务内容。
3. 查看日志
如有问题,查看 Nginx 容器日志排查:
docker-compose logs nginx-proxy
常见坑
1. 网络不通
确保 Nginx 容器和后端服务在同一个 networks 定义下。如果不在同一网络,Nginx 无法解析服务名。
2. 配置挂载错误
挂载配置文件时,确保宿主机路径正确。如果配置文件语法有误,Nginx 容器可能启动后立即退出。
3. 端口冲突
宿主机 80 端口可能被占用。如果冲突,可修改 ports 映射,如 "8080:80",访问时带上对应端口。
4. 服务名解析
在 proxy_pass 中不要写 localhost 或 127.0.0.1,必须写 Docker Compose 中定义的服务名(如 web1)。
参考来源
- 如何配置 Docker Compose 中的 Nginx 反向代理?
- 实战 docker,构建 nginx 反向代理 tomcat,学习 link 和 docker-compose
- Docker 部署 Nginx 代理多个服务:公网域名与内网 IP 场景全解
- 使用 Docker 和 Nginx 实现反向代理:统一端口路由多服务的完整指南
- 腾讯云开发者社区 - Nginx 反向代理负载均衡的容器化部署
原文链接:https://www.zjcp.cc/ask/9895.html
