nginx流量复制
1、简述
Nginx 双写,也称为流量复制或流量镜像,是指将线上真实的用户请求(读/写)复制一份,并将其发送到另一套环境(如测试环境、压测环境、新版本预发布环境)中。核心特点是:对原始请求的响应没有任何影响,复制出去的请求无论结果如何,都会直接被 Nginx 忽略。
2、核心原理
Nginx 通过 ngx_http_mirror_module
模块(自 Nginx 1.13.4 版本起内置)来实现流量复制。该模块会忽略镜像请求的响应。
3、主要应用场景
-
压力测试:将生产环境的真实流量复制到测试环境,模拟真实压力,比模拟数据更准确。
-
流量放大:配置多份相同镜像。
-
版本预发布验证:将流量复制到运行新版本的服务器的环境中,观察新版本在处理真实流量时的表现(如日志、性能、错误等)。
-
故障复现和调试:生产环境出现难以复现的 bug 时,将特定请求复制到开发环境,帮助开发者调试。
-
数据同步验证:将写入请求复制到另一个集群,验证数据同步或一致性。
4、配置
基础配置
# 在 http 块中定义一个后端服务器集群
upstream primary_backend {server 192.168.1.10:8080;server 192.168.1.11:8080;
}# 定义镜像目标服务器集群
upstream mirror_backend {server 10.0.0.20:8080;# 可以只有一个,也可以有多个(但通常镜像集群不需要高可用)
}server {listen 80;server_name yourdomain.com;# 核心配置位置location / {# 1. 启用镜像模块,指定镜像路径和上游名称# 注意:mirror 指令可以出现多次,以复制到多个目的地mirror /mirror;# 2. 设置镜像请求体(如果需要复制POST数据,必须设置)mirror_request_body on;# 3. 将主请求代理到原始后端服务器proxy_pass http://primary_backend;# 设置主请求的Host头等信息(根据需要)proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;# ... 其他proxy_set_header配置}