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.services.<service_name> 下定义 HTTP 服务。
服务名称 <service_name> 中不允许使用字符 @。
中间件¶
在 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 }}