Nginx mirror模块可零成本镜像生产流量至测试环境:需1.13.4+版本、启用模块,配置mirror指令指向/internal路由,proxy_pass转发并可选mirror_request_body on,异步执行不阻塞主流程。

用 Nginx 自带的 mirror 模块就能把生产流量实时、零成本地镜像到测试环境,不需要额外工具、不改业务代码、也不影响线上响应。关键在于配置简洁、异步执行、原生支持——1.13.4+ 版本默认内置,开箱即用。
确认基础条件是否满足
确保你的 Nginx 是 1.13.4 或更高版本(2026 年主流发行版均已满足),无需重新编译或安装第三方模块。运行 nginx -v 验证版本;再执行 nginx -V 2>&1 | grep -o with-http_mirror_module,有输出即表示模块已启用。若显示 without-http_mirror_module,说明被显式禁用,需重装标准版 Nginx。
核心配置三步到位
只需在 location 块中添加三类指令,即可完成镜像链路:
-
开启镜像目标:用
mirror /mirror指向一个内部路由(URI 形式,非完整 URL) -
定义镜像处理逻辑:新增
location = /mirror块,加上internal限制外部访问,并用proxy_pass转发至测试服务(支持http://或https://) -
按需复制请求体:如接口含 POST JSON 或表单数据,加
mirror_request_body on;若仅需 Header 和 URI(如 GET 日志分析),可保持默认或设为off
典型配置示例(直接可用)
以下配置将所有 /api/ 请求主发生产后端,同时镜像一份到测试机:
location /api/ {
proxy_pass https://prod-api;
mirror /mirror;
mirror_request_body on;
}
location = /mirror {
internal;
proxy_pass https://test-api$request_uri;
proxy_set_header X-Original-URI $request_uri;
proxy_set_header X-Mirror-Time $msec;
}
注意:$request_uri 会保留原始查询参数和编码;proxy_set_header 可注入自定义标识,便于测试端识别镜像流量。
避坑与稳态建议
镜像虽轻量,但高流量下仍需关注几个实际细节:
- 镜像失败(超时/5xx)Nginx 默认静默丢弃,不会报警——如需可观测性,可在
location = /mirror中加access_log /var/log/nginx/mirror.log mirror_fmt;单独记录镜像请求状态 - 避免在镜像目标中使用
proxy_buffering off等激进调优,防止阻塞 Nginx 异步队列 - 若需按条件镜像(如只镜像含
?debug=1的请求),可用if ($args ~ debug=1) { mirror /mirror; },但需确保mirror不在嵌套 if 中重复出现 - 测试环境服务应忽略镜像请求的响应(Nginx 本就不处理),也无需返回成功码——返回 200、500 或直接断连都不影响主流程


















