1 需求背景
把prd环境某个域名下的某个post url访问流量复制到stg环境中的机器上,不过在stg环境中访问的post url已经和prd的不一样了,但是后端处理程序是可以处理这种变化的。
#### 例如:
prd: http://www.example.com/pc_session.php --> stg: http://www.test.com/bd-blink-server/asynctapi/PC-session
2 难点
#### 1 在众多url中只复制某一个的url的访问流量,在单机的www.example.com下面有几十个api接口,只复制pc_session.php接口的流量,tcpcopy排除。 #### 2 流量复制到stg环境后,stg的服务接口变了,并不是从prd复制过来的url接口访问格式。 #### 3 整个流量复制是要获取post的值,不是get的值,rewrite方式排除,rewrite到外部域名只能传递get数据,rewrite到内部域名是可以传递post参数的。
3 方案
#### Gor+nginx(nginx_proxy)来实现。 #### 1 Gor通过http method匹配post方式的请求,通过url匹配来获取指定的url。 #### 2 nginx location精确匹配要过滤的url,通过nginx_proxy代理到固定的url上面。
4 实施
#### 1 prd:bd-prd-nginx-174机器运行gor复制流量
gor5 --input-raw :80 --output-http http://10.203.80.53:80 --http-allow-method POST --http-set-header 'User-Agent: Gor' -http-allow-url pc_session.php
#### 2 stg:bd-stg-api-53机器配置nginx
server { listen 10.203.80.53:80; access_log logs/stg-bdgblog.eastmoney.com-access.log main; error_log logs/stg-bdgblog.eastmoney.com-error.log; location / { if ( $uri !~ /pc_session.php$ ) { return 503; } } location = /pc_session.php { proxy_pass http://10.203.80.52:8000/bd-blink-server/asynctapi/PC-session; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } access_log logs/pc-session_access.log main; error_log logs/pc-session_error.log;}
#### 3 stg:bd-stg-api-52 查看后端处理逻辑是否收到数据