Traefik动态反向代理:香港服务器Docker自动服务发现 + HTTPS + 中间件完整配置

Traefik动态反向代理:香港服务器Docker自动服务发现 + HTTPS + 中间件完整配置

在 Docker 环境中,每次部署新服务都要手动修改 Nginx 配置并 reload,既麻烦又容易出错。Traefik 是专为容器化环境设计的反向代理,通过读取 Docker 标签(Labels)自动发现新服务并配置路由——你部署一个新容器,Traefik 在秒级内自动完成路由注册和 SSL 证书申请,无需任何手动操作。


一、Traefik vs Nginx 的核心差异

插件系统,运行时加载

维度NginxTraefik
配置方式静态文件,需 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 更合适的选择。

Telegram