Nginx mirror模块可零成本实现生产流量实时镜像压测:需1.13.4+版本、启用模块,配置mirror指令指向/internal路由,proxy_pass转发并开启mirror_request_body on,异步非阻塞执行,不干扰主链路。

使用 ngx_http_mirror_module 进行生产环境流量镜像压测,核心在于「不干扰主链路、真实请求零丢失、镜像请求可控制」。它不是复制整个 TCP 连接,而是对原始请求的 HTTP 头和请求体做一次异步、非阻塞的克隆转发,主响应完全不受影响。
确保 Nginx 版本支持并启用模块
该模块自 Nginx 1.13.4 起作为标准模块内置,无需单独编译。确认方式:
- 运行
nginx -V 2>&1 | grep -o with-http-mirror-module,有输出即已启用 - 若为旧版本(如 1.12.x),需升级或重新编译时添加
--with-http-mirror-module - 注意:OpenResty 默认包含该模块,但部分精简版可能剔除,建议用
openresty -V验证
基础镜像配置:最小安全压测结构
镜像必须是非阻塞的,且不能让压测服务拖慢线上。典型配置示例如下:
location /api/ {
# 主服务代理
proxy_pass http://prod_backend;
<pre class="brush:php;toolbar:false;"># 启用镜像(仅对匹配 location 的请求生效)
mirror /mirror;
mirror_request_body on; # 必须开启,否则不镜像 request body
# 镜像子请求配置(独立于主请求生命周期)
location = /mirror {
internal; # 强制内部访问,禁止外部直接调用
proxy_pass http://stress_backend$request_uri;
proxy_pass_request_body on;
proxy_set_header X-Original-Host $host;
proxy_set_header X-Mirror-Traffic "true";
proxy_buffering off; # 关闭缓冲,降低延迟感知
proxy_ignore_client_abort on; # 客户端断开不影响镜像发送
}}
关键点:
- mirror 指令触发子请求,不等待其完成;
- internal 是硬性要求,防止压测服务被误访问或滥用;
- proxy_ignore_client_abort on 确保用户关掉页面或超时,镜像仍能发完。
生产级增强:过滤、限流与可观测性
直接镜像全量流量风险高,需叠加控制策略:
-
按条件镜像:用
map或if(谨慎)限制范围,例如只镜像 POST 请求或特定 Header -
采样率控制:结合
split_clients实现百分比镜像(如 5%),避免压测服务过载 -
请求头脱敏:在
/mirror块中用proxy_set_header清除敏感字段(如Authorization、Cookie) - 日志分离:为镜像请求单独定义 log_format 和 access_log,便于识别与分析
示例采样配置:
split_clients "$remote_addr$remote_port" $mirror_flag {
5% "true";
* "false";
}
server {
location /api/ {
mirror /mirror;
mirror_request_body on;
# 仅当 $mirror_flag 为 "true" 时才真正触发镜像
mirror /mirror if=$mirror_flag;
}
}压测服务端适配要点
镜像目标服务(即 stress_backend)需主动配合,否则易出问题:
- 忽略
X-Mirror-Traffic: true请求的业务副作用(如不写库、不发消息、不调第三方支付) - 返回 200 即可,无需模拟真实响应体——主链路不读取镜像响应
- 建议记录原始 URI、method、耗时、状态码到日志或监控系统,用于分析瓶颈
- 若压测服务自身不稳定,建议加
proxy_next_upstream error timeout避免重试放大压力
不复杂但容易忽略:镜像请求默认复用主请求的 Host 头,若压测服务域名不同,务必用 proxy_set_header Host $host 显式覆盖,否则可能 404。

















