You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置nginx-proxy无需端口号即可正确路由至对应容器

排查nginx-proxy无法通过域名直接路由到容器的问题

我之前配置jwilder/nginx-proxy时也踩过类似的坑,咱们一步步拆解问题,从最可能的原因开始排查:

1. 首先修正VIRTUAL_PORT的配置错误

你这里犯了一个很容易混淆的点:VIRTUAL_PORT指定的是容器内部监听的端口,而不是宿主机映射的端口!

看你的应用docker-compose配置:

public:
  ports:
    - 3001:8081 # 左边是宿主机端口,右边是容器内部端口
  environment:
    - VIRTUAL_HOST=www.example.com
    - VIRTUAL_PORT=3001 # 这里错了!应该是容器内的8081

把VIRTUAL_PORT改成容器实际监听的8081,修改后:

environment:
  - VIRTUAL_HOST=www.example.com
  - VIRTUAL_PORT=8081

2. 解决网络隔离问题

你分别在两个docker-compose文件里定义了backend网络,但默认情况下,不同docker-compose项目创建的同名网络是相互独立的——也就是说,nginx-proxy的容器和你的应用容器根本不在同一个网络里,nginx自然无法转发请求到应用容器。

解决这个问题有两种简单的方式:

方式一:使用共享外部网络

先手动创建一个全局的backend网络:

docker network create backend

然后修改两个docker-compose文件里的网络配置,标记为外部网络:

nginx-proxy的docker-compose.yml:

networks:
  backend:
    external: true # 声明使用外部已创建的网络

应用的docker-compose.yml:

networks:
  backend:
    external: true

方式二:合并到同一个docker-compose文件

把nginx-proxy和应用服务放在同一个docker-compose.yml里,这样所有服务默认会加入同一个网络,不需要额外配置。

3. 验证nginx-proxy的自动配置

修改配置后,重启所有容器,然后进入nginx-proxy容器查看生成的Nginx配置,确认是否正确生成了www.example.com的路由规则:

# 先找到nginx-proxy的容器ID
docker ps | grep nginx-proxy
# 进入容器查看配置
docker exec -it <你的nginx-proxy容器ID> cat /etc/nginx/conf.d/default.conf

你应该能看到类似这样的server块:

server {
  server_name www.example.com;
  ...
  location / {
    proxy_pass http://<public容器的IP或容器名>:8081;
    ...
  }
}

4. 额外检查点

  • 宿主机端口监听:确认nginx-proxy的80端口已经正确绑定到宿主机,执行netstat -tulpn | grep :80,应该能看到nginx进程监听0.0.0.0:80。
  • 防火墙规则:检查Google Compute VM的防火墙设置,确保80端口(HTTP)是对外开放的,没有被拦截。
  • DNS解析:验证你的本地机器能正确把www.example.com解析到VM的公网IP,用ping www.example.com或者nslookup www.example.com测试。

先从前面两点(VIRTUAL_PORT和网络)入手,这是最常见的问题,应该能解决你的域名直接访问的需求。

内容的提问来源于stack exchange,提问作者Mente Gee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:39:02