Trae 教程
Traefik 教程
Traefik(发音为“traffic”)是一个现代化的开源 HTTP 反向代理和负载均衡器,专为微服务和容器环境设计。它支持自动服务发现、动态配置和 Let’s Encrypt 自动 HTTPS 证书申请,非常适合与 Docker、Kubernetes 等容器编排工具集成。相比传统 Nginx,Traefik 的配置更简洁,通过 Docker 标签(labels)即可实现路由规则,无需手动重载配置。
本教程基于 Traefik v3.0(最新稳定版),聚焦 Docker 环境下的入门和使用。假设你已安装 Docker 和 Docker Compose。如果你是初学者,建议从官方文档起步。
一、Traefik 核心概念
- 入口点(EntryPoints):Traefik 监听的端口,如 HTTP 的 80 端口和 HTTPS 的 443 端口。
- 提供者(Providers):配置来源,如 Docker(自动发现容器)、文件或 Kubernetes。
- 路由器(Routers):匹配请求规则(如 Host: example.com),指向后端服务。
- 服务(Services):后端目标,如 Docker 容器或负载均衡组。
- 中间件(Middlewares):处理请求,如重定向 HTTP 到 HTTPS、添加认证。
- 动态配置:支持热加载,无需重启 Traefik。
二、安装 Traefik
- 使用 Docker Compose 快速启动:
创建一个docker-compose.yml
文件:
version: "3.8"
services:
traefik:
image: traefik:v3.0
container_name: traefik
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "8080:8080" # Dashboard 端口
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro # 监听 Docker 事件
- ./traefik.yml:/traefik.yml:ro # 静态配置文件
- ./acme.json:/acme.json # ACME 证书存储(需预创建空文件,chmod 600)
- ./dynamic.yml:/dynamic.yml:ro # 动态配置文件
command:
- --api.dashboard=true # 启用 Dashboard
- --providers.docker=true # 启用 Docker 提供者
- --providers.file.filename=/dynamic.yml # 加载动态配置
- --entrypoints.web.address=:80 # HTTP 入口
- --entrypoints.websecure.address=:443 # HTTPS 入口
- --certificatesresolvers.myresolver.acme.email=your@email.com # Let's Encrypt 配置
- --certificatesresolvers.myresolver.acme.storage=/acme.json
- --certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web
networks:
default:
name: traefik-net
- 预创建 acme.json:
touch acme.json && chmod 600 acme.json
(用于存储 SSL 证书)。
- 启动 Traefik:
docker compose up -d
访问 http://localhost:8080/dashboard/
查看 Dashboard(生产环境需添加认证)。
三、静态配置(traefik.yml)
静态配置定义入口点和提供者,示例:
entryPoints:
web:
address: ":80"
http:
redirections:
entryPoint:
to: websecure
scheme: https
permanent: true
websecure:
address: ":443"
http:
middlewares:
- secure-headers
api:
dashboard: true
providers:
docker:
exposedByDefault: false # 只暴露启用标签的容器
endpoint: "unix:///var/run/docker.sock"
file:
filename: "/dynamic.yml"
watch: true # 热加载
certificatesResolvers:
myresolver:
acme:
email: your@email.com
storage: /acme.json
httpChallenge:
entrypoint: web
- 这会自动将 HTTP 重定向到 HTTPS,并启用 Let’s Encrypt。
四、动态配置(dynamic.yml)
动态配置定义路由和中间件,支持热更新。示例:
http:
middlewares:
secure-headers:
headers:
frameDeny: true
sslRedirect: true
auth:
basicAuth:
users:
- "admin:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/" # 使用 htpasswd 生成
routers:
to-whoami:
rule: "Host(`whoami.example.com`)" # 路由规则
service: whoami
entryPoints:
- websecure
tls:
certResolver: myresolver # 自动 HTTPS
middlewares:
- auth # 添加认证
services:
whoami:
loadBalancer:
servers:
- url: "http://whoami:80" # 后端服务
- 修改后,Traefik 会自动加载,无需重启。
五、与 Docker 服务集成
在其他服务的 docker-compose.yml
中添加标签(labels)实现自动发现。示例:一个 whoami 服务。
version: "3.8"
services:
whoami:
image: traefik/whoami
container_name: whoami
networks:
- traefik-net
labels:
- "traefik.enable=true" # 启用 Traefik
- "traefik.http.routers.whoami.rule=Host(`whoami.example.com`)" # 路由规则
- "traefik.http.routers.whoami.entrypoints=websecure" # HTTPS 入口
- "traefik.http.routers.whoami.tls.certresolver=myresolver" # 自动证书
- "traefik.http.services.whoami.loadbalancer.server.port=80" # 后端端口
- 启动:
docker compose up -d
。 - 访问
https://whoami.example.com
(需配置 DNS 指向服务器 IP)。
六、进阶:结合其他工具
- 与 REST API:Traefik 可代理你的 REST API 服务(如 Node.js Express),通过标签配置路径路由,例如
PathPrefix(
/api)
。 - 与 Linux Cron:定时重载动态配置或检查证书:
#!/bin/bash
# check-cert.sh
docker exec traefik traefik certificates renew --certresolver=myresolver
添加到 crontab:0 2 * * * /bin/bash /path/to/check-cert.sh
(每天凌晨 2 点检查证书)。
- 与 Python/Selenium:在 Python 脚本中使用 Selenium 测试 Traefik 代理的 Web 服务,结合
tqdm
显示测试进度。 - Dashboard 认证:在动态配置中添加 Basic Auth 中间件,保护
/dashboard/
。
七、调试与常见问题
- 日志查看:
docker logs traefik
。 - 常见错误:
- 证书申请失败:检查 email 和域名解析。
- 服务未发现:确保容器在同一网络,并启用标签。
- 使用
console.log
等效:在 Docker 日志中用--log.level=DEBUG
输出详细日志。 - 性能优化:启用压缩中间件,限制速率。
八、总结
Traefik 通过 Docker 标签和动态配置简化了反向代理的部署,特别适合容器化环境。从简单 Docker Compose 开始,逐步添加 HTTPS 和中间件。官方文档(https://doc.traefik.io/traefik/)和中文社区(如 Traefik 中国)是最佳资源。
如果需要特定场景(如 Kubernetes 集成、v2 到 v3 迁移)或代码示例,请提供更多细节!