type
status
date
slug
summary
tags
category
icon
password
在本文我们使用Traefik的服务发现和手动配置实现更多自定义的用法。
🔍 服务发现
在Traefik中,配置发现是通过Providers实现的。Providers
是基础结构组件,无论是容器编排、容器引擎、云服务还是键值存储。其思想是 Traefik 查询provider API 以找到关于路由的相关信息,当 Traefik 检测到一个变化时,它会动态更新路由。
Docker Provider
将标签贴在您的容器上,让 Traefik 完成剩下的工作!
使用多个公开端口代理应用
默认情况下,Traefik 使用默认 dockerfile 为每个应用程序选取公开的端口。如果由于某种原因开发人员没有将此端口添加到 dockerfile 或暴露了多个端口,我们可能必须告诉 Traefik 将哪个端口用于 Web UI。
对于Unraid,找到要反向代理的应用程序,进入模板后,滚动到底部并单击“添加另一个路径,端口,变量,标签或设备”。选择添加标签并按照下面的屏幕截图填写字段。
键:
traefik.http.services.<service_name>.loadbalancer.server.port
值:
8080
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fd830565e-330b-4d2f-b216-b572f545000b%2F44c9f593-b14e-46b6-8db4-b9f238a089dc%2FUntitled.png?table=block&id=7dd0900f-e2d8-41d7-bf03-70d1d89423e5&t=7dd0900f-e2d8-41d7-bf03-70d1d89423e5&width=1230&cache=v2)
使用Rule自定义主机名
Rule是一组配置了值的匹配器,用于确定特定请求是否匹配特定条件。如果规则得到验证,路由器将变为活动的,调用中间件,然后将请求转发给服务。
默认情况下,Traefik 使用容器名称作为主机名。您可能希望手动选择使用的域/子域,而不是允许 Traefik 使用应用的子域的容器名称。添加此附加标签,您可以手动覆盖默认的docker provider rule。
反引号还是引号?
主机名是example.comrule = "Host(`example.com`)"
主机名是example.com或主机名是example.org并且path是/traefikrule = "Host(`example.com`) || (Host(`example.org`) && Path(`/traefik`))"
在Unraid中,自定义主机名:
键:
traefik.http.routers.<service_name>.rule
值:
Host(`custom.example.com`)
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fd830565e-330b-4d2f-b216-b572f545000b%2Fbddb53fe-2b54-4a6e-ac2e-1319230161eb%2FUntitled.png?table=block&id=5605068b-d1f8-4acb-bc5f-f743997703e6&t=5605068b-d1f8-4acb-bc5f-f743997703e6&width=1226&cache=v2)
在Unraid中,使两个主机名匹配同一个服务:
键:
traefik.http.routers.<service_name>.rule
值:
Host(`app1.example.com`,`app2.example.com`)
在Traefik V3.x中:
值:
Host(`app1.example.com`) || Host(`app2.example.com`)
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fd830565e-330b-4d2f-b216-b572f545000b%2F2ebcccea-5422-49b5-80cf-e2ed4a6c4274%2FUntitled.png?table=block&id=255bcad3-794b-411e-80b9-771c49887fb2&t=255bcad3-794b-411e-80b9-771c49887fb2&width=1224&cache=v2)
可用的Rule
Rule | 说明 |
Headers(`key`, `value`) | 检查标题中是否定义了键 key ,键值为value |
HeadersRegexp(`key`, `regexp`) | 检查Headers中是否定义了键 key ,其值是否与正则表达式regexp 匹配 |
Host(`example.com`, ...) | 检查请求域(主机头值)是否存在于给定的域名之中。 |
HostHeader(`example.com`, ...) | 与 Host 一样,只是因为历史原因而存在。 |
HostRegexp(`example.com`, `{subdomain:[a-z]+}.example.com`, ...) | 匹配请求域。 |
Method(`GET`, ...) | 检查 request 方法是否是给定的方法之一( GET 、 POST 、 PUT 、 DELETE 、 PATCH 、 HEAD ) |
Path(`/path`, `/articles/{cat:[a-z]+}/{id:[0-9]+}`, ...) | 匹配精确的请求路径。 |
PathPrefix(`/products/`, `/articles/{cat:[a-z]+}/{id:[0-9]+}`) | 匹配请求前缀路径。 |
Query(`foo=bar`, `bar=baz`) | 匹配 Query String 参数。它接受key=value的序列。 |
ClientIP(`10.0.0.0/16`, `::1`) | 匹配请求客户端 IP 是给定的 IP/CIDR 之一。它接受 IPv4、 IPv6和 CIDR 格式。 |
启用 Authelia 服务器身份验证(需要安装Authelia)
Authelia对于Traefik来说是一个中间件,可以为Traefik代理的所有应用提供单点登录服务。在某些服务不具有可靠的身份认证功能,但又需要暴露在公网时非常有用。
对于Unraid,找到要使用Authelia保护的应用程序,进入模板后,单击“添加其他路径,端口,变量,标签或设备”。选择添加标签并按照下面的屏幕截图填写字段。
键:
traefik.http.routers.<service_name>.middlewares
值:
auth@file
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fd830565e-330b-4d2f-b216-b572f545000b%2Fdb84db7f-b8b8-46fc-946d-c49244421d15%2FUntitled.png?table=block&id=6c0c7a21-342f-4dd5-97a6-e19819fc8d1d&t=6c0c7a21-342f-4dd5-97a6-e19819fc8d1d&width=1231&cache=v2)
如果要启用Authelia来保护Traefik仪表板,则键需要改为
traefik.http.routers.api.middlewares
。 请勿将api替换为容器名称。
在应用重新部署后,再次访问应用时,将会看到Authelia的认证界面,认证通过后才会跳转到原来的WebUI。
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fd830565e-330b-4d2f-b216-b572f545000b%2Fb8575868-a490-4fb2-98af-621b4f10044d%2FUntitled.png?table=block&id=3f839736-10a8-4023-a1bd-e8f4c738ce02&t=3f839736-10a8-4023-a1bd-e8f4c738ce02&width=768&cache=v2)
🛠️ 手动配置
Traefik可以通过dockersocket发现其他容器的信息,如果某些服务没有使用docker,或者运行在外部,如路由器管理页面和其他电脑上运行的服务等,那么就需要手动配置来对外部应用进行反向代理。
File Provider
文件提供程序允许您在 YAML 或 TOML 文件中定义动态配置。
代理路由器管理页面
编辑文件
your/path/traefik/fileConfig.yml
:在配置文件中使用Rule
在我的使用环境中,homeassistant运行在openwrt路由器上,以保证不间断运行。
下面是我的手动配置,由于启用了Authelia,homeassistant的移动客户端访问时也会被认证服务器要求认证,所以使用了rule来区分Web访问和API访问。
📎 参考文章
有关Traefik安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
- 作者:Biliko
- 链接:https://biliko.net/article/traefik-part5
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章