【问题标题】:Traefik routing to both known and wildcard subdomain on a single domainTraefik 路由到单个域上的已知和通配符子域
【发布时间】:2018-09-19 17:54:28
【问题描述】:

是否可以有一个不包含特定子域的通配符子域?

*.mydomain.com OK
login.mydomain.com SKIP

在我的应用容器上使用通配符时,我无法访问我的登录容器。下面是我想要完成的图像。 (交通标志在技术上应该在路线列表和容器之间)

如果包含规则HostRegexp:{subdomain:[a-z]+}.${HOST_DOMAIN},则以下配置不起作用。

在删除除通配符子域之外的所有内容的主机正则表达式后,此配置成功运行。

services:
    traefik:
        image: traefik
        volumes:
        - /var/run/docker.sock:/var/run/docker.sock:ro
        - .traefik.toml:/etc/traefik/traefik.toml:ro
        ports:
        - "80:80"
        - "443:443"

    api:
        image: my-api-image
        labels:
        - "traefik.enable=true"
        - "traefik.port=80"
        - "traefik.frontend.rule=Host:app.${HOST_DOMAIN}; PathPrefix: /api"

    app:
        image: my-app-image
        labels:
        - "traefik.enable=true"
        - "traefik.port=80"
        - "traefik.frontend.rule=Host:app.${HOST_DOMAIN}"
        - "traefik.frontend.rule=HostRegexp:{subdomain:[a-z]+}.${HOST_DOMAIN}" # this second rule overwrites the first rule and I am aware of that, I am just showing what rules i've tried :)

    login:
        image: my-login-image
        labels:
        - "traefik.enable=true"
        - "traefik.port=80"
        - "traefik.frontend.rule=Host:login.${HOST_DOMAIN}"

我的问题目前与app 容器有关。如果我将以下内容作为前端规则包含在内,我将得到一个错误的网关:

"traefik.frontend.rule=HostRegexp:{subdomain:[a-z]+}.${HOST_DOMAIN}"

我也尝试将上述内容留在 app 下,并在没有任何运气的情况下删除以下内容:

"traefik.frontend.rule=Host:app.${HOST_DOMAIN}"

任何建议或想法将不胜感激。谢谢。

编辑:

稍微改写一下。

【问题讨论】:

  • 在您的“改写”之后,不清楚您的问题是什么,您得到的“错误网关”或您的通配符规则与非通配符域匹配。如果您已经解决了最初的问题,请在下面发布答案(或者只要没有发布答案,就完全删除问题)并针对您的新问题提出另一个问题。
  • 你说得对,我不应该在它上线这么长时间后进行编辑。我遇到网关问题的原因是因为我缺少为应用程序容器定义的主机,我需要HostRegexp:app.${HOST_DOMAIN},{subdomain:[a-z]+}.${HOST_DOMAIN}"。添加应用程序后,错误的网关问题就解决了,然后我遇到的真正问题是通配符规则匹配。你的回答是我问题的正确答案。我宁愿保留它而不是删除它。

标签: docker docker-compose traefik


【解决方案1】:

所以这对我有用:

version: '2'

services:
    traefik:
        image: traefik
        volumes:
        - /var/run/docker.sock:/var/run/docker.sock:ro
        # I removed your traefik.toml as you did not specify what is in it, so it's irrelevant
        ports:
        - "80:80"
        - "443:443"
        # Very helpful for debugging dashboard can be seen at http://localhost:8080 if the port is exposed
        - "8080:8080"
        labels:
        # You don't want traefik trying to create proxy for itself
        - "traefik.enable=false"
        # Since we have no traefik.toml any longer, let's put the essentials on the command line
        command: ["--api","--docker"]
    app:
        # this is my test image of a web server that dumps request back to the caller
        image: andrewsav/talkback
        # the hostname is a part of the dump, so let's specify something that we can relate to
        hostname: "app"
        labels:
        # note that you want this frontened to match the last. otherwise it will match login.${HOST_DOMAIN}"
        - "traefik.frontend.priority=1"
        - "traefik.enable=true"
        - "traefik.port=80"
        - "traefik.frontend.rule=HostRegexp:{subdomain:[a-z]+}.${HOST_DOMAIN}"
    api:
        image: andrewsav/talkback
        hostname: "api"
        labels:
        # this frontend needs to match before the one above
        - "traefik.frontend.priority=2"
        - "traefik.enable=true"
        - "traefik.port=80"
        - "traefik.frontend.rule=Host:app.${HOST_DOMAIN}; PathPrefix: /api"
    login:
        image: andrewsav/talkback
        hostname: "login"
        labels:
        - "traefik.frontend.priority=3"
        - "traefik.enable=true"
        - "traefik.port=80"
        - "traefik.frontend.rule=Host:login.${HOST_DOMAIN}"

一些注意事项:

  • Bad Gateway 表示您告诉 traefik 与之交谈的端点没有在监听。查看仪表板并找出使用的后端,并仔细检查 ip/port 是否正确。
  • 您必须使用优先级来匹配顺序。请参阅the documentation 了解其工作原理。

【讨论】:

    猜你喜欢
    • 2017-05-18
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 2019-01-14
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多