Traefik未将外部443端口映射至内部80端口问题咨询
我之前调试Traefik路由时也碰到过几乎一模一样的问题——HTTP负载均衡正常,HTTPS能建立安全连接但返回404,核心原因就是HTTPS路由没有明确指定后端服务的目标端口为80,导致Traefik默认转发到了错误的端口(比如容器暴露的443,或者默认的其他端口)。下面是具体的排查和解决步骤:
1. 明确指定后端服务的负载均衡端口
这是最常见的解决方法,因为Traefik的自动服务发现如果遇到容器暴露多个端口时,可能会选错端口。
如果你用Docker标签配置:
给你的服务加上明确的端口指定标签:
docker run -d \ # 其他标签... --label "traefik.http.services.your-service-name.loadbalancer.server.port=80" \ your-backend-image
如果你用Docker Compose:
在服务的labels里添加端口配置:
services: your-backend: image: your-backend-image labels: - "traefik.http.routers.your-router.entrypoints=websecure" - "traefik.http.routers.your-router.tls.certresolver=letsencrypt" # 关键:指定后端端口为80 - "traefik.http.services.your-service.loadbalancer.server.port=80"
如果你用静态配置文件(traefik.yml):
在http.services部分明确指定后端服务器的80端口:
http: services: your-service: loadbalancer: servers: - url: "http://server1:80" - url: "http://server2:80" - url: "http://server3:80"
2. 验证HTTPS路由的转发目标
启用Traefik Dashboard(如果没开的话,可以临时加--api.insecure=true启动参数),查看HTTPS路由对应的服务配置,确认负载均衡器的目标端口是80而不是其他值。
另外,你可以用curl -v https://your-domain调试,看404响应的来源:如果响应头里有后端服务的标识,说明Traefik已经把请求发过去了,但后端在错误的端口上没有对应的服务;如果是Traefik本身返回的404,那可能是路由规则没匹配,但你说TLS连接正常,大概率还是端口的问题。
3. 排查端口冲突或自动发现异常
如果你的后端容器同时暴露了80和443端口,Traefik的自动端口检测可能会优先选择443,但后端服务实际只在80上运行,这就会导致404。这种情况下,必须显式指定loadbalancer.server.port=80,覆盖自动发现的端口。
4. 确认TLS终止后的转发逻辑
你的Let's Encrypt配置正常,说明Traefik已经完成了TLS终止,接下来应该把HTTP请求转发到后端的80端口,而不是继续用HTTPS转发到后端的443(除非后端也配置了HTTPS,但你说HTTP入口点正常,所以后端应该是跑在80上的)。
内容的提问来源于stack exchange,提问作者Sven Haiges

