Nginx流量镜像(Mirror)(nginx流量镜像 响应拷贝)

Nginx流量镜像(Mirror)(nginx流量镜像 响应拷贝)

简介 > 流量镜像 (Traffic Mirroring),通常用于进行应用版本的测试,它将实时流量的副本发送给被镜像的服务。采用这种方法,可以搭建一个与原环境类似的环境以进行测试,从而提前发现问题。由

流量镜像 (Traffic Mirroring),通常用于进行应用版本的测试,它将实时流量的副本发送给被镜像的服务。采用这种方法,可以搭建一个与原环境类似的环境以进行测试,从而提前发现问题。由于镜像流量存在于主服务关键请求路径带外,终端用户在测试全过程不会受到影响。

Nginx的流量镜像是只复制镜像,发送到配置好的后端,但是后端响应返回到nginx之后,nginx是自动丢弃掉的,这个特性就保证了镜像后端的不管任何处理不会影响到正常客户端的请求。

Nginx流量镜像(Mirror)(nginx流量镜像 响应拷贝)

Nginx 基础流量镜像配置

采用nginx作为流量镜像,需要nginx支持 nginx_http_mirror_module 模块。

在 nginx 1.13.4 之后的怎么自己带 该模块不需要额外安装mirror模块

举个简单的栗子

Nginx复制所有请求流量

upstream service_a { server 10.10.1.2:8080;}upstream service_b { server 10.10.1.3:8080;}​server { server_name mirror.kpl.dev; listen 80;​ location / { mirror /mirror; # mirror 指令制定镜像 uri 为 /mirror proxy_pass http://service_a; }​ location = /mirror { internal; # internal 指定此 location 只能被“内部的”请求调用,外部的调用请求会返回 ”Not found” (404) rewrite ^/mirror(.*)$ $1$request_uri break; proxy_pass http://service_b$request_uri; }}

只允许GET请求

location / { mirror /mirror; # mirror 指令制定镜像 uri 为 /mirror mirror_request_body off; # off 为不镜像请求body部分 proxy_pass http://service_a;}​location = /mirror { # 判断请求方法,不是GET返回403 if($request_method != GET) { return 403; } internal; # internal 指定此 location 只能被“内部的”请求调用,外部的调用请求会返回 ”Not found” (404) rewrite ^/mirror(.*)$ $1$request_uri break; proxy_pass_request_body off; proxy_set_header Content-Length ""; proxy_set_header X-Original-URI $request_uri; proxy_pass http://service_b$request_uri;}

拷贝流量放大

将流量放大,只需要增加多个, mirror 就好

location / { mirror /mirror; # mirror 指令制定镜像 uri 为 /mirror mirror /mirror; # 每多加一份mirror,流量放大一倍 proxy_pass http://service_a;} location = /mirror { # 判断请求方法,不是GET返回403 if($request_method != GET) { return 403; } internal; # internal 指定此 location 只能被“内部的”请求调用,外部的调用请求会返回 ”Not found” (404) rewrite ^/mirror(.*)$ $1$request_uri break; proxy_pass http://service_b$request_uri;}

尾巴

如果mirror_request_body或者proxy_pass_request_body设置为 off,则Content-Length必须设置为"" 因为nginx(mirror_request_body)处理post请求时,会根据Content-Length获取请求体, 如果Content-Length不为空,而由于mirror_request_body或者proxy_pass_request_body设置为off, 处理方以为post有内容,当request_body中没有,处理方会一直等待至超时,则前者为off,nginx会报upstream请求超时。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2023年5月7日 上午9:36
下一篇 2023年5月7日 上午9:52

相关推荐