Nginx mirror模块实现线上流量镜像压测,核心是不干扰主链路、异步复制请求、精准控制镜像范围;需Nginx 1.13.4+,启用mirror模块,配置mirror指令与internal location,关闭mirror_request_body,并通过map实现条件采样和开关控制。

在Nginx中使用 mirror 模块进行线上流量镜像压测,核心是「不干扰主链路、异步复制请求、精准控制镜像范围」。它不是简单的请求转发,而是将原始请求(不含响应体)以只读方式同步克隆一份发往压测服务,主流程完全不受影响。
确认Nginx版本并启用mirror模块
Nginx 1.13.4+ 内置 ngx_http_mirror_module,无需额外编译。低版本需升级或手动添加模块。检查是否可用:
nginx -V 2>&1 | grep -o with-http-mirror-module
若无输出,说明未启用。Docker用户建议直接使用官方 nginx:alpine(v1.21+)或 nginx:mainline 镜像;源码编译需添加 --with-http-mirror-module 参数。
基础镜像配置:最小可行写法
在 location 块中添加 mirror 指令,指向压测后端。注意:mirror 是独立子请求,不继承主请求的 body(默认不发送),也不等待其响应:
location /api/ {
proxy_pass http://prod_backend;
<pre class='brush:php;toolbar:false;'># 镜像到压测环境(路径自动继承,如 /api/user → /api/user)
mirror /mirror;
mirror_request_body off; # 关键!避免重复读取body导致主流程异常
location = /mirror {
internal; # 必须设为internal,禁止外部直接访问
proxy_pass http://stress_backend$request_uri;
proxy_set_header X-Mirror-Original-Host $host;
proxy_set_header X-Mirror-Original-Method $request_method;
}}
-
mirror_request_body off是生产环境必须项——防止 Nginx 尝试两次读取 request body(主流程 + 镜像),引发400 Bad Request或连接中断 -
internal保证/mirror不被外部调用,仅供 mirror 指令内部触发 -
$request_uri保留原始路径和 query string,确保压测请求与线上一致
精准控制镜像:按条件分流与采样
全量镜像可能压垮压测环境,也非必要。可通过 map 实现动态开关与采样率控制:
map $arg_debug $mirror_flag {
"1" "on";
default "";
}
<p>map $remote_addr $sample_rate {
~^192.168. 1.0; # 内网IP全量镜像
default 0.01; # 其他IP 1%采样
}</p><p>server {
location /api/ {
mirror /mirror;
mirror_request_body off;</p><pre class='brush:php;toolbar:false;'> # 条件生效:仅当 ?debug=1 或满足采样率时触发镜像
mirror /mirror if=$mirror_flag;
mirror /mirror if=$sample_rate;
}
location = /mirror {
internal;
proxy_pass http://stress_backend$request_uri;
proxy_set_header X-Mirror-Sampled $sample_rate;
}}
- 多个
mirror指令可共存,Nginx 会依次尝试,任一满足即触发 -
if=后接变量值为非空字符串(非 0、非空)时生效,适合开关与数值采样 - 压测服务可通过
X-Mirror-Sampled等自定义头识别来源,做日志隔离或降级处理
压测服务适配要点
镜像请求到达压测环境后,需规避副作用:
-
禁用写操作:在压测后端入口层拦截
POST/PUT/DELETE,返回204 No Content或 mock 响应,避免污染数据库或缓存 - 隔离存储依赖:配置独立 DB、Redis、MQ 地址,或通过中间件(如 ShardingSphere)路由到影子库表
-
跳过鉴权与限流:识别
X-Mirror-Original-Host等头,绕过登录校验与业务限流规则,避免压测失败误判 -
记录原始标识:保存
X-Real-IP、Referer、User-Agent,便于复盘真实场景行为
不复杂但容易忽略——mirror 的本质是「请求快照」,它不保证压测服务响应结果,也不参与主流程决策。只要主链路稳定、镜像配置轻量、压测侧做好隔离,就能安全实现线上流量“零感知”引流压测。


















