当前位置:  开发笔记 > 编程语言 > 正文

使用Traefik路由路径

如何解决《使用Traefik路由路径》经验,为你挑选了1个好方法。

目前我正在尝试使用Traefik为一些docker容器设置一个loadbalancer/reverse代理.我在配置Treafik以使用一些前缀路径使我的应用程序可用时遇到了麻烦.基于这个例子,我能够使用Docker和Docker组合运行基本的Traefik配置.问题是我能够在路径上获得'whoamI'容器,但不能在我的app和其他容器中访问.

例如,我创建了一个docker-compose文件(见下文)来启动whoamI容器和五个Portainer容器(这样人们可以重新创建场景).我希望woamI可以在/wai和Portainer上找到/portainer1.

相反,我可以访问whoamI webserver(via /wai)而不是Portainer(via /portainer1).但是,我能够到达Portainer /portainer2.这两者之间Traefik配置的唯一区别是使用'PathStrip'而不是'Path'.然而,令人烦恼的是,我只能在导航时获得白页/portainer2; 只加载页面标题和一些html.我还启动了一个暴露给主机的Portainer容器,以验证预期的行为(一个普通的Portainer页面).另见下图.

编辑:

有趣的是,我也能够/portainer4/(但不是/portainer4)获得Portainer,从而产生相同的白页.导航到/portainer2/和之间的区别/portainer4/是我注意到Traefik中的一些额外日志记录(见下文).当通过导航到Portainer时/portainer4/,日志中会显示三条额外的行,表示400状态.经过一番调查,我发现这来自于我的浏览器尝试加载其他文件(即javascript文件,favicon和样式表).因此,当/portainer4/我在浏览器中访问Portainer时,它知道需要获取这些额外的文件并尝试这样做(导航时不会发生这种情况/portainer2).当我尝试自己访问文件时,例如导航到/portainer4/ico/favicon.ico,我得到了一个400 Bad Request.最后,导航到/portainer2/ico/favicon.ico的时候看到的是404 page not found.

根据这些结果,我想知道:

为什么我不能在/ portainer1到达Portainer而是在/ portainer2上?

导航到/ portainer2时为什么我看不到完整的Portainer页面?

为什么访问/portainer2/和之间的文件(例如,favicon)之间的行为存在差异/portainer4/

400 Bad Request实际意味着什么以及此问题是否/如何解决此问题

我真的很感激正确方向的一些指示

一些截图: 不同的Treafik路径

泊坞窗,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"

参观后附加Traefik记录产生/wai,/portainer1/,/portainer2/,/portainer3//portainer4/,分别为:

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"

Koningh.. 10

今天早上我找到了解决方案.在这种情况下,正确的方法应该是使用PathPrefixStrip规则.但是,如此处所述,将/规则放在规则的末尾会破坏设置.我通过删除规则/的末尾创建了一个工作配置PathPrefixStrip: /portainer4/.所以这个docker-compose配置对我有用:

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"

现在,当我导航到/portainer/我看到portainer页面时.但是,当我导航到时,我仍然得到前面提到的白页/portainer.



1> Koningh..:

今天早上我找到了解决方案.在这种情况下,正确的方法应该是使用PathPrefixStrip规则.但是,如此处所述,将/规则放在规则的末尾会破坏设置.我通过删除规则/的末尾创建了一个工作配置PathPrefixStrip: /portainer4/.所以这个docker-compose配置对我有用:

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"

现在,当我导航到/portainer/我看到portainer页面时.但是,当我导航到时,我仍然得到前面提到的白页/portainer.

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有