首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带Traefik的路由路径

带Traefik的路由路径
EN

Stack Overflow用户
提问于 2017-01-13 15:17:25
回答 2查看 15K关注 0票数 13

目前,我正在尝试设置一个装载平衡器/反向代理与Traefik一些码头集装箱。我在配置Treafik以使用一些前缀路径使我的应用程序可用方面有困难。我能够获得一个基本的Traefik配置运行使用码头和码头组成,基于这个例子。问题是,我能够在路径上找到“whoamI”容器,但不能访问我的应用程序和其他容器。

例如,我创建了一个用于启动whoamI容器的docker文件(参见下面),并创建了5个维护者容器(这样人们就可以重新创建这个场景)。我希望woamI可以在/wai上使用,而维护者可以在/portainer1上使用。

相反,我可以访问whoamI not服务器(通过/wai),而不是维护者(通过/portainer1)。然而,我能够联系到/portainer2的维护者。这两者在Traefik配置上唯一的区别是使用“PathStrip”而不是“Path”。然而,令人讨厌的是,当导航到/portainer2时,我只能获得一个白色页面;只加载页面标题和一些html。我还启动了一个面向主机的维护者容器,以验证预期的行为(正常的维护者页面)。还请参阅下面所附的图片。

编辑:

有趣的是,我还可以在/portainer4/ (但不是/portainer4)上找到维护者,从而获得相同的白页。导航到/portainer2//portainer4/之间的区别是,我注意到Traefik中有一些额外的日志记录(见下文)。当通过/portainer4/导航到维护者时,日志中会显示三行额外的行,指示状态为400。经过一些调查后,我发现这是因为我的浏览器试图加载其他文件(即javascript文件、偏袒图标和样式表)。因此,当在/portainer4/访问维护者时,我的浏览器知道它需要获取这些额外的文件,并尝试这样做(在导航到/portainer2时不会发生这种情况)。例如,当我试图通过导航到/portainer4/ico/favicon.ico来访问文件时,我会得到一个400 Bad Request。最后,当导航到/portainer2/ico/favicon.ico时,会看到一个404 page not found

基于这些结果,我想:

  • 为什么我在/portainer1不能联系到维护者,而只能在/portainer2上联系?
  • 为什么我在导航到/portainer2时没有看到完整的维护者页面?
  • 为什么/portainer2//portainer4/在访问文件(例如,图标)的行为上有区别
  • 400坏请求到底意味着什么?这个问题是否可以解决?

我真的很想知道一些正确的方向。

一些截图:

docker-compose.yml:

代码语言:javascript
复制
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//portainer3//portainer4/后生成的Traefik日志记录:

代码语言:javascript
复制
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"
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-16 19:46:54

今天早上我找到了解决办法。在这种情况下,正确的方法应该是使用PathPrefixStrip规则。但是,作为这里提到的,在规则的末尾放置一个/将破坏设置。我通过删除/规则末尾的PathPrefixStrip: /portainer4/创建了一个工作配置。所以这个对接组合的配置对我来说是有效的:

代码语言:javascript
复制
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时,仍然会得到前面提到的白色页面。

票数 13
EN

Stack Overflow用户

发布于 2020-05-23 18:41:50

为未来的谷歌人

没有斜杠它不能工作的原因是一个存在的问题

https://github.com/containous/traefik/issues/563

用于v2码头标签

代码语言:javascript
复制
      - "traefik.http.routers.portainer-secure.rule=Host(`your-domain.com`) && PathPrefix(`/portainer`)"

      - "traefik.http.routers.portainer-secure.middlewares=portainer-redirectregex, portainer-replacepathregex"

      - "traefik.http.middlewares.portainer-replacepathregex.replacepathregex.regex=^/portainer/(.*)"
      - "traefik.http.middlewares.portainer-replacepathregex.replacepathregex.replacement=/$$1"
      - "traefik.http.middlewares.portainer-redirectregex.redirectregex.regex=^(.*)/portainer$$"
      - "traefik.http.middlewares.portainer-redirectregex.redirectregex.replacement=$$1/portainer/"
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41637806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档