3

通过在 Docker 和 Traefik 上进行反向代理,我想将同一主机上的多个路径分派到两个不同的后端服务器,例如:

1. traefik.test/            ->   app1/
2. traefik.test/post/blabla ->   app1/post/blabla
3. traefik.test/user/blabla ->   app2/user/blabla

如果规则只有 #2 和 #3,我可以在 docker-compose.yml 中这样做

app1:
  image: akky/app1
  labels:
    - "traefik.backend=app1"
    - "traefik.frontend.rule=Host:traefik.test;PathPrefix:/post,/comment"

app2:
  image: akky/app2
  labels:
    - "traefik.backend=app2"
    - "traefik.frontend.rule=Host:traefik.test;PathPrefix:/user,/group"

但是,将根“/”添加到第一个 PathPrefix 似乎掩盖了 app2 上的 /user。以下不起作用,一切都转到 app1 后端。

    - "traefik.frontend.rule=Host:traefik.test;PathPrefix:/,/post,/group"

规则“主机:”和“路径前缀”似乎用作“与”,但我想使用“或”(精确 /,或以 /post 开头)。我搜索并了解到,从版本 1.3.0 开始,可以根据pull request #1257通过添加服务名称制作多行来定向多个规则。

通过知道,我所做的就是这样,

app1:
  image: akky/app1
  labels:
    - "traefik.app1_subfolder.backend=app1"
    - "traefik.app1_subfolder.frontend.rule=Host:traefik.test;PathPrefix:/post,/group"
    - "traefik.app1_rootfolder.backend=app1"
    - "traefik.app1_rootfolder.frontend.rule=Host:traefik.test;Path:/"

app2:
  image: akky/app2
  labels:
    - "traefik.backend=app2"
    - "traefik.frontend.rule=Host:traefik.test;PathPrefix:/user"

现在它按要求工作,root 访问权限被分派到 app1/ 。

我的问题是,这是正确的方法吗?对我来说看起来不是这样,因为这个根和子文件夹调度应该是一个典型的用例。

4

1 回答 1

1

您可以考虑添加优先级标签,以便 app2 规则优先于 app1 规则。然后你应该能够简化 app1 配置。

app1:
  image: akky/app1
  labels:
    - "traefik.backend=app1"
    - "traefik.frontend.priority=10"
    - "traefik.frontend.rule=Host:traefik.test;PathPrefix:/,/post,/group"

app2:
  image: akky/app2
  labels:
    - "traefik.backend=app2"
    - "traefik.frontend.priority=50"
    - "traefik.frontend.rule=Host:traefik.test;PathPrefix:/user"

更新:我的优先顺序错误。较大的优先级值优先于较小的优先级值。根据文档,它基于(priority + rule length),并且较大的值获胜。

于 2018-03-06T01:29:45.493 回答