nginx除了做一些负载均衡以外,可以比较方便的处理流量,进行一些流量的复制和放大的功能。
1. 流量复制的好处
1. 可以验证功能是否正常,以及服务的性能;
2. 用真实有效的流量请求去验证,又不用造数据,不影响线上正常访问;
3. 相比于灰度发布,镜像流量不会影响真实流量;
4. 可以用来排查线上问题;
5. 重构,假如服务做了重构,这也是一种测试方式;
2. nginx流量复制模块-ngx_http_mirror_module
- 源站请求,直接原路返回;正常配置下,mirror请求不影响源站请求及响应,源站nginx-server将流量复制到mirror站后,两者不再有任何交集。
- 示例
upstream kevin-order { server 127.0.0.1:8088; } upstream kevin-mirror1 { server 172.16.60.230:8088; } server { listen 80; server_name kevin.com; access_log /usr/local/nginx/logs/kevin.com-access.log main; error_log /usr/local/nginx/logs/kevin.com-error.log; # 源站点1 location /order { proxy_pass http://kevin-order; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 复制请求体 mirror_request_body on; # 流量复制 mirror /mirror1; } # 镜像站点1 location /mirror1 { proxy_pass http://kevin-mirror1$request_uri; proxy_pass_request_body on; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
配置说明:上面配置中,将访问http://kevin.com/order的流量复制到172.16.60.230服务器的8088端口。
3. 流量放大
server { listen 80; server_name kevin.com; # 源站配置 location / { access_log /usr/local/nginx/logs/access.log accesslog; mirror /mirror; # 多加一份mirror,流量放大一倍 mirror /mirror; mirror_request_body on; proxy_pass http://kevin.upstream.name; } # 镜像站点配置 location /mirror { internal; # 内部配置 proxy_pass http://mirror.kevin.upstream.name$request_uri; proxy_pass_request_body on; proxy_set_header X-Original-URI $request_uri; #使用真实的url重置url } }
参考链接:https://www.cnblogs.com/kevingrace/p/14001080.htmlhttp://nginx.org/en/docs/http/ngx_http_mirror_module.html
nginx1