将Traefik StripPrefix中间件添加到docker-compose标签结果为504

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将Traefik StripPrefix中间件添加到docker-compose标签结果为504相关的知识,希望对你有一定的参考价值。

我已经开发了几个docker化的全栈Web应用程序,我正在尝试将请求路由到使用Traefik。我想通过docker-compose标签利用动态配置。我想应用stripPrefix中间件选项,以便可以使用相同的应用程序路由,就好像每个应用程序都在根目录中一样。但是,一旦应用了这些规则,就会导致504网关超时响应。

这是我的设置:

  • Traefik 2.0.1
  • Docker 19.03.2,撰写1.24.1
  • nginx:最新图像
  • 运行Traefik容器的global docker网络
  • 多个多容器应用程序,每个应用程序都包含一个NGINX Web服务器
  • [所有应用程序都有自己的local网络,NGINX容器也位于global网络上。
  • 每个应用程序都配置为在/处监听

这里是有问题的NGINX容器的docker-compose.yml定义:

nginx:
        image: nginx:latest
        container_name: "mps_nginx"
        volumes:
        - ./nginx/confs/nginx.conf:/etc/nginx/default.conf
        - ./static:/www/static
        restart: "always"
        labels:
            - traefik.http.routers.mps.rule=Host(`localhost`) && PathPrefix(`/mps`)
            - traefik.http.middlewares.strip-mps.stripprefix.prefixes=/mps
            - traefik.http.routers.mps.middlewares=strip-mps@docker
        networks:
        - default
        - mps

加重部分是,当我注释掉middlewares标签时,它运行得很好,但是找不到匹配的URL模式。

在此之前,我使用whoami中定义的Traefik Quickstart Tutorial容器测试了我的方法:

# Test service to make sure our local docker-compose network functions
  whoami:
    image: containous/whoami
    labels:
      - traefik.http.routers.whoami.rule=Host(`localhost`) && PathPrefix(`/whoami`)
      - traefik.http.middlewares.strip-who.stripprefix.prefixes=/whoami
      - traefik.http.routers.whoami.middlewares=strip-who@docker

http://localhost/whoami的请求返回(除其他事项外)GET / HTTP/1.1

这正是我期望我的路由方法能够用于所有其他应用程序的方式。 Traefik仪表板在我注册的每个中间件周围都显示为绿色,但我看到的只是504错误。

[如果有人有任何线索,我将不胜感激。

答案

[前缀为issue,但不以'/'结尾。像这样测试您的配置:

      - "traefik.http.routers.whoami.rule=Host(`localhost`) && (PathPrefix(`//whoami/`) || PathPrefix(`/portainer`))"
      - "traefik.http.middlewares.strip-who.stripprefix.prefixes=/whoami"

以上是关于将Traefik StripPrefix中间件添加到docker-compose标签结果为504的主要内容,如果未能解决你的问题,请参考以下文章

Traefik中间件——

使用 Traefik 提高 WebSocket 应用性能

为啥我需要使用 http.StripPrefix 来访问我的静态文件?

Kubernetes Traefik集成Pilot

为什么我需要使用http.StripPrefix来访问我的静态文件?

仅使用Traefik在内部网络上公开Docker数据库服务