nginx通过多端口监听实现虚拟主机,本质是用listen指令按端口区分请求并独立代理至后端;需所有容器加入同一自定义docker网络,nginx配置多个server块各listen不同端口,启动时映射对应宿主机端口,最后验证网络、配置与防火墙。

一、容器网络需统一且隔离
所有服务容器(包括 Nginx)必须加入同一个自定义 Docker 网络,才能用容器名互通:
- 创建网络:
docker network create mynet - 启动后端服务时不映射宿主机端口,只暴露容器内端口,并指定网络:
docker run -d --name api --network mynet -p 8080 your-api-imagedocker run -d --name frontend --network mynet -p 80 your-frontend-image - Nginx 容器也加入该网络:
--network mynet,这样它能直接用http://api:8080或http://frontend:80访问
二、Nginx 配置多个 server 块,各 listen 不同端口
在 /etc/nginx/conf.d/multi-port.conf 中写两个独立的 server 块,不写 server_name,只靠端口识别:
- 监听 8081 端口,代理到 API 容器:
server {<br> listen 8081;<br> location / {<br> proxy_pass http://api:8080;<br> proxy_set_header Host $host;<br> proxy_set_header X-Real-IP $remote_addr;<br> }<br> } - 监听 8082 端口,代理到前端容器:
server {<br> listen 8082;<br> location / {<br> proxy_pass http://frontend:80;<br> proxy_set_header Host $host;<br> proxy_set_header X-Real-IP $remote_addr;<br> }<br> }
三、启动 Nginx 容器时映射多个宿主机端口
确保宿主机端口与 Nginx 配置中 listen 的端口一致,并挂载好配置:
- 命令示例:
docker run -d \<br> --name nginx-proxy \<br> --network mynet \<br> -p 8081:8081 \<br> -p 8082:8082 \<br> -v $(pwd)/conf.d:/etc/nginx/conf.d:ro \<br> -v $(pwd)/logs:/var/log/nginx \<br> nginx:latest
- 注意:
-p 8081:8081是将宿主机 8081 映射到容器 8081(不是默认的 80),这样才能让外部访问http://宿主机IP:8081触发第一个 server 块
四、验证与常见问题
访问测试:
-
curl http://localhost:8081/health→ 应返回 API 服务响应 -
curl http://localhost:8082/→ 应返回前端页面 HTML
若失败,检查三项:
- Docker 网络是否共用(
docker inspect mynet查看容器是否都在其中) - Nginx 配置语法是否正确(进容器执行
nginx -t) - 宿主机防火墙是否放行 8081/8082 端口(如 CentOS:
firewall-cmd --add-port=8081/tcp --permanent && firewall-cmd --reload)











