如何在AWS Ubuntu上使用自定义SSL证书部署Traefik与多副本容器化Shiny Server?
单EC2环境Traefik反代多副本Shiny Server 404问题排查指南
核心判断前提
目前abc.xxxgateway.com可以正常访问Traefik界面,说明Traefik服务本身、443/80端口映射、EC2安全组、域名解析到公网IP的基础链路全部正常,404错误是Traefik收到xyz.xxxgateway.com的请求后,未匹配到对应Shiny后端服务触发的,和Shiny应用本身的运行状态无关。
分步骤排查修正方案
1. 核对Traefik对Shiny服务的路由标签配置
Traefik默认通过容器标签识别服务路由规则,这是最容易出现配置错误的环节:
- 确认Shiny服务的路由规则完整匹配
xyz.xxxgateway.com,使用Docker标签部署时的正确配置参考:labels: - traefik.enable=true # 路由匹配规则:匹配xyz域名的请求 - traefik.http.routers.shiny.rule=Host(`xyz.xxxgateway.com`) # 绑定到Traefik的HTTPS入口 - traefik.http.routers.shiny.entrypoints=websecure # 开启TLS - traefik.http.routers.shiny.tls=true # 负载均衡指向Shiny容器内部端口,无需填写宿主机映射端口 - traefik.http.services.shiny.loadbalancer.server.port=3838 # 显式指定路由优先级,避免被dashboard的默认规则覆盖 - traefik.http.routers.shiny.priority=100 - 确认Shiny服务和Traefik服务接入了同一个Docker网络:多副本部署时,所有Shiny容器都要加入Traefik所在的可被发现的网络,不能存在Traefik无法路由到的独立网络副本。
2. 核对自有SSL证书的绑定逻辑
采用本地SSL.cert、SSL.key的自有证书部署方式时,需避免证书绑定范围不全的问题:
- 不要只把SSL证书绑定到Traefik dashboard的路由上,要将同一份证书配置到全局websecure入口的TLS规则中,覆盖所有域名的HTTPS请求
- 检查SSL证书的SAN列表,确认包含
xyz.xxxgateway.com,Traefik遇到没有匹配证书的域名请求时,会直接返回404而非证书警告。
3. 本地连通性验证
在EC2实例上直接验证Traefik到Shiny服务的链路连通性,排除网络层问题:
- 进入Traefik运行的容器内部,执行带Host头的curl测试:
如果可以返回Shiny Server的首页HTML内容,说明容器间网络连通,问题仅存在于Traefik的路由标签配置;如果返回连接拒绝,说明两个服务不在同一可路由的Docker网络中。curl -H "Host: xyz.xxxgateway.com" http://<shiny服务的docker网络域名>:3838 - 无需额外调整EC2安全组:两个域名解析到同一公网IP,既然abc域名可以正常访问,说明80/443端口的入站规则已经放通。
高频踩坑修正
- 不要沿用单域名部署的子路径规则(比如将Shiny配置在
abc.xxxgateway.com/shiny路径下),当前是独立域名指向Shiny,直接配置根路径Host规则即可 - 多副本部署时,需将Traefik路由标签配置在docker-compose的顶层服务定义上,不要只给单个副本实例加标签,避免部分副本被识别、部分副本被遗漏
- 区分不同错误码的触发原因:如果配置了错误的中间件,通常会返回401/502错误而非404,排查时可优先查看Traefik的实时日志,定位未匹配请求对应的规则。
内容的提问来源于stack exchange,提问作者Basant Neupane
相关产品推荐
相关产品推荐

