Install Trafik As Reverse Proxy
Traefik 介绍
Traefik 是一款服务反向代理网关, 可从多种不同的基础设施架构中读取服务信息并完成请求转发
Traefik 将服务注册信息提供者定义为 Provider, 以下为 Traefik 当前支持的 Provider
- Docker
- Kubernetes IngressRoute
- Kubernetes Ingress
- Kubernetes Gateway API
- Consul Catalog
- Nomad
- ECS
- File
- Consul
- Etcd
- ZooKeeper
- Redis
- HTTP
Docker 安装 Traefik
使用 docker-compose 安装 Traefik
services:
traefik:
image: traefik
container_name: traefik
restart: unless-stopped
network_mode: host
command:
- --api=true
# - --accesslog=true
# - --log.level=INFO
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --providers.file.filename=/config/traefik.yaml
- --providers.file.watch=true
- --entrypoints.web.address=:80
- --entrypoints.web.http.redirections.entrypoint.to=websecure
- --entrypoints.web.http.redirections.entrypoint.scheme=https
- --entrypoints.websecure.address=:443
- --entrypoints.websecure.http.tls=true
- --entrypoints.websecure.http.tls.certresolver=dnspod
- --certificatesresolvers.dnspod.acme.dnschallenge=true
- --certificatesresolvers.dnspod.acme.dnschallenge.provider=dnspod
- --certificatesresolvers.dnspod.acme.email=xxx@gmail.com
- --certificatesresolvers.dnspod.acme.storage=/letsencrypt/acme.json
environment:
- DNSPOD_API_KEY=***************
volumes:
- ./config:/config
- ./letsencrypt:/letsencrypt
- /var/run/docker.sock:/var/run/docker.sock
命令行参数说明
参数 | 说明 |
---|---|
--api=true | 开启 API 与 Dashboard |
--accesslog=true | 开启访问日志 |
--log.level=INFO | 设置服务日志等级, 默认为 ERROR |
--providers.docker=true | 开启 Docker 后端支持 |
--providers.docker.exposedbydefault=false | 开启 Docker 自动端口转发 |
--providers.file.filename=/config/traefik.yaml | 开启文件配置支持 |
--providers.file.watch=true | 监听配置文件监听 |
--entrypoints.web.address=:80 | 监听80端口, 入口名为 web |
--entrypoints.web.http.redirections.entrypoint.to=websecure | web 入口请求重定向到 websecure |
--entrypoints.web.http.redirections.entrypoint.scheme=https | web 入口请求重定向为 https |
--entrypoints.websecure.address=:443 | 监听443端口, 入口名为 websecure |
--entrypoints.websecure.http.tls=true | websecure 入口开启 tls 加密 |
--entrypoints.websecure.http.tls.certresolver=dnspod | websecure 入口 tls 提供者为 dnspod |
--certificatesresolvers.dnspod.acme.dnschallenge=true | dnspod 开启 dnschallenge |
--certificatesresolvers.dnspod.acme.dnschallenge.provider=dnspod | dnschallenge 提供者为 dnspod |
--certificatesresolvers.dnspod.acme.email=xxx@gmail.com | 证书申请者邮箱 |
--certificatesresolvers.dnspod.acme.storage=/letsencrypt/acme.json | 证书保存位置 /letsencrypt/acme.json |
其他启动配置可以参考官方 CLI Reference
环境变量
变量 | 说明 |
---|---|
DNSPOD_API_KEY=*** | dnspod 密钥 |
Traefik 配置使用
Docker Provider
Traefik 可以读取服务在 labels 中的内容, 以下为一个实例
services:
blog:
# ...
labels:
- traefik.enable=true
- traefik.http.services.blog.loadbalancer.server.port=80
- traefik.http.middlewares.redirect-to-www.redirectregex.regex=^https://xilin.icu/(.*)
- traefik.http.middlewares.redirect-to-www.redirectregex.replacement=https://www.xilin.icu/$${1}
- traefik.http.routers.blog.rule=Host(`xilin.icu`)||Host(`www.xilin.icu`)
- traefik.http.routers.blog.entrypoints=websecure
- traefik.http.routers.blog.service=blog
- traefik.http.routers.blog.tls.certresolver=dnspod
- traefik.http.routers.blog.middlewares=redirect-to-www
标签说明
标签 | 说明 |
---|---|
traefik.enable=true | 开启 Traefik 转发 |
traefik.http.services.blog.loadbalancer.server.port=80 | 服务 blog 的向外暴露端口为80 |
traefik.http.middlewares.redirect-to-www.redirectregex.regex=^https://xilin.icu/(.*) | 设置中间件 redirect-to-www 的匹配规则 |
traefik.http.middlewares.redirect-to-www.redirectregex.replacement=https://www.xilin.icu/$${1} | 设置中间件 redirect-to-www 的重写逻辑 |
traefik.http.routers.blog.entrypoints=websecure | 路由 blog 的入口为 websecure 也就是443端口 |
traefik.http.routers.blog.service=blog | 路由 blog 的转发服务为 blog |
traefik.http.routers.blog.tls.certresolver=dnspod | 路由 blog 的证书解析为 dnspod |
traefik.http.routers.blog.middlewares=redirect-to-www | 路由 blog 使用中间件 redirect-to-www |
File Provider
通过 --providers.file.filename
指定了 File Provider 的路径, 因此可以通过配置文件增加对非 docker 服务的代理支持
http:
middlewares:
basic-auth:
basicAuth:
users:
- xxl:$apr1$Jk5NhCQT$4IMBP5aRjjacrKXBVvy.c0
routers:
dashboard:
entryPoints:
- websecure
middlewares:
- basic-auth
rule: Host(`traefik.xilin.icu`)
tls:
certResolver: dnspod
service: api@internal
zero:
entryPoints:
- websecure
rule: Host(`zero.xilin.icu`)||HostRegexp(`^.+\.zero\.xilin\.icu$`)
tls:
certResolver: dnspod
domains:
- main: "zero.xilin.icu"
sans:
- "*.zero.xilin.icu"
service: zero
zero:
loadBalancer:
servers:
- url: http://zero.lan:80
其他配置可参考官方实例