HiHuo
首页
博客
手册
工具
关于
首页
博客
手册
工具
关于
  • 代理技术全栈手册

    • 代理技术全栈手册 - HiHuo
    • 原理篇

      • 第01章 代理是什么:正向 / 反向 / 透明 / 隧道的统一模型
      • 第02章 代理与网络层级:L3 / L4 / L5 / L7 在哪里截断流量
      • 第03章 一个请求穿过代理的一生:连接生命周期全景
    • 协议篇

      • 第04章 HTTP 代理协议:绝对 URI、CONNECT 隧道、转发头与连接池
      • 第05章 HTTPS 与 TLS 代理:终止 / 透传 / MITM / SNI / mTLS
      • 第06章 SOCKS 协议:SOCKS4/4a/5 与 UDP ASSOCIATE 报文级解析
      • 第07章 HTTP/2、gRPC 与 HTTP/3(QUIC) 代理的挑战
      • 第08章 代理自动配置:PAC / WPAD / 系统代理 / NO_PROXY
    • 层级与转发篇

      • 第09章 L4 代理:TCP/UDP 转发与连接级负载均衡
      • 第10章 L7 代理:协议感知与基于内容的路由
      • 第11章 透明代理:iptables REDIRECT/DNAT、TPROXY 与 eBPF 劫持
      • 第12章 数据搬运的艺术:splice / sendfile / 零拷贝 / io_uring
    • 组件横评篇

      • 第13章 Nginx / OpenResty:反向代理、upstream 与 Lua 可编程
      • 第14章 HAProxy:L4/L7、ACL、健康检查与 stick table
      • 第15章 Envoy:xDS 动态配置与 filter chain,为何是云原生数据面
      • 第16章 Traefik / Caddy:自动服务发现与自动 HTTPS
      • 第17章 Squid 与正向/缓存代理:企业出网、缓存与审计
      • 第18章 mitmproxy:抓包、改包、脚本化调试
      • 第19章 内网穿透与隧道:frp / gost / SSH 隧道 / ngrok
      • 第20章 科学上网生态的技术原理(技术中立)
    • 多语言手写篇

      • 第21章 Go:100 行手写 HTTP/CONNECT + SOCKS5 代理
      • 第22章 Rust:基于 tokio 的高性能 TCP 代理
      • 第23章 Python:asyncio 实现,适合调试与脚本
      • 第24章 C:epoll 裸写与零拷贝,及语言选型对比
    • 容器与K8s篇

      • 第25章 Docker 里的代理:HTTP_PROXY、build/pull 与 daemon 配置
      • 第26章 Sidecar 与流量劫持:Istio init-container 的 iptables 原理
      • 第27章 Ingress 与南北流量:Ingress-nginx 与 Gateway API
      • 第28章 Egress 与出网治理:出口网关、registry mirror、审计
      • 第29章 Service Mesh 数据面:Envoy Sidecar 全链路
    • 进阶篇

      • 第30章 可编程代理:Lua / Wasm / eBPF / xDS,代理的"软件定义"
      • 第31章 性能调优:并发模型、连接池、超时与重试、压测
      • 第32章 排错决策树:502 / 504 / 握手失败 / 环路 / 泄漏
      • 第33章 代理安全:开放代理、SSRF、凭证泄漏与攻击面
    • 底层机制篇

      • 第34章 代理的背压与流控:一个代理最难的部分
      • 第35章 socket 与 TCP 状态机:半关闭、超时、连接生命周期
      • 第36章 HTTP/2 帧、流控与 HPACK:h2 代理的内部机制
      • 第37章 负载均衡算法推导与韧性状态机
      • 第38章 Capstone:把玩具代理改造成生产级骨架
    • 综合实战篇

      • 第39章 企业多跳转发链:拓扑、协议矩阵与贯穿性难题
      • 第40章 端到端实战:把 6 类流量全代理通
      • 第41章 更刁钻的流量:gRPC、长轮询、WebRTC、大文件、双向流
      • 第42章 可落地完整参考实现:一套能跑的多协议转发栈
    • 附录

      • 附录 A:代理协议报文速查(HTTP / SOCKS / PAC / PROXY protocol)
      • 附录 B:组件选型决策树
      • 附录 C:抓包与命令速查

第16章 Traefik / Caddy:自动服务发现与自动 HTTPS

学习目标

  • 理解"自动化优先"这类现代代理的卖点:零配置发现、自动证书
  • 掌握 Traefik 从 Docker/K8s 标签自动发现路由的机制(容器加标签即上线)
  • 掌握 Caddy 默认自动 HTTPS 的便利与原理
  • 想清楚它们与 Nginx/HAProxy/Envoy 的取舍:便利 vs 极致控制

前置知识

  • 第10章 L7 代理、第05章 TLS / ACME
  • 第13章 Nginx、第15章 Envoy(对照配置哲学)

原理

一类新代理:把"自动化"当第一目标

Nginx/HAProxy/Envoy 强在控制力,但都要你显式写后端。在容器时代,实例频繁增减,"手写后端"很痛。Traefik 和 Caddy 代表另一种哲学:

能自动就别让人配。 后端从容器编排里自动发现,证书从 Let's Encrypt 自动申请续期,配置能省则省。

代价是放弃一部分极致控制和性能调优空间,换取开发者体验。它们特别适合动态容器环境和中小团队/个人站点。

Traefik:容器标签即路由

Traefik 的核心是 Provider(提供者)——它主动连接你的基础设施(Docker、Kubernetes、Consul、文件),实时发现服务并自动生成路由。

         Provider 自动发现
  ┌─────────────────────────────────────────────┐
  │ Docker / K8s / Consul ──监听变化──▶ Traefik   │
  │  容器带标签 traefik.http.routers.x.rule=...   │
  │           ↓ 自动生成                          │
  │ EntryPoints → Routers → Middlewares → Services│
  │  (监听端口)   (匹配规则)   (中间件链)   (后端)  │
  └─────────────────────────────────────────────┘

Traefik 的四个概念:

  • EntryPoints:监听入口(如 :80、:443)
  • Routers:匹配规则(Host()、PathPrefix() 等)→ 指向 Service
  • Middlewares:中间件链(认证、限流、改写、重试),类似 Envoy 的 filter
  • Services:后端(自动从 Provider 发现实例)

杀手锏:在 Docker 里,给容器贴几个标签就自动有了路由,无需改 Traefik 配置、无需 reload:

labels:
  - "traefik.http.routers.myapp.rule=Host(`app.example.com`)"
  - "traefik.http.services.myapp.loadbalancer.server.port=8080"

容器一起,Traefik 立刻发现并开始代理;容器一停,路由自动撤销。这种"动态发现"在精神上类似 Envoy 的 xDS(第15章),但面向应用开发者而非平台。

Caddy:默认自动 HTTPS

Caddy 的最大卖点:开箱即用的自动 HTTPS。你只要写个域名,它就自动:

  1. 向 Let's Encrypt/ZeroSSL 申请证书(ACME 协议)
  2. 完成 HTTP-01 或 TLS-ALPN-01 或 DNS-01 验证
  3. 自动续期、自动 OCSP stapling、自动 HTTP→HTTPS 跳转

配置极简(Caddyfile):

app.example.com {
    reverse_proxy localhost:8080
}

两行——一个带自动 HTTPS 的反向代理就好了。证书申请、续期、跳转全自动,这是 Nginx 要配一堆 + certbot 才能达到的效果。

ACME 自动证书的原理与前提

Traefik 和 Caddy 的自动 HTTPS 都基于 ACME 协议(第05章 的证书话题,详见 k8sLab · cert-manager/ACME)。关键前提:

  • HTTP-01 验证:需要 80 端口可被 Let's Encrypt 访问(公网可达、DNS 指向本机)
  • DNS-01 验证:需要 DNS provider API 权限(适合内网/泛域名)
  • 限流:Let's Encrypt 有签发频率限制,反复重启申请会被限流(用 staging 环境调试)

横向取舍

维度Nginx/HAProxyEnvoyTraefikCaddy
配置哲学静态显式动态(xDS)、平台向自动发现、应用向极简、自动 HTTPS
自动 HTTPS需 certbot需控制面✅ 内置✅ 默认开
服务发现手写/模块xDS✅ Provider基础
极致性能/控制✅ 最强✅ 强中中
上手难度中高低最低
最适合通用/高性能Mesh/平台动态容器环境个人/小团队/自动证书

一句话选型:要极致控制用 Nginx/HAProxy;要平台级动态用 Envoy;容器里图省事用 Traefik;个人站点要自动 HTTPS 用 Caddy。


️ 实现 / 命令

实验一:Traefik + Docker 标签自动路由

# docker-compose.yml
services:
  traefik:
    image: traefik:v3.0
    command:
      - "--providers.docker=true"               # 开启 Docker 自动发现
      - "--entrypoints.web.address=:80"
      - "--api.dashboard=true"
    ports: ["80:80", "8080:8080"]               # 8080 = dashboard
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro

  whoami:
    image: traefik/whoami
    labels:
      - "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)"
      - "traefik.http.services.whoami.loadbalancer.server.port=80"
docker compose up -d
curl -H "Host: whoami.localhost" http://localhost/   # 自动路由到 whoami,无需改 Traefik 配置
# 再 scale:docker compose up -d --scale whoami=3 → Traefik 自动负载均衡到 3 个

实验二:Caddy 两行实现自动 HTTPS 反代

# /etc/caddy/Caddyfile
app.example.com {
    reverse_proxy localhost:8080
}
caddy run --config /etc/caddy/Caddyfile
# 首次访问 https://app.example.com 时,Caddy 已自动申请好证书
curl -sI https://app.example.com | head -1     # HTTP/2 200,证书由 Let's Encrypt 自动签发

实验三:Caddy 调试用 staging(避免被 Let's Encrypt 限流)

{
    # 全局选项:用 Let's Encrypt staging 环境调试(证书不受信但不限流)
    acme_ca https://acme-staging-v02.api.letsencrypt.org/directory
}
app.example.com {
    reverse_proxy localhost:8080
}

排错

现象根因解决
Traefik 没发现容器标签写错 / 没挂 docker.sock核对 traefik.http.routers.* 标签、socket 挂载
路由 404rule 域名/路径不匹配看 dashboard 里 router 状态
自动 HTTPS 申请失败80 端口不可达 / DNS 没指向用 DNS-01,或确保公网可达 80
反复重启证书申请被限流Let's Encrypt 频率限制用 staging 调试,证书会持久化别删
Caddy 内网域名无法 HTTP-01内网不可达公网验证配 DNS-01 provider 或内部 CA
性能/精细控制不够这类代理本就偏自动化极致需求换 Nginx/Envoy

本章小结

  • Traefik/Caddy 代表"自动化优先"哲学:自动发现后端、自动申请 HTTPS,用便利换部分控制力。
  • Traefik 靠 Provider 从 Docker/K8s 标签自动发现路由,容器加标签即上线,精神上类 xDS 但面向应用开发者。
  • Caddy 默认自动 HTTPS(ACME),两行配置就是带证书的反向代理;调试用 staging 防限流。
  • 选型:极致控制 Nginx/HAProxy、平台动态 Envoy、容器省事 Traefik、个人自动证书 Caddy。

至此云原生反向代理四件套(Nginx/HAProxy/Envoy/Traefik-Caddy)讲完。下一章 第17章 Squid 转向正向代理世界——企业出网、缓存与审计的经典主力。

Prev
第15章 Envoy:xDS 动态配置与 filter chain,为何是云原生数据面
Next
第17章 Squid 与正向/缓存代理:企业出网、缓存与审计