跳转至

中间件

调整请求

概述

中间件被附件到路由上,是一种在请求发送到你的 服务 之前(或者在服务的响应发送到客户端之前)调整请求的一种方法。

Traefik 内置了许多不同功能的中间件,其中一些可以修改请求,头信息,一些负责重定向,一些添加身份验证等等。

中间件可以通过链式组合的方式来适用各种情况。

配置示例

# 通过 Docker 标签
whoami:
  #  暴露一个 API 来显示他的 IP 地址的一个容器
  image: containous/whoami
  labels:
    # 创建一个名为 `foo-add-prefix` 的中间件
    - "traefik.http.middlewares.foo-add-prefix.addprefix.prefix=/foo"
    # 将上面的`foo-add-prefix`中间件添加到名为`router1`的路由上
    - "traefik.http.routers.router1.middlewares=foo-add-prefix@docker"
# 通过 Kubernetes IngressRoute 对象
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: middlewares.traefik.containo.us
spec:
  group: traefik.containo.us
  version: v1alpha1
  names:
    kind: Middleware
    plural: middlewares
    singular: middleware
  scope: Namespaced

---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: stripprefix
spec:
  stripPrefix:
    prefixes:
      - /stripit

---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: ingressroute
spec:
# 更多属性...
  routes:
    # 更多属性...
    middlewares:
      - name: stripprefix
# 通过 TOML 配置文件配置
[http.routers]
  [http.routers.router1]
    service = "myService"
    middlewares = ["foo-add-prefix"]
    rule = "Host(`example.com`)"

[http.middlewares]
  [http.middlewares.foo-add-prefix.addPrefix]
    prefix = "/foo"

[http.services]
  [http.services.service1]
    [http.services.service1.loadBalancer]

      [[http.services.service1.loadBalancer.servers]]
        url = "http://127.0.0.1:80"
# 通过 YAML 配置文件配置
http:
  routers:
    router1:
      service: myService
      middlewares:
        - "foo-add-prefix"
      rule: "Host(`example.com`)"

  middlewares:
    foo-add-prefix:
      addPrefix:
        prefix: "/foo"

  services:
    service1:
      loadBalancer:
        servers:
          - url: "http://127.0.0.1:80"

Provider 命名空间

当你声明一个中间件时,它位于其 provider 的命名空间下面。例如,如果你适用 Docker 标签来声明中间件,那么该中间件将位于 docker provider 的命名空间下面。

如果你使用多个 providers,并且希望引用在另一个 provider 中声明的中间件(又称为跨 provider 的中间件),则必须在中间件名称后加上 @ 分隔符,然后再加上 provider 的名称。

<resource-name>@<provider-name>

Kubernetes 命名空间

由于 Kubernetes 也有其自己的命名空间的概念,但是和这里的 provider 命名空间 是不一样的,因此不要混淆了。

在跨 provider 使用的上下文中使用带有 Kubernetes 命名空间 的资源,这种情况下,由于中间件的定义不在 Kubernetes 中,所以在引用资源时指定 Kubernetes 命名空间 是没有任何意义的,所以即使存在该规范也会忽略的。

引用其他 Provider 的中间件

在 file provider 下面声明 add-foo-prefix。

[http.middlewares]
  [http.middlewares.add-foo-prefix.addPrefix]
    prefix = "/foo"
http:
  middlewares:
    add-foo-prefix:
      addPrefix:
        prefix: "/foo"

从其他 providers 下面使用 add-foo-prefix 中间件:

your-container: #
  image: your-docker-image

  labels:
    # 添加 add-foo-prefix@file 中间件 (在上面 file provider 中声明的)
    - "traefik.http.routers.my-container.middlewares=add-foo-prefix@file"
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: ingressroutestripprefix
spec:
  entryPoints:
    - web
  routes:
    - match: Host(`bar.com`)
      kind: Rule
      services:
        - name: whoami
          port: 80
      middlewares:
        - name: add-foo-prefix@file
        # namespace: bar
        # 当使用跨 proivider 这种语法的时候,类似于上面这里使用的 bar 这个命名空间将被忽略

可用中间件列表

中间件 用途 范围
AddPrefix 添加一个 Path 前缀 Path 修改器
BasicAuth Basic auth 认证机制 安全, 认证
Buffering 缓冲 request/response 请求生命周期
Chain 结合多个中间件 中间件工具
CircuitBreaker 停止调用不健康的服务 请求生命周期
Compress 压缩 response 响应 内容修改器
DigestAuth 添加 Digest 身份验证 安全, 认证
Errors 自定义错误页面 请求生命周期
ForwardAuth 认证委托 安全, 认证
Headers 添加/更新 头信息 安全
IPWhiteList 现在允许的客户端 IP 安全, 请求生命周期
InFlightReq 限制同时连接的数量 安全, 请求生命周期
PassTLSClientCert 在 Header 里面添加客户端证书 安全
RateLimit 限制调用频率 安全, 请求生命周期
RedirectScheme 客户端重定向 请求生命周期
RedirectRegex 客户端重定向 请求生命周期
ReplacePath 更改请求的 path 路径 Path 修改器
ReplacePathRegex 更改请求的 path 路径 Path 修改器
Retry 出现错误时自动重试请求 请求生命周期
StripPrefix 更改请求的 path 路径 Path 修改器
StripPrefixRegex 更改请求的 path 路径 Path 修改器