nginx流量镜像核心是异步复制请求且完全不参与主请求生命周期,需≥1.13.4版本并启用http-mirror-module;配置要求mirror指令与proxy_pass平级、镜像location声明internal、mirror_request_body按需显式设置。

核心是让镜像请求完全不参与主请求生命周期——它异步发出、不等响应、不传回结果,主链路从始至终感知不到它的存在。
必须确保 Nginx 版本与模块可用
使用 nginx -v 确认版本 ≥ 1.13.4;再执行 nginx -V 2>&1 | grep -o with-http-mirror-module,有输出即表示模块已启用。旧版本(如 1.12.x)需升级或重新编译时添加 --with-http-mirror-module 参数。Docker 用户建议直接选用官方 nginx:mainline 或 nginx:alpine(v1.21+)镜像。
基础配置要满足三个硬性要求
镜像功能能否稳定运行,取决于以下三点是否同时满足:
- mirror 指令必须放在 location 顶层,与 proxy_pass 平级;不能嵌套在 if、rewrite、limit_req 等块内,否则静默失效
- 镜像目标 location 必须声明 internal,例如 location = /mirror { internal; ... },防止外部直接访问或被误触发
- mirror_request_body 的值需按场景明确设置:压测需完整请求体时设为 on;若主流程已读取 body(如用 lua_resty_upload),则必须设为 off,避免重复读取导致 400 或连接中断
压测服务端需快速响应且不阻塞
镜像请求是“发完即弃”,压测服务收到后应立即返回轻量响应(推荐 204 No Content),并禁用 access_log 避免日志刷爆。Nginx 侧对应配置需关闭缓冲和放宽超时容忍:
- 在 location = /mirror 块中添加:proxy_buffering off;
- 设置激进超时:proxy_connect_timeout 1s; proxy_send_timeout 2s; proxy_read_timeout 2s;
- 禁用重试机制:proxy_next_upstream off;(避免失败请求轮转污染数据)
运行时控制镜像开关与采样率
避免每次改配置 reload Nginx,用变量实现动态启停:
- 定义 map 变量控制开关:map $http_x_mirror_switch $do_mirror { "on" 1; default 0; }
- 在 location 中写:mirror $do_mirror;,客户端加请求头 X-Mirror-Switch: on 即可激活
- 按比例采样(如 5%):map $request_id $mirror_flag { default 0; "~^[0-9a-f]{8}" 1; },配合哈希取模逻辑实现均匀分流
不复杂但容易忽略。











