跳到正文
Træfɪk

Traefik 文件路由配置

文件提供者允许你使用 YAML 或 TOML 定义路由配置。 可以用它声明路由器、服务、中间件、TCP 与 UDP 路由,以及 Traefik 应从文件或目录中加载的 TLS 选项。

有关文件提供者本身的配置,请参阅文件提供者安装配置页面。

配置示例

配置文件提供者并暴露一个 HTTP 服务

启用文件提供者:

providers:
  file:
    filename: /etc/traefik/dynamic.yml
[providers.file]
  filename = "/etc/traefik/dynamic.toml"
--providers.file.filename=/etc/traefik/dynamic.yml

声明动态 HTTP 配置:

http:
  routers:
    app:
      rule: Host(`example.com`)
      entryPoints:
        - websecure
      service: app
      tls: {}

  services:
    app:
      loadBalancer:
        servers:
          - url: http://127.0.0.1:8080
[http.routers.app]
  rule = "Host(`example.com`)"
  entryPoints = ["websecure"]
  service = "app"

  [http.routers.app.tls]

[http.services.app.loadBalancer]
  [[http.services.app.loadBalancer.servers]]
    url = "http://127.0.0.1:8080"
指定多个路由器和服务

定义每个路由器,并显式将其关联到应当处理匹配请求的服务。

http:
  routers:
    app:
      rule: Host(`example-a.com`)
      service: app
    admin:
      rule: Host(`example-b.com`)
      service: admin

  services:
    app:
      loadBalancer:
        servers:
          - url: http://127.0.0.1:8000
    admin:
      loadBalancer:
        servers:
          - url: http://127.0.0.1:9000
[http.routers.app]
  rule = "Host(`example-a.com`)"
  service = "app"

[http.routers.admin]
  rule = "Host(`example-b.com`)"
  service = "admin"

[http.services.app.loadBalancer]
  [[http.services.app.loadBalancer.servers]]
    url = "http://127.0.0.1:8000"

[http.services.admin.loadBalancer]
  [[http.services.admin.loadBalancer.servers]]
    url = "http://127.0.0.1:9000"
声明和引用中间件

文件提供者声明的中间件既可供文件提供者中的路由器使用,也可供其他提供者中的路由器使用。 其他提供者引用这些中间件时,需要使用 @file 提供者后缀。

http:
  routers:
    app:
      rule: Host(`secure.example.com`)
      entryPoints:
        - websecure
      middlewares:
        - secure-headers
      service: app
      tls:
        options: modern

  middlewares:
    secure-headers:
      headers:
        stsSeconds: 31536000
        forceSTSHeader: true

  services:
    app:
      loadBalancer:
        servers:
          - url: http://127.0.0.1:8080

tls:
  options:
    modern:
      minVersion: VersionTLS12
      sniStrict: true
[http.routers.app]
  rule = "Host(`secure.example.com`)"
  entryPoints = ["websecure"]
  middlewares = ["secure-headers"]
  service = "app"

  [http.routers.app.tls]
    options = "modern"

[http.middlewares.secure-headers.headers]
  stsSeconds = 31536000
  forceSTSHeader = true

[http.services.app.loadBalancer]
  [[http.services.app.loadBalancer.servers]]
    url = "http://127.0.0.1:8080"

[tls.options.modern]
  minVersion = "VersionTLS12"
  sniStrict = true
加载多个动态配置文件

如果希望将动态配置拆分到多个文件中,请为文件提供者配置一个目录。

providers:
  file:
    directory: /etc/traefik/dynamic
    watch: true
[providers.file]
  directory = "/etc/traefik/dynamic"
  watch = true
--providers.file.directory=/etc/traefik/dynamic
--providers.file.watch=true

/etc/traefik/dynamic/http.yml 示例:

http:
  routers:
    app:
      rule: Host(`example.com`)
      service: app

  services:
    app:
      loadBalancer:
        servers:
          - url: http://127.0.0.1:8080

/etc/traefik/dynamic/tls.yml 示例:

tls:
  certificates:
    - certFile: /certs/example.crt
      keyFile: /certs/example.key

配置选项

常规配置

文件提供者不会自动发现服务。 请在路由配置文件中显式定义每个路由器、服务、中间件和 TLS 资源。

其他提供者引用文件提供者声明的资源时,需要附加 @file 提供者后缀。 例如,Docker 标签可以通过 secure-headers@file 引用文件提供者中的中间件。

以下示例使用 YAML 风格的字段路径。 在 TOML 中,应使用相应的表和数组语法,例如 [http.routers.<router_name>] 和 [[http.services.<service_name>.loadBalancer.servers]]。

HTTP

路由器

在 http.routers.<router_name> 下定义 HTTP 路由器。

路由器名称 <router_name> 中不允许使用字符 @。

字段 说明 值
http.routers.<router_name>.rule 更多信息请参阅规则。 Host(`example.com`)
http.routers.<router_name>.ruleSyntax 更多信息请参阅 ruleSyntax。
RuleSyntax 已弃用,将在下一个主版本中移除。
v3
http.routers.<router_name>.entryPoints[n] 更多信息请参阅入口点。 websecure
http.routers.<router_name>.middlewares[n] 更多信息请参阅中间件概述。 secure-headers
http.routers.<router_name>.service 更多信息请参阅服务。 app
http.routers.<router_name>.parentRefs[n] 更多信息请参阅多层路由。 parent-router@file
http.routers.<router_name>.tls 更多信息请参阅 TLS。 {}
http.routers.<router_name>.tls.certResolver 更多信息请参阅 certResolver。 myresolver
http.routers.<router_name>.tls.domains[n].main 更多信息请参阅域名。 example.org
http.routers.<router_name>.tls.domains[n].sans[n] 更多信息请参阅域名。 www.example.org
http.routers.<router_name>.tls.options 更多信息请参阅 TLS 选项。 modern
http.routers.<router_name>.observability.accessLogs 启用或禁用此路由器的访问日志。 true
http.routers.<router_name>.observability.metrics 启用或禁用此路由器的指标。 true
http.routers.<router_name>.observability.tracing 启用或禁用此路由器的追踪。 true
http.routers.<router_name>.observability.traceVerbosity 更多信息请参阅追踪详细程度。 minimal
http.routers.<router_name>.priority 更多信息请参阅优先级。 42

服务

在 http.services.<service_name> 下定义 HTTP 服务。

服务名称 <service_name> 中不允许使用字符 @。

字段 说明 值
http.services.<service_name>.loadBalancer.servers[n].url 更多信息请参阅服务器。 http://127.0.0.1:8080
http.services.<service_name>.loadBalancer.servers[n].weight 更多信息请参阅服务器。 1
http.services.<service_name>.loadBalancer.servers[n].preservePath 更多信息请参阅服务器。 true
http.services.<service_name>.loadBalancer.strategy 更多信息请参阅负载均衡策略。 wrr
http.services.<service_name>.loadBalancer.passHostHeader 更多信息请参阅服务负载均衡器。 true
http.services.<service_name>.loadBalancer.healthCheck.* 更多信息请参阅健康检查。 path: /health
http.services.<service_name>.loadBalancer.passiveHealthCheck.* 更多信息请参阅被动健康检查。 maxFailedAttempts: 3
http.services.<service_name>.loadBalancer.sticky.cookie.* 更多信息请参阅粘性会话。 name: app-cookie
http.services.<service_name>.loadBalancer.responseForwarding.flushInterval 更多信息请参阅服务负载均衡器。 100ms
http.services.<service_name>.loadBalancer.serversTransport 更多信息请参阅 ServersTransport。 secure-transport
http.services.<service_name>.weighted.services[n].name 更多信息请参阅加权轮询。 app-v1
http.services.<service_name>.weighted.services[n].weight 更多信息请参阅加权轮询。 3
http.services.<service_name>.weighted.sticky.cookie.* 更多信息请参阅粘性会话。 name: app-cookie
http.services.<service_name>.weighted.healthCheck 更多信息请参阅加权服务健康检查。 {}
http.services.<service_name>.highestRandomWeight.services[n].name 更多信息请参阅最高随机权重。 app-v1
http.services.<service_name>.highestRandomWeight.services[n].weight 更多信息请参阅最高随机权重。 3
http.services.<service_name>.highestRandomWeight.healthCheck 更多信息请参阅最高随机权重。 {}
http.services.<service_name>.mirroring.service 更多信息请参阅镜像。 app-main
http.services.<service_name>.mirroring.mirrorBody 更多信息请参阅镜像。 true
http.services.<service_name>.mirroring.maxBodySize 更多信息请参阅镜像。 1048576
http.services.<service_name>.mirroring.mirrors[n].name 更多信息请参阅镜像。 app-shadow
http.services.<service_name>.mirroring.mirrors[n].percent 更多信息请参阅镜像。 10
http.services.<service_name>.mirroring.healthCheck 更多信息请参阅镜像。 {}
http.services.<service_name>.failover.service 更多信息请参阅故障转移。 app-main
http.services.<service_name>.failover.fallback 更多信息请参阅故障转移。 app-backup
http.services.<service_name>.failover.healthCheck 更多信息请参阅故障转移。 {}

中间件

在 http.middlewares.<middleware_name> 下定义 HTTP 中间件。

例如,要声明名为 add-api 的 AddPrefix 中间件,请设置 http.middlewares.add-api.addPrefix.prefix=/api。

有关可用中间件的更多信息,请参阅专门的中间件章节。

中间件名称 <middleware_name> 中不允许使用字符 @。

声明冲突

如果声明了多个名称相同但参数不同的中间件,该中间件将无法成功声明。

字段 说明 值
http.middlewares.<middleware_name>.<middleware_type>.<middleware_option> 其中 middleware_type 是中间件类型,例如 addPrefix 或 headers;middleware_option 是要设置的选项。 prefix: /api

ServersTransports

在 http.serversTransports.<servers_transport_name> 下定义 HTTP ServersTransports。

字段 说明 值
http.serversTransports.<servers_transport_name>.* 更多信息请参阅 ServersTransport。 serverName: example.org

TCP

可以使用文件提供者声明 TCP 路由器、服务、中间件和 ServersTransports。

TCP 路由器

在 tcp.routers.<router_name> 下定义 TCP 路由器。

路由器名称 <router_name> 中不允许使用字符 @。

字段 说明 值
tcp.routers.<router_name>.entryPoints[n] 更多信息请参阅入口点。 websecure
tcp.routers.<router_name>.rule 更多信息请参阅规则。 HostSNI(`example.com`)
tcp.routers.<router_name>.ruleSyntax 为每个路由器配置解析规则时使用的规则语法。
RuleSyntax 已弃用,将在下一个主版本中移除。
v3
tcp.routers.<router_name>.middlewares[n] 更多信息请参阅 TCP 中间件概述。 ip-allowlist
tcp.routers.<router_name>.service 更多信息请参阅服务。 tcp-app
tcp.routers.<router_name>.tls 更多信息请参阅 TLS。 {}
tcp.routers.<router_name>.tls.certResolver 更多信息请参阅 certResolver。 myresolver
tcp.routers.<router_name>.tls.domains[n].main 更多信息请参阅 TLS。 example.org
tcp.routers.<router_name>.tls.domains[n].sans[n] 更多信息请参阅 TLS。 www.example.org
tcp.routers.<router_name>.tls.options 更多信息请参阅 TLS。 modern
tcp.routers.<router_name>.tls.passthrough 更多信息请参阅透传。 true
tcp.routers.<router_name>.priority 更多信息请参阅优先级。 42

TCP 服务

在 tcp.services.<service_name> 下定义 TCP 服务。

服务名称 <service_name> 中不允许使用字符 @。

字段 说明 值
tcp.services.<service_name>.loadBalancer.servers[n].address 更多信息请参阅服务器负载均衡器。 127.0.0.1:9000
tcp.services.<service_name>.loadBalancer.servers[n].tls 决定连接后端服务器时是否使用 TLS。 true
tcp.services.<service_name>.loadBalancer.serversTransport 更多信息请参阅 TCP ServersTransport。 secure-tcp
tcp.services.<service_name>.loadBalancer.proxyProtocol.version 为后端连接启用 Proxy Protocol。 2
tcp.services.<service_name>.loadBalancer.terminationDelay 定义终止连接之前的延迟时间。 100
tcp.services.<service_name>.loadBalancer.healthCheck.* 更多信息请参阅 TCP 服务健康检查。 interval: 10s
tcp.services.<service_name>.weighted.services[n].name 更多信息请参阅加权轮询。 tcp-v1
tcp.services.<service_name>.weighted.services[n].weight 更多信息请参阅加权轮询。 3
tcp.services.<service_name>.weighted.healthCheck 更多信息请参阅加权轮询。 {}

TCP 中间件

在 tcp.middlewares.<middleware_name> 下定义 TCP 中间件。

例如,要声明名为 limit 的 InFlightConn 中间件,请设置 tcp.middlewares.limit.inFlightConn.amount=10。

有关可用中间件的更多信息,请参阅专门的 TCP 中间件章节。

中间件名称 <middleware_name> 中不允许使用字符 @。

声明冲突

如果声明了多个名称相同但参数不同的中间件,该中间件将无法成功声明。

字段 说明 值
tcp.middlewares.<middleware_name>.<middleware_type>.<middleware_option> 其中 middleware_type 是中间件类型,例如 inFlightConn;middleware_option 是要设置的选项。 amount: 10

TCP ServersTransports

在 tcp.serversTransports.<servers_transport_name> 下定义 TCP ServersTransports。

字段 说明 值
tcp.serversTransports.<servers_transport_name>.* 更多信息请参阅 TCP ServersTransport。 dialTimeout: 30s

UDP

可以使用文件提供者声明 UDP 路由器和服务。

UDP 路由器

在 udp.routers.<router_name> 下定义 UDP 路由器。

路由器名称 <router_name> 中不允许使用字符 @。

字段 说明 值
udp.routers.<router_name>.entryPoints[n] 更多信息请参阅 UDP 路由器入口点。 dns
udp.routers.<router_name>.service 更多信息请参阅 UDP 路由器配置。 dns-service

UDP 服务

在 udp.services.<service_name> 下定义 UDP 服务。

服务名称 <service_name> 中不允许使用字符 @。

字段 说明 值
udp.services.<service_name>.loadBalancer.servers[n].address 更多信息请参阅 UDP 服务。 127.0.0.1:5353
udp.services.<service_name>.weighted.services[n].name 更多信息请参阅 UDP 服务。 dns-v1
udp.services.<service_name>.weighted.services[n].weight 更多信息请参阅 UDP 服务。 3

TLS

可以使用文件提供者声明 TLS 证书、选项和存储。

证书

字段 说明 值
tls.certificates[n].certFile 更多信息请参阅 TLS 证书。 /certs/example.crt
tls.certificates[n].keyFile 更多信息请参阅 TLS 证书。 /certs/example.key
tls.certificates[n].stores[n] 更多信息请参阅证书存储。 default

TLS 选项

字段 说明 值
tls.options.<options_name>.minVersion 更多信息请参阅 TLS 选项。 VersionTLS12
tls.options.<options_name>.maxVersion 更多信息请参阅 TLS 选项。 VersionTLS13
tls.options.<options_name>.cipherSuites[n] 更多信息请参阅 TLS 选项。 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
tls.options.<options_name>.curvePreferences[n] 更多信息请参阅 TLS 选项。 CurveP256
tls.options.<options_name>.clientAuth.caFiles[n] 更多信息请参阅客户端身份验证。 /certs/client-ca.crt
tls.options.<options_name>.clientAuth.clientAuthType 更多信息请参阅客户端身份验证。 RequireAndVerifyClientCert
tls.options.<options_name>.sniStrict 更多信息请参阅严格 SNI 检查。 true
tls.options.<options_name>.alpnProtocols[n] 更多信息请参阅 TLS 选项。 h2
tls.options.<options_name>.disableSessionTickets 更多信息请参阅 TLS 选项。 true
tls.options.<options_name>.preferServerCipherSuites 已弃用:此选项不再生效,Go TLS 栈会忽略它。更多信息请参阅 TLS 选项。 true

TLS 存储

字段 说明 值
tls.stores.<store_name>.defaultCertificate.certFile 更多信息请参阅默认证书。 /certs/default.crt
tls.stores.<store_name>.defaultCertificate.keyFile 更多信息请参阅默认证书。 /certs/default.key
tls.stores.<store_name>.defaultGeneratedCert.resolver 更多信息请参阅 ACME 默认证书。 myresolver
tls.stores.<store_name>.defaultGeneratedCert.domain.main 更多信息请参阅 ACME 默认证书。 example.org
tls.stores.<store_name>.defaultGeneratedCert.domain.sans[n] 更多信息请参阅 ACME 默认证书。 www.example.org

Go 模板

警告

Go 模板仅适用于专用的动态配置文件。 模板不适用于 Traefik 的主静态配置文件。

Traefik 支持通过 Go 模板自动生成配置文件中重复的部分。 这些部分必须是有效的 Go 模板,并且可以使用 sprig 模板函数。

例如,可以像下面的示例一样,轻松定义多个路由器、服务和 TLS 证书:

使用模板进行配置
http:
  routers:
    {{range $i, $e := until 100 }}
    router{{ $e }}-{{ env "MY_ENV_VAR" }}:
      # ...
    {{end}}

  services:
    {{range $i, $e := until 100 }}
    application{{ $e }}:
      # ...
    {{end}}

tcp:
  routers:
    {{range $i, $e := until 100 }}
    router{{ $e }}:
      # ...
    {{end}}

  services:
    {{range $i, $e := until 100 }}
    service{{ $e }}:
      # ...
    {{end}}

tls:
  certificates:
  {{ range $i, $e := until 10 }}
  - certFile: "/etc/traefik/cert-{{ $e }}.pem"
    keyFile: "/etc/traefik/cert-{{ $e }}.key"
    stores:
    - "my-store-foo-{{ $e }}"
    - "my-store-bar-{{ $e }}"
  {{end}}
# template-rules.toml
[http]

  [http.routers]
  {{ range $i, $e := until 100 }}
    [http.routers.router{{ $e }}-{{ env "MY_ENV_VAR" }}]
    # ...
  {{ end }}

  [http.services]
  {{ range $i, $e := until 100 }}
      [http.services.service{{ $e }}]
      # ...
  {{ end }}

[tcp]

  [tcp.routers]
  {{ range $i, $e := until 100 }}
    [tcp.routers.router{{ $e }}]
    # ...
  {{ end }}

  [tcp.services]
  {{ range $i, $e := until 100 }}
      [tcp.services.service{{ $e }}]
      # ...
  {{ end }}

{{ range $i, $e := until 10 }}
[[tls.certificates]]
  certFile = "/etc/traefik/cert-{{ $e }}.pem"
  keyFile = "/etc/traefik/cert-{{ $e }}.key"
  stores = ["my-store-foo-{{ $e }}", "my-store-bar-{{ $e }}"]
{{ end }}

[tls.options]
{{ range $i, $e := until 10 }}
  [tls.options.TLS{{ $e }}]
  # ...
{{ end }}

版权所有 © 头文件软件工作室

文档由 HeadFile Studio 翻译。

Traefik v3.7 中文快照 · 原文版权归 Traefik Labs 及贡献者所有 · MIT 许可证