目标
- 对比 Envoy 与 Nginx 在正向代理场景下的吞吐、延迟、失败率与连接行为(TIME_WAIT)。
环境
- Envoy:监听
9094,管理口9902,启用来源/目标 RBAC、动态前向代理(c-ares DNS)、访问日志与本地限流。 - Nginx:监听
8080,启用 HTTP/1.1 长连接与reuseport、CONNECT 支持,变量上游转发。 - 系统(Linux 参考):
ip_local_port_range=20000–65535、tcp_tw_reuse=1、tcp_timestamps=1、tcp_max_tw_buckets=200000。
指标采集
- 吞吐与延迟:QPS、平均耗时、P50/P90/P99。
- 失败率:HTTP 4xx/5xx 比例、连接错误(如
connect() failed)。 - 连接行为:
TIME_WAIT总量与趋势。 - 代理内部指标:
- Envoy:
curl http://localhost:9902/stats | head -n 200,关注cluster.dynamic_forward_proxy_cluster.*、dns_cache.*、local_ratelimit.*、http.*。 - Nginx:访问日志与错误日志,统计 5xx 与连接失败。
- Envoy:
压测命令
- HTTP(Envoy):
docker run --rm rakyll/hey -z 60s -c 200 -x http://host.docker.internal:9094 http://example.org/
- HTTP(Nginx):
docker run --rm rakyll/hey -z 60s -c 200 -x http://host.docker.internal:8080 http://example.org/
- HTTPS(CONNECT)功能验证(并发 curl):
docker run --rm curlimages/curl:8.5.0 -sS --proxy http://host.docker.internal:9094 https://ifconfig.io
TIME_WAIT 采样
- macOS:
watch -n 5 'netstat -an | grep TIME_WAIT | wc -l' - Linux:
watch -n 5 'ss -tan state time-wait | wc -l'
输出记录模板
- 工具命令、QPS、平均耗时、P95/P99、失败率、
TIME_WAIT初值/峰值/稳态值、Envoy/Nginx关键指标快照。
一键脚本
- 路径:
scripts/run_benchmark.sh - 使用:
bash scripts/run_benchmark.sh - 可选参数(环境变量):
DURATION压测时长秒(默认60)CONCURRENCY并发数(默认200)TARGETHTTP目标(默认http://example.org/)ENVOY_PROXY(默认http://host.docker.internal:9094)NGINX_PROXY(默认http://host.docker.internal:8080)CONNECT_TARGET(默认https://ifconfig.io)CONNECT_COUNT(默认50)CONNECT_PARALLEL(默认10)
- 输出目录:
docs/results/<timestamp>/,包含 hey 输出、TIME_WAIT 采样、Envoy stats 快照与 CONNECT 结果。
结论预期
- Envoy:动态前向代理与连接合并带来更高复用率;在大量不同上游域名场景下,
TIME_WAIT峰值与稳态值更低,失败率更低,P99更稳。 - Nginx:变量上游难以池化复用,可能导致频繁建连与大量
TIME_WAIT,高并发下更易受端口耗尽影响。
风险与注意
- 白名单:测试目标域必须在 Envoy 白名单内,否则会被 RBAC 返回 403。
- CONNECT:压测工具有限,建议以功能验证与失败率统计为主,配合 HTTP 压测综合判断。
- 正则复杂度:避免单条 RE2 规则过大;当前已拆分并使用低复杂度通配(
*.{region}.log.aliyuncs.com)。
可执行指引(一步步)
前置条件

