ngx_http_mirror_module可实现生产流量一键实时镜像压测,核心是异步非阻塞镜像原始请求至压测服务,主流程零干扰;通过mirror指令精准控制时机,支持多目标、按路径分组、运行时开关,需压测服务配合接收与回放。

使用 ngx_http_mirror_module 实现生产流量的一键实时镜像同步压测,核心在于“不干扰线上、零侵入、可随时启停”。它不是复制请求体或响应,而是将原始请求(含 header、body、method、uri)**异步、非阻塞地镜像一份到指定压测服务**,主流程完全不受影响。
配置 mirror 指令,精准控制镜像时机
镜像行为由 mirror 指令触发,支持在 location 或 server 块中配置。关键点:
- 只对匹配该 location 的请求生效,可按 path、host 或 upstream 分组镜像(例如仅镜像
/api/v1/order) - 支持多个
mirror指令,实现多目标并行镜像(如同时发往压测集群 A 和 B) - 镜像请求默认复用原始请求的 method、headers、body;若需改写,需配合
mirror_request_body off+proxy_pass_request_body off+ 自定义 body(较复杂,通常不建议) - 推荐搭配
mirror_request_body on(默认),确保 POST/PUT 等带 body 的请求完整镜像
压测服务需具备接收与回放能力
镜像本身只是“转发”,压测服务必须能正确解析并处理镜像请求:
- 部署一个轻量 HTTP 服务(如 Python Flask / Go net/http),监听
/mirror或任意路径,接收镜像请求 - 服务需原样记录请求信息(时间戳、header、body、uri),并可选做去重、采样、打标(如加
X-Mirror-Traffic: true) - 若需真实回放压测,建议将镜像日志接入消息队列(Kafka/RocketMQ),再由压测引擎(如 JMeter + Custom Plugin、Gatling、自研工具)消费并发起真实调用
- 注意:镜像请求是“单向”且“无响应等待”的,压测服务返回 200/500 对主链路完全无影响
一键启停:用变量 + map 实现运行时开关
避免重启 Nginx,通过变量动态控制是否启用镜像:
- 定义
map变量,例如:map $http_x_mirror_switch $do_mirror {<br> "on" 1;<br> default 0;<br>} - 在 location 中使用:
mirror /mirror$request_uri if=$do_mirror; - 压测时,客户端或网关层在请求头中带上
X-Mirror-Switch: on即可激活镜像;去掉该 header 或设为 off,立即停止 - 进阶:结合 Consul/K8s ConfigMap 动态下发开关值,实现全集群统一调度
注意事项与典型问题规避
实际落地中易踩坑,需提前确认:
-
Body 读取限制:Nginx 默认只读取部分 body 用于路由判断。若镜像 POST 大文件,需确保
client_max_body_size足够,且mirror_request_body on生效(Nginx ≥ 1.13.4) -
Header 透传:镜像请求默认携带原始所有 headers,但
Connection、Keep-Alive等 hop-by-hop header 会被自动过滤,无需手动清理 - 性能开销:镜像为异步子请求,实测单机万级 QPS 下 CPU 增幅 mirror_timeout 控制超时)
-
HTTPS 镜像:若压测服务是 HTTPS,需在
mirror后的proxy_pass中配置proxy_ssl_verify off(测试环境)及证书信任链(生产环境)

















