Traefik v2路由404问题求助:跨服务器Tomcat应用访问失败
排查与解决Traefik v2路由404问题
核心问题分析
你的配置中,路由规则匹配/myphpapp前缀的请求,但转发到后端Tomcat时,可能存在路径传递异常、配置加载失败或网络连通性问题,导致404错误。
分步排查与修复
1. 验证动态配置文件加载正确性
Traefik的文件提供者会扫描/etc/traefik/dynamic目录下的.yml/.toml文件,但如果你的动态配置文件名是traefik.yml,可能和Traefik默认的静态配置文件名冲突,导致加载失败。
- 把动态配置文件重命名为
dynamic.yml(或其他非traefik.yml的名称) - 查看Traefik日志(
docker logs traefik),确认是否有配置加载错误的提示
2. 修复路径转发逻辑(关键)
虽然你的路由规则匹配了/myphpapp前缀,但默认情况下Traefik会将完整路径(包括/myphpapp)转发到后端。实际场景中,建议通过路径剥离中间件确保路径正确传递,修改动态配置如下:
http: middlewares: strip-myphpapp-prefix: stripPrefix: prefixes: - "/myphpapp" forceSlash: false routers: inventoryapp-router: rule: "Host(`myawesomeapp.de`) && PathPrefix(`/myphpapp`)" service: inventoryapp-service middlewares: - strip-myphpapp-prefix services: inventoryapp-service: loadBalancer: servers: - url: "http://10.15.3.2:8301/myphpapp/"
说明:将服务URL直接指向Tomcat应用的上下文路径
/myphpapp/,同时用stripPrefix中间件去掉请求URL中的/myphpapp前缀,确保转发到后端的路径是/login.html,匹配Tomcat应用的实际路由。
3. 验证Traefik与后端服务器的网络连通性
进入Traefik容器,测试能否访问后端Tomcat:
docker exec -it traefik curl http://10.15.3.2:8301/myphpapp/login.html
- 如果返回404,说明Traefik容器无法正常访问后端服务,检查服务器A的防火墙规则(是否允许服务器B的IP访问8301端口)、网络路由是否通畅
- 如果返回正常内容,说明网络没问题,问题出在Traefik的路由配置
4. 检查Traefik Dashboard确认路由状态
访问http://服务器B的IP:8080(你的配置中开启了api.insecure=true),查看:
- Routers标签下,
inventoryapp-router是否显示为enabled状态 - Services标签下,
inventoryapp-service是否正常关联到后端服务器 - 如果路由未加载,检查动态配置文件的语法是否正确(可用YAML校验工具检查格式)
5. 处理HTTP到HTTPS的跳转(可选)
如果需要强制HTTPS,在路由中添加tls配置,并配置HTTP入口的跳转中间件:
http: middlewares: redirect-to-https: redirectScheme: scheme: https permanent: true routers: # 新增HTTP跳转路由 http-redirect-router: rule: "Host(`myawesomeapp.de`)" entryPoints: - web middlewares: - redirect-to-https service: dummy-service # 虚拟服务,仅用于跳转 inventoryapp-router: rule: "Host(`myawesomeapp.de`) && PathPrefix(`/myphpapp`)" entryPoints: - websecure service: inventoryapp-service middlewares: - strip-myphpapp-prefix tls: certResolver: letsencrypt services: dummy-service: loadBalancer: servers: - url: "http://localhost:8080" # 随便填一个可达的地址即可
总结
最可能的原因是动态配置文件加载异常或路径转发逻辑错误,优先检查配置文件名和添加路径剥离中间件,再验证网络连通性和路由状态。
内容的提问来源于stack exchange,提问作者Phong
相关产品推荐
相关产品推荐

