展开代码┌─────────────────────────────────────────────────────────────────┐ │ 正向代理(Forward Proxy) │ │ 客户端 ──→ 代理服务器 ──→ 目标服务器(Google/YouTube等) │ │ ↑ ↑ ↑ │ │ 我知道代理 我知道客户端 我不知道真实客户端 │ │ 我要访问外网 我要替它访问 我只看到代理IP │ └─────────────────────────────────────────────────────────────────┘ 用途:翻墙、匿名、缓存加速 ┌─────────────────────────────────────────────────────────────────┐ │ 反向代理(Reverse Proxy) │ │ 客户端 ──→ 代理服务器 ──→ 后端服务器集群(Web/App/DB) │ │ ↑ ↑ ↑ │ │ 我只知道域名 我知道所有后端 我不知道真实用户 │ │ 访问example.com 我要分发请求 我只看到代理IP │ └─────────────────────────────────────────────────────────────────┘ 用途:负载均衡、安全防护、SSL终结
核心区别:正向代理代理的是客户端,反向代理代理的是服务器。
展开代码OSI七层模型中的反向代理: ┌─────────────┐ ← 客户端(浏览器/curl) │ 应用层 │ HTTP/HTTPS请求 ├─────────────┤ │ 表示层 │ ├─────────────┤ │ 会话层 │ ├─────────────┤ │ 传输层 │ ← L4负载均衡(HAProxy/Envoy TCP模式)← 这里也可做代理 ├─────────────┤ │ 网络层 │ ├─────────────┤ │ 数据链路层 │ ├─────────────┤ │ 物理层 │ └─────────────┘ ← 反向代理服务器(Nginx/Caddy/Traefik) ↓ 分发到后端集群(Web服务器集群)
| 能力维度 | 技术实现 | 业务价值 |
|---|---|---|
| 流量调度 | 轮询/加权/最少连接/IP哈希 | 水平扩展、消除单点 |
| 安全隔离 | 隐藏后端IP、WAF、限流 | 防御DDoS、SQL注入 |
| SSL终结 | TLS卸载、证书管理 | 后端专注业务、简化证书部署 |
| 缓存加速 | 静态缓存、边缘缓存 | 降低后端负载、提升响应速度 |
| 协议转换 | HTTP/2、gRPC、WebSocket | 统一入口协议、后端灵活选型 |
| 可观测性 | 日志、指标、链路追踪 | 故障定位、性能优化 |
| 工具 | 诞生年份 | 核心优势 | 典型场景 | 性能量级 |
|---|---|---|---|---|
| Nginx | 2004 | 事件驱动、配置灵活、生态庞大 | Web服务器+反向代理+缓存 | 10万+并发 |
| Apache httpd | 1995 | 模块丰富、.htaccess灵活 | 传统LAMP、动态内容 | 1万+并发 |
| HAProxy | 2000 | TCP/HTTP双栈、极致性能、稳定 | 金融级负载均衡入口 | 10万+并发 |
性能实测对比(相同硬件:4核8G):
展开代码测试条件:100字节响应,Keep-Alive,1000并发连接 Nginx: 120,000 RPS,内存占用 150MB HAProxy: 135,000 RPS,内存占用 80MB Apache: 45,000 RPS,内存占用 400MB Caddy: 95,000 RPS,内存占用 200MB(自动HTTPS开销)
展开代码# Docker Compose 自动发现示例 version: '3' services: traefik: image: traefik:v2.10 command: - "--api.insecure=true" - "--providers.docker=true" - "--entrypoints.web.address=:80" volumes: - /var/run/docker.sock:/var/run/docker.sock whoami: image: traefik/whoami labels: - "traefik.http.routers.whoami.rule=Host(`whoami.example.com`)" - "traefik.http.services.whoami.loadbalancer.server.port=80"
核心特性:
展开代码# 完整生产配置只需这几行 example.com reverse_proxy localhost:8080 basicauth { admin $2a$14$Zkx19XLiW6VYouLHR5NmfOFU0z2GTNmpkT/5qqR7hx4IjWJPDhjvG } encode gzip file_server /static/*
一行命令启动HTTPS:
展开代码# 自动申请Let's Encrypt证书,80/443端口 caddy reverse-proxy --from example.com --to localhost:8080
展开代码# Envoy配置示例(YAML比Nginx更结构化) static_resources: listeners: - name: listener_0 address: socket_address: { address: 0.0.0.0, port_value: 10000 } filter_chains: - filters: - name: envoy.filters.network.http_connection_manager typed_config: "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager stat_prefix: ingress_http route_config: name: local_route virtual_hosts: - name: backend domains: ["*"] routes: - match: { prefix: "/" } route: { cluster: service_backend } http_filters: - name: envoy.filters.http.router clusters: - name: service_backend connect_timeout: 0.25s type: STATIC lb_policy: ROUND_ROBIN load_assignment: endpoints: - lb_endpoints: - endpoint: address: socket_address: { address: 127.0.0.1, port_value: 8080 }
Envoy的独特优势:
| 工具 | 技术底座 | 核心能力 | 适用规模 |
|---|---|---|---|
| Kong | OpenResty(Nginx+Lua) | 插件生态丰富、企业版功能全 | 中大型企业 |
| APISIX | Envoy/Nginx双引擎 | 动态路由、多语言插件、国产 | 云原生中大规模 |
| Gloo | Envoy | 函数级路由、GraphQL/gRPC转换 | 微服务复杂场景 |
| Tyk | Go自研 | 开源协议友好、内置Dashboard | 中小企业 |
Kong插件示例(速率限制):
展开代码# 安装速率限制插件 curl -X POST http://localhost:8001/plugins \ --data "name=rate-limiting" \ --data "config.minute=100" \ --data "config.policy=redis" \ --data "config.redis_host=redis"
展开代码开始选型 │ ├── 是否需要自动服务发现(Docker/K8s)? │ ├── 是 → Traefik(最简单)或 APISIX(功能最强) │ └── 否 → 继续 │ ├── 是否追求配置极简(个人/小团队)? │ ├── 是 → Caddy(自动HTTPS神器) │ └── 否 → 继续 │ ├── 是否需要服务网格(Istio/Consul)? │ ├── 是 → Envoy(标准数据平面) │ └── 否 → 继续 │ ├── 性能要求是否极致(金融/高并发)? │ ├── 是 → HAProxy(TCP层)或 Nginx(HTTP层) │ └── 否 → 继续 │ ├── 是否需要丰富插件(认证/转换/分析)? │ ├── 是 → Kong 或 APISIX │ └── 否 → Nginx(稳定成熟) │ └── 遗留系统兼容(Apache模块)? ├── 是 → Apache httpd + mod_proxy └── 否 → 上述任选
展开代码用户请求 ↓ [CDN边缘] ← CloudFlare/阿里云CDN,静态缓存+抗DDoS ↓ [L4负载均衡] ← HAProxy/硬件F5,TCP层分发,多活入口 ↓ [L7网关集群] ← Nginx/Kong集群,SSL终结+业务路由 ↓ [微服务网格] ← Envoy Sidecar,服务间mTLS+熔断 ↓ [应用容器] ← Pod/Container,业务代码
展开代码upstream backend_stable { server 10.0.0.1:8080; server 10.0.0.2:8080; } upstream backend_canary { server 10.0.0.3:8080; # 新版本 } split_clients "${remote_addr}AAA" $canary_version { 95% stable; 5% canary; } server { location / { proxy_pass http://backend_$canary_version; } }
展开代码apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: reviews-route spec: hosts: - reviews.prod.svc.cluster.local http: - match: - headers: end-user: exact: jason route: - destination: host: reviews.prod.svc.cluster.local subset: v2 - route: - destination: host: reviews.prod.svc.cluster.local subset: v1 weight: 90 - destination: host: reviews.prod.svc.cluster.local subset: v3 weight: 10
展开代码# Nginx upstream连接池 upstream backend { server 127.0.0.1:8080; keepalive 100; # 保持100个空闲长连接 keepalive_timeout 60s; # 空闲连接保活时间 keepalive_requests 1000; # 单连接最大复用次数 # 健康检查(商业版或第三方模块) # health_check interval=5s fails=3 passes=2; }
展开代码# /etc/sysctl.conf # 增大文件描述符 fs.file-max = 1000000 # TCP连接优化 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 0 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 1200 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.tcp_max_tw_buckets = 5000 # 端口范围 net.ipv4.ip_local_port_range = 10000 65000 # 连接跟踪(高并发时考虑关闭或增大) net.netfilter.nf_conntrack_max = 1000000
展开代码# wrk 现代HTTP压测工具 wrk -t12 -c400 -d30s http://localhost:8080/api # 输出示例: # Running 30s test @ http://localhost:8080/api # 12 threads and 400 connections # Thread Stats Avg Stdev Max +/- Stdev # Latency 12.34ms 3.21ms 45.67ms 78.23% # Req/Sec 10.23k 1.12k 12.50k 72.45% # 3678902 requests in 30.02s, 512.34MB read # Requests/sec: 122545.12 # Transfer/sec: 17.07MB
| 趋势 | 技术体现 | 影响 |
|---|---|---|
| eBPF加速 | Cilium/Katran替代iptables | 更高性能、更低延迟 |
| HTTP/3普及 | QUIC协议、0-RTT连接 | 弱网环境体验提升 |
| WebAssembly插件 | Envoy Wasm/APISIX Wasm | 多语言编写扩展,安全沙箱 |
| AI驱动调度 | 基于实时延迟预测路由 | 智能流量管理 |
| 零信任架构 | 每请求mTLS、身份感知代理 | 安全边界内移 |
展开代码┌─────────────────────────────────────────────────────────────┐ │ 个人博客/小项目 → Caddy(自动HTTPS,配置极简) │ ├─────────────────────────────────────────────────────────────┤ │ 中小团队/Docker环境 → Traefik(自动发现,云原生友好) │ ├─────────────────────────────────────────────────────────────┤ │ 传统架构/稳定优先 → Nginx(生态成熟,文档丰富) │ ├─────────────────────────────────────────────────────────────┤ │ 金融级高并发入口 → HAProxy(TCP层极致性能) │ ├─────────────────────────────────────────────────────────────┤ │ 服务网格/Istio → Envoy(标准数据平面) │ ├─────────────────────────────────────────────────────────────┤ │ API管理/丰富插件 → Kong/APISIX(企业级网关) │ └─────────────────────────────────────────────────────────────┘
反向代理是现代架构的流量枢纽,选型时需平衡性能、功能、运维复杂度三个维度,没有银弹,只有最适合当前阶段的方案。
本文作者:zzz
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!