Nginx mirror模块可零修改、无感知、100%克隆线上请求至压测环境,仅旁路复制且不影响主链路;需1.13.4+版本并启用with-http-mirror-module,mirror指令须在location中配合proxy_pass使用,开启mirror_request_body on并用internal保护/mirror_api。

使用 Nginx 的 mirror 模块可以将线上真实请求**零修改、无感知、100% 克隆**地转发到压测环境,实现安全可控的影子流量压测。关键在于它不改变原请求路径、响应、状态码和时序,只做“旁路复制”,主链路完全不受影响。
确认 Nginx 版本并启用 mirror 模块
Nginx 从 1.13.4 版本起内置 mirror 模块(无需单独编译),但需确认是否启用:
- 运行
nginx -V 2>&1 | grep -o with-http-mirror-module,有输出即支持 - 若为旧版本(如 1.12.x),需升级或重新编译时添加
--with-http-mirror-module - 注意:mirror 指令只能出现在 location 块中,且仅支持 proxy_pass,不支持 fastcgi_pass 等其他后端协议
配置 mirror 实现全量请求克隆
在目标 location 中添加 mirror 指令,指向压测服务地址(可带端口、路径):
location /api/ {
# 主服务(线上真实后端)
proxy_pass http://prod_backend;
<pre class="brush:php;toolbar:false;"># 克隆一份相同请求发往压测环境(自动复用原请求方法、header、body)
mirror /mirror_api;
mirror_request_body on; # 必须开启,否则 POST/PUT 等带 body 的请求无法克隆
# 镜像请求专用 location(不对外暴露,仅内部跳转)
location = /mirror_api {
internal; # 强制限制仅内部调用
proxy_pass http://stress_backend$request_uri;
proxy_set_header X-Mirror-Mode "true"; # 可选:标识这是镜像流量,便于压测服务区分处理
proxy_buffering off;
}}
-
mirror_request_body on是关键开关,Nginx 默认不读取 request body,关闭会导致 POST/JSON 请求体丢失 -
internal防止外部直接访问 /mirror_api,保障安全性 -
$request_uri保留原始 URI(含 query string),确保路径一致
压测环境适配与流量识别
被克隆的请求会完整抵达压测服务,但需避免污染生产数据,建议在压测服务层做隔离:
- 通过
X-Mirror-Mode: true或自定义 header(如X-Traffic-Source: mirror)识别镜像流量 - 数据库操作时自动切换到影子库或加前缀(如
user_2024_mirror) - 缓存 key 加镜像标记(如
cache:user:123:mirror),避免击穿线上缓存 - 第三方调用(短信、支付等)全部 Mock 或打桩,禁止真实触发
可观测性与风险控制
克隆本身不阻塞主流程,但仍需监控异常,防止压测反向拖垮线上:
- 在 mirror location 中启用 access_log,单独记录镜像请求:
access_log /var/log/nginx/mirror.log mirror; - 用 Prometheus + nginx-vts-exporter 监控
mirror_requests_total和延迟分布 - 设置压测服务超时(
proxy_read_timeout 5s)并启用proxy_ignore_client_abort on,避免压测服务卡住导致主请求 hang 住 - 首次上线建议先用
mirror_percentage(需 patch 或用 map+split_clients 模拟)做 1% 小流量验证


















