我有一个群集服务容器,暴露了端口5500。在容器中,https://localhost:5500/app上有一个Web UI。我的服务称为service1。
我正在使用traefik 2代理,并且我希望service1的Web UI在https://proxy.domain.com/service1/app上可用。
我的service1 traefik标签配置如下:
labels:
- "traefik.http.routers.service1.rule=Host(`proxy.domain.com`) && PathPrefix(`/service1/app`)"
- "traefik.http.middlewares.strip-s1.stripprefix.prefixes=/service1"
- "traefik.http.routers.service1.service=service1@docker"
- "traefik.http.services.service1.loadbalancer.server.port=5500"
- "traefik.http.routers.service1.middlewares=strip-s1@docker"
- "traefik.http.routers.service1.entrypoints=https"
- "traefik.http.routers.service1.tls=true"
据我所知,traefik,通过这种配置,我可以调用与路由器规则匹配的https://proxy.domain.com/service1/app。 Traefik然后将从pathPrefix删除/ service1,因此/ app将保留并转发到端口5500上的服务容器,因此我认为该容器将在端口5500 / app上被调用。
但是当我在浏览器中调用https://proxy.domain.com/service1/app时,会收到HTTP_502错误的网关。
[当我执行curl -v https://proxy.domain.com/service1/app
时,我也得到HTTP_502。
[当我执行curl -v https://proxy.domain.com:5500/app
时,它可以工作,我连接到端口5500 / app,并重定向到容器中的端口5500 / app / login(此重定向由/ app后面的Web应用程序完成。
我做错了什么?我是否错误配置了traefik标签?
我既不是Traefik也不是Docker专家。但是我一直在研究类似的事情。我认为,问题是,stripprefix会剥离整个路径,而不仅仅是剥离您在标签中给出的部分。从stripprefix的v2.0 Traefik文档中:
例如,/ products可以匹配/ products,也可以匹配/ products / shoes和/ products / shirts。
由于路径在转发之前已被剥离,因此您的后端应在/上侦听。
因此,我认为您的Traefik路由器未转发到https://proxy.domain.com:5500/app
。您可以将Treafik日志记录设置为DEBUG,然后使用docker logs traefik
(或任何称为Traefik容器的名称)检查路由器实际上将请求转发至的位置。