Traefik动态反向代理:香港服务器Docker自动服务发现 + HTTPS + 中间件完整配置
在 Docker 环境中,每次部署新服务都要手动修改 Nginx 配置并 reload,既麻烦又容易出错。Traefik 是专为容器化环境设计的反向代理,通过读取 Docker 标签(Labels)自动发现新服务并配置路由——你部署一个新容器,Traefik 在秒级内自动完成路由注册和 SSL 证书申请,无需任何手动操作。
一、Traefik vs Nginx 的核心差异
插件系统,运行时加载
| 维度 | Nginx | Traefik |
|---|---|---|
| 配置方式 | 静态文件,需 reload | 动态,容器标签自动生效 |
| SSL 证书 | 需配合 certbot | 内置 ACME,自动申请续期 |
| Docker 集成 | 手动配置 | 原生自动发现 |
| 性能 | 极高 | 高(略低于 Nginx) |
| 中间件 | 模块化,需编译 | |
| 监控面板 | 第三方 | 内置 Dashboard |
| 适合场景 | 静态配置、极高性能 | Docker 动态环境、快速迭代 |
二、Traefik 核心概念
<code">
EntryPoints(入口点):Traefik 监听的端口
├── web: :80(HTTP)
└── websecure: :443(HTTPS)
Routers(路由器):匹配请求并决定发往哪个服务
├── 规则:Host(`app.yourdomain.com`) && PathPrefix(`/api`)
└── 中间件链:限流 → Basic Auth → 转发
Middlewares(中间件):请求/响应处理
├── Rate Limiting(限流)
├── BasicAuth(基础认证)
├── Headers(安全头)
└── Redirect(重定向)
Services(服务):实际处理请求的后端
└── LoadBalancer → 容器实例
Providers(提供者):配置来源
├── Docker(读取容器标签)
└── File(静态配置文件)
三、部署 Traefik(Docker Compose)
<code"># /opt/traefik/docker-compose.yml
version: '3.8'
services:
traefik:
image: traefik:v3.1
container_name: traefik
restart: unless-stopped
command:
# 全局设置
- "--global.checkNewVersion=false"
- "--global.sendAnonymousUsage=false"
# 日志
- "--log.level=INFO"
- "--accesslog=true"
# API 和 Dashboard
- "--api.dashboard=true"
- "--api.insecure=false" # 通过路由访问 Dashboard,不直接暴露 8080
# 入口点
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--entrypoints.web.http.redirections.entrypoint.to=websecure" # 强制 HTTPS
# Let's Encrypt
- "--certificatesresolvers.le.acme.tlschallenge=true"
- "--certificatesresolvers.le.acme.email=admin@yourdomain.com"
- "--certificatesresolvers.le.acme.storage=/certificates/acme.json"
# Docker Provider
- "--providers.docker=true"
- "--providers.docker.network=traefik-net"
- "--providers.docker.exposedbydefault=false" # 默认不暴露,需手动开启
# 文件 Provider(静态服务配置)
- "--providers.file.directory=/config"
- "--providers.file.watch=true"
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /opt/traefik/certificates:/certificates
- /opt/traefik/config:/config
networks:
- traefik-net
labels:
# Dashboard 路由(只允许内网访问)
- "traefik.enable=true"
- "traefik.http.routers.dashboard.rule=Host(`traefik.yourdomain.com`)"
- "traefik.http.routers.dashboard.entrypoints=websecure"
- "traefik.http.routers.dashboard.tls.certresolver=le"
- "traefik.http.routers.dashboard.service=api@internal"
- "traefik.http.routers.dashboard.middlewares=dashboard-auth"
- "traefik.http.middlewares.dashboard-auth.basicauth.users=admin:$$apr1$$xxxxx"
networks:
traefik-net:
external: true<code"># 创建共享网络和证书存储
docker network create traefik-net
mkdir -p /opt/traefik/{certificates,config}
touch /opt/traefik/certificates/acme.json
chmod 600 /opt/traefik/certificates/acme.json
cd /opt/traefik && docker compose up -d四、自动服务发现(通过 Docker Labels)
<code"># 示例:部署 FastAPI 应用,Traefik 自动配置路由和 SSL
# docker-compose.yml
version: '3.8'
networks:
traefik-net:
external: true
services:
myapi:
image: myapi:latest
container_name: myapi
restart: unless-stopped
networks:
- traefik-net
labels:
# 告诉 Traefik 处理此容器
- "traefik.enable=true"
# 路由规则:匹配域名
- "traefik.http.routers.myapi.rule=Host(`api.yourdomain.com`)"
# 使用 HTTPS 入口点
- "traefik.http.routers.myapi.entrypoints=websecure"
# 使用 Let's Encrypt 证书
- "traefik.http.routers.myapi.tls.certresolver=le"
# 容器内部端口(无需 ports 映射!)
- "traefik.http.services.myapi.loadbalancer.server.port=8000"
# 应用中间件
- "traefik.http.routers.myapi.middlewares=rate-limit,security-headers"<code"># 部署后 Traefik 在 30 秒内自动: # 1. 检测到新容器的标签 # 2. 创建路由规则(api.yourdomain.com → myapi:8000) # 3. 向 Let's Encrypt 申请 api.yourdomain.com 的 SSL 证书 # 4. 完成 HTTPS 路由配置 # 无需任何手动操作!
五、中间件配置
<code"># /opt/traefik/config/middlewares.yml(文件 Provider 的静态配置)
http:
middlewares:
# 限流中间件(每个 IP 每秒 10 个请求)
rate-limit:
rateLimit:
average: 10
burst: 20
period: 1s
sourceCriterion:
ipStrategy:
depth: 1
# 安全响应头
security-headers:
headers:
stsSeconds: 31536000
stsIncludeSubdomains: true
contentTypeNosniff: true
browserXssFilter: true
frameDeny: true
customResponseHeaders:
Server: "" # 隐藏服务器信息
# Basic Auth(密码用 htpasswd 生成)
basic-auth:
basicAuth:
users:
- "admin:$apr1$xxx$yyy" # htpasswd -nb admin password
# IP 白名单
ip-whitelist:
ipWhiteList:
sourceRange:
- "127.0.0.1/32"
- "10.0.0.0/8"
# 请求压缩
compress:
compress:
minResponseBodyBytes: 1024六、多路径路由(同域名不同路径)
<code"># 同一域名下,不同路径转发到不同服务
# yourdomain.com/api/* → FastAPI
# yourdomain.com/* → WordPress
services:
wordpress:
labels:
- "traefik.enable=true"
- "traefik.http.routers.wp.rule=Host(`yourdomain.com`)"
- "traefik.http.routers.wp.priority=1" # 低优先级(匹配所有)
- "traefik.http.routers.wp.entrypoints=websecure"
- "traefik.http.routers.wp.tls.certresolver=le"
- "traefik.http.services.wp.loadbalancer.server.port=80"
fastapi:
labels:
- "traefik.enable=true"
- "traefik.http.routers.api.rule=Host(`yourdomain.com`) && PathPrefix(`/api`)"
- "traefik.http.routers.api.priority=10" # 高优先级(先匹配)
- "traefik.http.routers.api.entrypoints=websecure"
- "traefik.http.routers.api.tls.certresolver=le"
- "traefik.http.services.api.loadbalancer.server.port=8000"
# 去掉路径前缀再转发(/api/users → /users)
- "traefik.http.middlewares.strip-api.stripprefix.prefixes=/api"
- "traefik.http.routers.api.middlewares=strip-api"七、Traefik Dashboard 使用
<code"> 访问 https://traefik.yourdomain.com Dashboard 显示: ├── 路由列表(所有 Router 的状态和规则) ├── 服务列表(后端服务健康状态) ├── 中间件列表 └── 实时流量指标(请求率、错误率、响应时间) 常见问题排查: - 路由未生效 → 检查容器是否在 traefik-net 网络 - SSL 申请失败 → 检查域名 A 记录是否指向服务器 - 500 错误 → 检查 Logs 中的 access log
八、总结
Traefik 最大的价值在于 Docker 动态环境下的自动化:新服务部署即自动路由,SSL 证书自动申请,中间件统一管理。香港服务器上同时运行 10+ Docker 服务时,Traefik 的管理效率远超手动维护 Nginx 配置文件。对于频繁迭代、多服务并行的出海 SaaS 项目,Traefik 是比 Nginx 更合适的选择。