与Traefik路由path
目前我正在尝试用Traefik为一些docker集装箱设置一个loadbalancer / reverse proxy。 我无法configurationTreafik使我的应用程序可用一些前缀path。 基于这个例子 ,我能够得到一个使用Docker和Docker组合运行的基本Traefikconfiguration。 问题是,我可以让'whoamI'容器在path上可到达,而不是我的应用程序和其他容器。
例如,我创build了一个docker-compose文件(见下文)来启动whoamI容器和五个Portainer容器(以便人们可以重新创build场景)。 我希望woamI可以在/wai
和Portainer /portainer1
portainer1。
相反,我可以到达whoamI webserver(通过/wai
)而不是Portainer(通过/portainer1
portainer1)。 不过,我可以到Portainer /portainer2
portainer2。 这两者之间的Traefikconfiguration的唯一区别是使用“PathStrip”而不是“Path”。 但恼人的是,我只能在导航到/portainer2
时才能获得一个白页; 只有页面标题和一些HTML被加载。 我也启动了一个暴露在主机上的Portainer容器来validation预期的行为(一个普通的Portainer页面)。 请参阅下面的附加图像。
编辑:
有趣的是,我也可以通过/portainer4/
portainer4 /portainer4/
(但不是/portainer4
portainer4)到达Portainer,导致相同的白页。 导航到/portainer2/
和/portainer4/
之间的区别是,我注意到一些额外的日志Traefik(见下文)。 当通过/portainer4/
portainer4 /portainer4/
导航到Portainer时,日志中出现三条额外的线,表示400状态。 经过一番调查,我发现这是来自我的浏览器试图加载额外的文件(即JavaScript文件,图标和样式表)。 所以,当访问portainer /portainer4/
portainer4 /portainer4/
我的浏览器知道它需要获取这些额外的文件,并试图这样做(这不会发生时,导航到/portainer2
)。 当尝试自己访问文件时,例如,导航到/portainer4/ico/favicon.ico
,我得到一个400 Bad Request
。 最后,当导航到/portainer2/ico/favicon.ico
是看到404 page not found
。
基于这些结果,我想知道:
- 为什么我无法在/ portainer1到达Portainer,而是在/ portainer2?
- 为什么在导航到/ portainer2时看不到完整的Portainer页面?
- 为什么访问
/portainer2/
和/portainer4/
之间的文件(例如favicon) - 400的错误请求实际上是什么意思,如果/如何解决这个问题这个问题
我真的很感激一些正确的方向
一些截图:
泊坞窗,compose.yml:
version: '2' services: traefik: container_name: traefik image: traefik command: --web --docker --docker.domain=docker.localhost --logLevel=DEBUG ports: - "80:80" - "8080:8080" volumes: - /var/run/docker.sock:/var/run/docker.sock - /dev/null:/traefik.toml labels: - "traefik.enable=false" whoami: image: emilevauge/whoami labels: - "traefik.backend=whoami" - "traefik.frontend.rule=Path: /wai/" portainer1: image: portainer/portainer labels: - "traefik.backend=portainer1" - "traefik.frontend.rule=Path: /portainer1/" portainer2: image: portainer/portainer labels: - "traefik.backend=portainer2" - "traefik.frontend.rule=PathStrip: /portainer2/" portainer: image: portainer/portainer ports: - "9000:9000" labels: - "traefik.enable=false"
在访问/wai
, /portainer1/
<myIP>/portainer2/
/portainer1/
, <myIP>/portainer2/
, /portainer3/
和/portainer4/
之后分别生成另外的Traefik日志logging:
time="2017-01-13T14:33:16Z" level=debug msg="Round trip: http://172.19.0.2:80, code: 200, duration: 1.000627ms" time="2017-01-13T14:33:22Z" level=debug msg="Round trip: http://172.19.0.7:9000, code: 404, duration: 1.006089ms" time="2017-01-13T14:33:24Z" level=debug msg="Round trip: http://172.19.0.3:9000, code: 200, duration: 1.160158ms" time="2017-01-13T14:33:26Z" level=debug msg="Round trip: http://172.20.0.5:9000, code: 404, duration: 1.291309ms" time="2017-01-13T14:33:29Z" level=debug msg="Round trip: http://172.20.0.4:9000, code: 200, duration: 2.788462ms" time="2017-01-13T14:33:29Z" level=debug msg="Round trip: http://172.20.0.4:9000, code: 400, duration: 777.073µs" time="2017-01-13T14:33:30Z" level=debug msg="Round trip: http://172.20.0.4:9000, code: 400, duration: 1.780621ms" time="2017-01-13T14:33:30Z" level=debug msg="Round trip: http://172.20.0.4:9000, code: 400, duration: 1.780341ms"
今天早上我find了解决办法。 像这些情况下的正确方法应该是使用PathPrefixStrip规则。 但是,正如这里提到的那样,在规则的末尾放置会破坏设置。 我通过删除/
在PathPrefixStrip: /portainer4/
rule的末尾创build了一个工作configuration。 所以这个docker-composeconfiguration为我工作:
version: '2' services: traefik: container_name: traefik2 image: traefik command: --web --docker --docker.domain=docker.localhost --logLevel=DEBUG ports: - "80:80" - "8081:8080" volumes: - /var/run/docker.sock:/var/run/docker.sock - /dev/null:/traefik.toml labels: - "traefik.enable=false" portainer: image: portainer/portainer labels: - "traefik.backend=portainer" - "traefik.frontend.rule=PathPrefixStrip: /portainer"
现在,当我导航到<myIP>/portainer/
我看到<myIP>/portainer/
页面。 但是,当我导航到<myIP>/portainer
时,我仍然会像前面提到的那样获取白页。