nginx mirror模块可无感复制线上请求至开发环境;需版本≥1.13.4,配置upstream、mirror指令及/internal镜像入口,并限制范围、剥离敏感头、添加日志追踪。

用 Nginx 的 mirror 模块就能把线上请求悄悄复制一份发到开发环境,主流程完全不受影响——用户无感知、不改代码、也不依赖额外工具。
确认基础支持
确保 Nginx 版本 ≥ 1.13.4(运行 nginx -v 查看),该模块默认内置,无需手动编译加载。若不确定是否启用,可执行:nginx -V 2>&1 | grep -o with-http-mirror-module,有输出即表示可用。
配置镜像转发规则
在 http 块中定义开发环境后端:
upstream dev_backend {
server 192.168.5.100:3000; # 开发服务器地址
keepalive 16;
}
在目标 location 中添加镜像指令:
location /api/ {
proxy_pass http://prod_backend;
mirror /mirror-dev;
mirror_request_body on; # 必须开启,否则 POST/PUT 等带体请求会丢失
}
再配一个仅内部调用的镜像处理入口:
location = /mirror-dev {
internal;
proxy_pass http://dev_backend$request_uri;
proxy_set_header X-Mirror-Traffic "true";
proxy_set_header X-Original-URI $request_uri;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 2s;
proxy_send_timeout 3s;
proxy_read_timeout 3s;
}
控制镜像范围与安全防护
避免全量镜像拖垮开发环境,建议按需限制:
- 只镜像特定方法:在 location 内加
if ($request_method = POST) { mirror /mirror-dev; } - 通过请求头开关:用
map动态控制,例如识别X-Enable-Mirror: 1才触发 - 剥离敏感头信息:在
/mirror-dev中清空Authorization、Cookie等字段,防止开发环境误操作 - 开发服务端需识别
X-Mirror-Traffic头,跳过写库、发通知等副作用逻辑
验证与日志追踪
镜像成功与否不能只看 Nginx 不报错,要主动观测:
- 给
/mirror-dev单独配 access_log,比如access_log /var/log/nginx/dev-mirror.log mirror_fmt; - 在开发环境 Nginx 或应用日志里搜索
X-Mirror-Traffic: true,确认请求真实抵达 - 检查
dev-mirror.log中的状态码分布,关注超时(504)或连接拒绝(502)是否频繁











