复制生产环境流量到本地开发环境 ngrok+gor

#模拟服务器数据# 复制生产环境流量到本地开发环境 ngrok+gor

摘要

复制生产环境流量到本地开发环境 ngrok+gor

场景

本地没有测试数据,或者不方便生成,或者必须使用生产环境中的实时的客户数据。
最理想的状态是 用户的请求直接来到本地的开发环境中。
切换生产环境的域名到本地是不现实的。一是本地没有外网IP。
二是服务器会丢失用户数据。如果直接在服务器上开发也可以,但是大部分服务器都是linux,是没有图形界面用来运行java IDE的。

所以最好的方法是:每有一份发往服务器的请求都被复制一份发到本地来。首先本地要绑定一个临时的域名。所有复制的那份请求都发到这个临时域名。

软件环境

Gor

go语言开发的一个流量复制软件,运行在服务器上。
比如gor -input-raw :80 -output-http "http://xxx.indexpage.me"
意思就是 监听服务器上的 80端口进来的http请求,发送到 xxx.indexpage.me 这个域名处。

ngrok

把本地的服务公布到外网。
由于种种原因,ngrok.com已经无法访问了。所以这里介绍的是如何用自己的域名搭建ngrok服务。
注意现在只有1.x版本 是开源的,所以ngrok的服务器端和客户端都要用1.x进行编译。

配置过程

服务器端证书制作 for ngrok

假设操作目录是 /root
indexpage.me 是我自己的域名,可以用来测试。
记得在域名解析出添加A记录 * , @ 都为当前服务器的IP

NGROK_DOMAIN="indexpage.me"

openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000

编译ngrok服务器端

sudo apt-get install build-essential golang mercurial git
git clone https://github.com/inconshreveable/ngrok.git ngrok
cd ngrok
NGROK_DOMAIN="indexpage.me"

openssl genrsa -out base.key 2048
openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=$NGROK_DOMAIN" -out base.pem
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
openssl x509 -req -in server.csr -CA base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt

cp base.pem assets/client/tls/ngrokroot.crt
sudo make release-server

运行ngrok服务器端

sudo nohup ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="indexpage.me" -httpAddr=":8081" -httpsAddr=":8082" >/dev/null 2>&1 &

编译客户端

准备工作,安装go运行环境
golang下载地址 https://golang.org/dl/

wget https://storage.googleapis.com/golang/go1.5.2.linux-amd64.tar.gz
tar -zxvf  go1.5.2.linux-amd64.tar.gz
vi /etc/profile

最后追加两行
export GOROOT=/root/go
export PATH=$GOROOT/bin:$PATH

使环境变量生效
. /etc/profile

开始编译

安装make命令
apt-get install build-essential
git clone https://github.com/inconshreveable/ngrok.git ngrok
cd ngrok
cp  /root/base.pem assets/client/tls/ngrokroot.crt 
vi src/ngrok/log/logger.go
第五行import中的 log 包改为github上引用 //是注释
log "github.com/keepeye/log4go"

执行编译命令,编译linux64位下使用的客户端
GOOS=linux GOARCH=amd64 make release-client
生成的位置是 /root/ngrok/bin/ngrok


编译windows 64下使用的客户端
GOOS=windows GOARCH=amd64 make release-client
生成的位置是 /root/ngrok/bin/windows_amd64/ngrok.exe

如何使用ngrok

ngrok客户端下载到本地后

ngrok客户端文件同目录,创建一个配置文件 ngrok.conf
内容如下

server_addr: indexpage.me:4443
trust_host_root_certs: false

启动

ngrok -config=ngrok.conf 8989

表示 把本地端口为8989的服务公布出去,生成一个二级域名随机的域名。

这样别人访问类似 http://66b3c6c4.indexpage.me:8081 就是访问你电脑的上的服务了。
可以通过subdomain参数指定二级域名,而不是随机生成。
ngrok -config=ngrok.conf -subdomain xxx 8989 xxx是二级域名

为什么服务器端设置的是8081呢?
因为种种原因,自己搭建的80端口别人是访问不到的。。。