使用 ngx_http_mirror_module 进行生产流量镜像压测,核心在于不干扰主链路、精准复制请求、隔离镜像流量,它异步发送副本且不转发响应,需注意配置细节与上下游协同。

使用 ngx_http_mirror_module 进行生产流量镜像压测,核心在于「不干扰主链路、精准复制请求、隔离镜像流量」。它本身不转发响应,只异步发送副本到镜像服务,因此天然适合无损压测场景——但需注意配置细节和上下游协同,否则容易引发日志污染、超时堆积或目标服务过载。
确保 Nginx 版本支持并启用模块
该模块自 Nginx 1.13.4 起内置,无需单独编译。确认版本:
nginx -v # 应 ≥ 1.13.4
若为旧版本(如 1.12.x),需升级或手动编译启用:--with-http_mirror_module。线上环境建议统一升级至稳定版(如 1.22+),避免已知的 mirror 请求体读取异常问题。
基础镜像配置:最小化侵入主流程
在 location 块中添加 mirror 指令,指向镜像服务地址(可为 upstream 或具体域名/IP):
location /api/ {<br> mirror /mirror-api;<br> proxy_pass http://backend;<br>}<br><br>location = /mirror-api {<br> internal;<br> proxy_pass http://mirror-backend$request_uri;<br>}关键点:
-
internal必须声明,防止外部直接访问/mirror-api导致误触发 -
mirror指令默认只镜像 GET/HEAD 请求;如需 POST/PUT 等,需配合mirror_request_body on(Nginx ≥ 1.19.0) - 镜像请求使用原始请求头和 body,但
Host头保持原值,需在镜像服务侧做好识别(例如通过自定义 header 标记)
生产级增强:限流、标记与可观测性
直接全量镜像可能压垮测试服务或干扰监控,需主动控制:
-
按比例采样:用
mirror指令配合map实现随机采样(如 5%):map $request_id $mirror_flag {<br> default 0;<br> "~^[0-9a-f]{8}" 1; # 简单哈希取模示例<br>}
再在 location 中:mirror $mirror_flag; -
添加压测标识头:在
/mirror-apilocation 中注入 header,便于镜像服务区分流量来源:proxy_set_header X-Mirror-Source "prod";<br>proxy_set_header X-Mirror-Timestamp "$time_iso8601";
-
设置镜像超时与重试:避免镜像失败阻塞主流程,且防止长连接堆积:
proxy_connect_timeout 1s;<br>proxy_send_timeout 2s;<br>proxy_read_timeout 2s;<br>proxy_next_upstream error timeout http_500;<br>proxy_next_upstream_tries 1;
镜像服务端注意事项
镜像服务(如 mock-server、压测 agent 或影子数据库)需适配以下行为:
- 忽略镜像请求的响应体(Nginx 不读取其返回内容),重点校验请求路径、参数、body 和 header
- 禁止对镜像请求执行写操作(如扣库存、发消息),除非明确设计为影子链路
- 记录
X-Mirror-*等自定义头,用于日志归类、链路追踪(如注入X-B3-TraceId保持同源) - 对高频小请求(如心跳、埋点)建议在 Nginx 层过滤,避免无效镜像:
if ($uri ~ ^/(health|metrics|ping)) { set $mirror_flag 0; }
不复杂但容易忽略:镜像流量虽不返回给客户端,但会消耗 Nginx worker 连接和后端资源。上线前务必在预发环境验证镜像并发承载力,并监控 nginx_stub_status 中 active connections 及 mirror 目标服务的错误率。










