Gor 流量复制实战

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 查看后端处理逻辑是否收到数据如图

转载于:https://my.oschina.net/guol/blog/700563