本页目录

反向代理与负载均衡

反向代理不只是"转发请求"——TLS 终结、缓存、压缩、限流、健康检查、蓝绿发布,现代架构的流量管理全集中在这一层。nginx/Caddy/HAProxy 的配置哲学各有不同。

概述

反向代理是服务器端的门面——它接收所有外部请求,做 TLS 终止、SNI 路由、限流和日志,将请求转发到后端服务。负载均衡器将请求按策略(轮询/最少连接/IP hash)分发到多个后端实例,提高可用性和吞吐。Caddy 以自动 TLS(ACME + Let's Encrypt 零配置)著称,nginx/HAProxy 以高性能和丰富的 L4/L7 功能主导企业环境。理解反向代理是部署任何互联网服务的前提。

反向代理 vs 正向代理

正向代理 vs 反向代理:谁在代理谁

正向代理 Client Proxy Target 例:本机 mihomo :7890 → 代理浏览器流量到国外

反向代理 Client grafana.liz6.com (看起来是 Target) 其实是 Caddy:443 (Proxy) 127.0.0.1:3000 (Backend) Client 以为自己直接连的是 Grafana,不知道它在 localhost 上

正向代理帮 Client 访问外网、对 Target 隐藏 Client;反向代理反过来, 对 Client 伪装成 Target 本身,把真正的 Backend 藏在身后。

Caddy 配置

grafana.liz6.com {
    reverse_proxy 127.0.0.1:3000 {
        header_up Host {upstream_hostport}
        header_up X-Real-IP {remote_host}
        header_up X-Forwarded-For {remote_host}
        header_up X-Forwarded-Proto {scheme}
    }
}

chat.liz6.com {
    reverse_proxy 127.0.0.1:3001
}

反向代理的职责:

  1. TLS Termination: Caddy 做 TLS → 后端 HTTP → 后端不需要处理 TLS
  2. SNI Routing: 同一 port (443) 根据 SNI 路由到不同后端
  3. Request rewriting: 添加 X-Forwarded-*, 修改 path/headers
  4. Rate Limiting: per-client or per-endpoint rate limiting
  5. Access Log: 集中日志 (Caddy JSON access log)

L4 vs L7 Load Balancing

L4 vs L7:解不解析 HTTP,决定路由能力和速度 L4 · TCP(不解析 HTTP) nginx stream module / HAProxy mode tcp 不解析 HTTP → 只看 TCP payload → 但非常快 不能按 URL / Host header 路由 优势:非常快 适合 raw TCP 转发、WebSocket pass-through L7 · HTTP(解析并按内容路由) nginx http module / HAProxy mode http / Caddy 解析 HTTP → 可按 Host / URL / Header / Cookie / Method 路由 可做 content-based 限流、请求检查 代价:略慢 HTTP parsing overhead 选 L4 还是 L7,看要不要按内容路由:纯转发、WebSocket 透传用 L4 求快; 要按 Host / Path / Header 分流、做内容级限流,就必须上 L7。

负载均衡算法

Round Robin:         逐 backend 轮询
Least Connections:   选 conns 最少的 backend (只对 L7 有效)
Random:              随机
IP Hash:             同一 client IP → 同一 backend → sticky
Consistent Hash:     hash ring → backend 增减时只有 1/N 重新 hash
Weighted:            backend 权重 → weight=3 多 3x 流量

Health Check:
  passive: 从实际 request 的 failure 检测 (max_fails=N)
  active:  定期 GET /health → 期望 200 → 标记为 down on failure
  slow_start: backend 恢复后逐步增加流量 (避免 flood)

参考

  • Caddy: caddyserver.com/docs/caddyfile/directives/reverse_proxy
  • nginx: nginx.org/en/docs/http/ngx_http_upstream_module.html
  • HAProxy: haproxy.org

Keywords: reverse proxy, SNI routing, L4/L7 LB, health check, sticky session, rate limiting, Caddy