nginx流量镜像通过mirror指令异步复制请求至备用服务,不影响主链路;需1.13.4+版本并启用ngx_http_mirror_module模块,配合upstream定义原始后端与镜像目标,在location中配置mirror及internal代理实现。

配置 Nginx 实现流量镜像备份,核心是用 mirror 指令复制请求到备用目标,同时确保原始请求不受影响。它不是传统“主备切换”式备份,而是异步、只读的流量副本分发,适用于测试、监控、分析等场景。
确认 Nginx 版本与模块支持
Nginx 1.13.4+ 原生支持 ngx_http_mirror_module,无需额外编译。验证方式:
- 运行
nginx -v查看版本,必须 ≥ 1.13.4 - 执行
nginx -V 2>&1 | grep -o with-http-mirror-module,有输出说明模块已启用 - 若无输出,需重新编译并添加
--with-http-mirror-module参数
定义镜像目标与原始后端
在 http 块中分别声明两组 upstream:
-
原始业务后端:接收并处理真实请求(如
backend) -
镜像目标服务:仅接收副本,不参与响应(如
mirror_backend),可为测试环境、日志收集服务或分析平台
示例:
upstream backend {
server 192.168.1.20:8080;
server 192.168.1.21:8080;
}
<p>upstream mirror_backend {
server 192.168.1.100:9000; # 镜像专用服务,不对外提供响应
}</p>配置镜像规则(关键步骤)
在 server 块内设置 location,启用镜像并隔离内部路径:
- 使用
mirror指令指定镜像触发路径(如/mirror) - 开启
mirror_request_body on确保 POST/PUT 等带体请求也被完整复制 - 原始请求走
proxy_pass http://backend;镜像请求由另一个location = /mirror_target接收,并用internal限制外部访问
示例配置片段:
location / {
mirror /mirror;
mirror_request_body on;
proxy_pass http://backend;
proxy_set_header Host $host;
}
<p>location = /mirror {
internal;
proxy_pass <a href="https://www.php.cn/link/26f17e8dbf8c2c06485d08cb0bd067e3">https://www.php.cn/link/26f17e8dbf8c2c06485d08cb0bd067e3</a>;
}</p>注意事项与常见调整
镜像流量默认全量复制,但可通过条件控制比例或范围:
- 按路径过滤:把
mirror /mirror放在特定location /api/v2/下,只镜像某类接口 - 按变量控制:结合
map指令实现概率镜像,例如map $request_uri $do_mirror { ~^/payment/ "1"; default "0"; },再用mirror $do_mirror - 镜像目标不可达时,Nginx 自动丢弃副本请求,不影响主链路;建议对
mirror_backend启用健康检查(需搭配nginx-plus或自研探活) - 避免循环:确保镜像目标不反向调用同一台 Nginx,否则可能引发无限递归











