Traefik是现代云原生反向代理和负载均衡器,原生支持Docker、Kubernetes等服务发现机制。与Nginx需要手动修改配置文件不同,Traefik通过监听容器事件自动更新路由规则,无需重启即可生效。Docker自动化部署场景中,Traefik的自动HTTPS和动态配置能力大幅降低运维成本,成为替代Nginx+Certbot方案的热门选择。
Traefik架构与核心概念解析
Traefik的数据模型由四个核心概念组成:Entrypoints(入口点)定义Traefik监听的网络端口;Routers(路由器)将请求匹配到对应的后端服务;Services(服务)定义后端的负载均衡目标;Middlewares(中间件)在请求转发前后执行处理逻辑,如认证、限流、重写等。
Traefik的配置分为静态配置和动态配置。静态配置在启动时加载,定义入口点、Provider(服务发现来源)和日志等基础设置;动态配置在运行时自动更新,定义路由、服务和中间件。
Docker Compose部署Traefik与自动HTTPS
使用Docker Compose部署Traefik是最常见的方式。以下配置部署一个开启自动HTTPS的Traefik实例,通过Let’s Encrypt自动获取和续期SSL证书:
# docker-compose.yml
services:
traefik:
image: traefik:v3.1
command:
# 静态配置
- --api.dashboard=true
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
# HTTP自动跳转HTTPS
- --entrypoints.web.http.redirections.entrypoint.to=websecure
- --entrypoints.web.http.redirections.entrypoint.scheme=https
# Let's Encrypt ACME配置
- --certificatesresolvers.letsencrypt.acme.email=admin@example.com
- --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json
- --certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web
# 日志
- --log.level=INFO
- --accesslog=true
ports:
- "80:80"
- "443:443"
volumes:
# 挂载Docker socket以监听容器事件
- /var/run/docker.sock:/var/run/docker.sock:ro
# 证书持久化存储
- traefik-certs:/letsencrypt
networks:
- webgateway
restart: unless-stopped
# 示例后端服务
whoami:
image: traefik/whoami
labels:
- traefik.enable=true
# HTTPS路由
- traefik.http.routers.whoami.rule=Host(`whoami.example.com`)
- traefik.http.routers.whoami.entrypoints=websecure
- traefik.http.routers.whoami.tls.certresolver=letsencrypt
# 服务端口
- traefik.http.services.whoami.loadbalancer.server.port=80
networks:
- webgateway
volumes:
traefik-certs:
networks:
webgateway:
external: true
上面的配置中,关键点说明:
providers.docker.exposedbydefault=false确保默认不暴露所有容器,只有添加了traefik.enable=true标签的容器才被Traefik识别。entrypoints.web.http.redirections将所有HTTP请求自动跳转到HTTPS。certresolver=letsencrypt指定使用Let’s Encrypt自动获取证书,Traefik通过HTTP-01挑战验证域名所有权。
部署前需要创建外部网络:docker network create webgateway。部署后,当容器带有正确的Host标签启动时,Traefik自动创建路由并申请SSL证书,整个过程无需手动操作。
中间件配置:限流与BasicAuth认证
Traefik中间件以链式方式处理请求,多个中间件可以组合使用。以下通过Docker labels配置限流和BasicAuth认证:
services:
api-service:
image: myapp:latest
labels:
- traefik.enable=true
- traefik.http.routers.api.rule=Host(`api.example.com`) && PathPrefix(`/v1`)
- traefik.http.routers.api.entrypoints=websecure
- traefik.http.routers.api.tls.certresolver=letsencrypt
- traefik.http.routers.api.middlewares=rate-limit,auth
# 服务端口
- traefik.http.services.api.loadbalancer.server.port=8080
# 限流中间件:每秒平均10个请求,突发最多20个
- traefik.http.middlewares.rate-limit.ratelimit.average=10
- traefik.http.middlewares.rate-limit.ratelimit.burst=20
# BasicAuth认证
- traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$xyz$$encodedpassword
BasicAuth密码使用htpasswd工具生成:htpasswd -nbB admin yourpassword。注意在YAML中$需要转义为$$。
负载均衡与健康检查配置
多个容器实例提供同一服务时,Traefik自动进行负载均衡。通过Docker Compose的deploy.replicas或启动多个容器实例实现水平扩展,Traefik自动识别新增实例:
services:
webapp:
image: webapp:latest
deploy:
replicas: 3
labels:
- traefik.enable=true
- traefik.http.routers.webapp.rule=Host(`app.example.com`)
- traefik.http.routers.webapp.entrypoints=websecure
- traefik.http.routers.webapp.tls.certresolver=letsencrypt
- traefik.http.services.webapp.loadbalancer.server.port=3000
# 负载均衡策略:轮询(默认)或加权
- traefik.http.services.webapp.loadbalancer.server.scheme=http
# 健康检查:每10秒检查一次,超时3秒
- traefik.http.services.webapp.loadbalancer.healthcheck.path=/health
- traefik.http.services.webapp.loadbalancer.healthcheck.interval=10s
- traefik.http.services.webapp.loadbalancer.healthcheck.timeout=3s
# 粘性会话(可选)
- traefik.http.services.webapp.loadbalancer.sticky.cookie=true
- traefik.http.services.webapp.loadbalancer.sticky.cookie.name=app_session
文件配置方式与动态更新
对于非Docker环境或需要更精细控制路由的场景,使用文件Provider以YAML格式定义动态配置。Traefik监视文件变化,修改后自动热加载,无需重启:
# traefik-dynamic.yml
http:
routers:
dashboard:
rule: Host(`traefik.example.com`)
entrypoints:
- websecure
service: api@internal
tls:
certresolver: letsencrypt
middlewares:
- auth
grafana:
rule: Host(`grafana.example.com`)
entrypoints:
- websecure
service: grafana-service
tls:
certresolver: letsencrypt
services:
grafana-service:
loadBalancer:
servers:
- url: http://192.168.1.50:3000
- url: http://192.168.1.51:3000
healthCheck:
path: /api/health
interval: 10s
timeout: 3s
middlewares:
auth:
basicAuth:
users:
- "admin:$apr1$xyz$encodedpassword"
secure-headers:
headers:
sslRedirect: true
stsSeconds: 31536000
stsIncludeSubdomains: true
frameDeny: true
contentTypeNosniff: true
browserXssFilter: true
静态配置中启用文件Provider:
# traefik.yml (静态配置)
entryPoints:
web:
address: :80
websecure:
address: :443
providers:
file:
filename: /etc/traefik/traefik-dynamic.yml
watch: true
certificatesResolvers:
letsencrypt:
acme:
email: admin@example.com
storage: /letsencrypt/acme.json
httpChallenge:
entryPoint: web
监控告警集成与Prometheus指标
Traefik内置Prometheus指标导出,开启后可在Grafana中监控流量、响应时间和错误率。静态配置中添加:
metrics:
prometheus:
addEntryPointsLabels: true
addServicesLabels: true
addRoutersLabels: true
entryPoint: web
关键的监控指标包括traefik_http_requests_total(请求总数)、traefik_http_request_duration_seconds(请求延迟分布)和traefik_service_requests_total(按服务统计请求量)。在Prometheus中配置告警规则,当错误响应率超过阈值或证书即将过期时触发告警通知。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/traefik-fan-xiang-dai-li-pei-zhi-shi-zhan-zi-dong-https-yu/