相信搞过微信开发、小程序的同学都踩过调试的坑,那种线上折腾通常能让你憋上一口老痰。当然你也可以找其他的方式进行内网转发,比如用QQ浏览器、别人已经搭建好的转发服务、使用ssh+nginx
。这这几种我都使用过,为了省时间你值得拥有。但是最近看了ngrok
的源码,基于golang
,那我就来劲了,因为我最近刚好在折腾golang
网络这一块的内容。所以就自己来吧
前提
1.记得看标题啊,我采用的是aws
,所以意思你必须有一个服务器,必须有公网ip
。
2.再有就是你要有一个域名,如果你使用过别人提供的ngrok
,就知道,别人都采用三级域名泛解析的方式。所以希望你有一个自己的域名。不然没办法走下去了。
3.环境:redhat7.3
必要工具
yum install -y mercurial git vim wget
这个mercurial
是ngrok
强制要求的。
安装golang
# 下载`go`
cd /usr/local
wget https://storage.googleapis.com/golang/go1.10.linux-amd64.tar.gz
# 解压
tar -zxvf go1.10.linux-amd64.tar.gz -C /usr/local/
# go的命令需要做软连接到/usr/bin
ln -s /usr/local/go/bin/* /usr/bin/
设置go
环境
#安装go语言的安装环境
yum install mercurial bzr subversion -y
#新建go目录作为项目目录
mkdir -p $HOME/go
#用cat的方法在尾部增加golang的环境:GOROOT GOPATH
#下面这段,整段复制粘贴过去
cat >>$HOME/.bash_profile<<EOF
export GOROOT=/usr/local/go
export GOPATH=\$HOME/go
export PATH=\$PATH:\$GOROOT/bin
EOF
#让配置生效
source $HOME/.bash_profile
检查一下go
的env
环境变量:
go env
看到GOPATH
,GOROOT
就可以了
ngrok 配置
下载:
cd /usr/local/
git clone https://github.com/inconshreveable/ngrok.git
设置环境变量:
export GOPATH=/usr/local/ngrok/
#这里写你自己的域名,建议你用二级域名,比如你有个域名为:baidu.com,那么这里就可以为:ngrok.baidu.com.
export NGROK_DOMAIN="ngrok.xxx.com"
当然你会问,为什么不直接使用baidu.com
,而是用ngrok.baidu.com
.如果你有限制的域名的话,当然是可以直接使用baidu.com
的。
生成证书:
cd /usr/local/ngrok
openssl genrsa -out rootCA.key 2048
#NGROK_DOMAIN 就是你上一步的步骤设置的域名
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.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 rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000
拷贝证书覆盖ngrok原来的证书:
过程会让你输入y 回车
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp server.crt assets/server/tls/snakeoil.crt
cp server.key assets/server/tls/snakeoil.key
生成服务端:
cd /usr/local/ngrok/
make release-server
#这一步可能会出错的,我之所以会写这篇文章,是因为这个地方出现了好几次错误,容易崩溃
如果顺利的话,生成的服务端在/usr/local/ngrok/bin
下ngrokd
文件.希望你可以一步到位
可能有的错误:
bin/go-bindata -nomemcopy -pkg=assets -tags=release \
-debug=false \
-o=src/ngrok/client/assets/assets_release.go \
assets/client/...
bin/go-bindata -nomemcopy -pkg=assets -tags=release \
-debug=false \
-o=src/ngrok/server/assets/assets_release.go \
assets/server/...
go get -tags 'release' -d -v ngrok/...
go install -tags 'release' ngrok/main/ngrokd
go install: cannot install cross-compiled binaries when GOBIN is set
make: *** [server] Error 1
解决方法:
cd /usr/local/ngrok
mkdir bin
cp $GOBIN/go-bindata bin/
unset GOBIN
这里说明一下,默认下go get
把go-bindata
下载到GOBIN
目录中了,所以你要把go-bindata
复制到ngrok
的bin
目录中,但是默认是没有这个bin
目录的。
生成客户端:
我用的是mac系统,所以我只生成mac ngrok客户端,window的生成方法,可以参考底下参考文章
cd /usr/local/ngrok/
GGOOS=darwin GOARCH=amd64 make release-client
#然后就是等待下载了,没有进度条,耐心等待。
#生成的在/usr/local/ngrok/bin/darwin_amd64
#都在bin下,服务端是ngrokd 客户端是ngrok
到这一步基本算是安装完成了。
启动服务端
这里为了方便我直接就用80端口了,请确认你的80端口没有被占用,关闭相应的服务。
后面要想用,建议使用nginx反向代理到ngrok。
cd /usr/local/ngrok/bin
./ngrokd -domain="xxx.com" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443"
#-domain后面你上面写的域名,如上面写的:ngrok.baidu.com -httpAddr http端口 -httpsAddr https 端口 默认为:443
#-tunnerlAddr 客户端端口,连接端口,默认为:4443
启动客户端
先将服务器生成的客户端ngrok
下载到本地,aws下载的命令如下(不是aws,就用scp就可以了):
scp -i "aa.pem" ec2-user@ec2-34-201-46-244.compute-1.amazonaws.com:/usr/local/ngrok/bin/darwin_amd64 /ngrok
然后同目录下创建文件ngrok.cfg 配置文件:
server_addr: "ngrok.xxx.com:4443" #你上面自己写的域名,如ngrok.baidu.com
trust_host_root_certs: false
#目录下打开命令行
./ngrok -config=./ngrok.cfg -subdomain=blog 80 -log=ngrok.log
#这里subdomain后面是你的三级域名前缀,你可以改
#注意要在域名解析里添加三级域名解析
#最好添加一个log, 不然出错了,容易一脸懵逼
这样就可以了,然后在访问blog.ngrok.xxx.com
就可以访问了。
域名解析
可能有些小伙伴没有怎么解析过三级域名。这里就短暂说一下。
首先把你的二级域名解析到aws
的ip上,如下图
再添加一个三级域名解析:
这样就可以了,其实还是比价简单的。
特别提醒
如果你是新的服务器,比如aws
,默认有些端口是没有开启的(去安全组设置就好了)。所以你上面如果采用了其他的端口,先确定是否可用。不信的话你去telnet
4443
端口试一下。还有域名解析是否好了,能否ping
通,可能你搭建环境是没有问题的,但是解析错了,那就悲剧了。
telnet ngrok.baidu.com 4443
ping ngrok.baidu.com
aws 如果是自己免费申请的,不用的时候记得关闭,不然超时那也要掏钱的。
参考文章
https://github.com/inconshrev...
https://blog.csdn.net/yjc_111...
https://blog.csdn.net/gebitan...
https://blog.csdn.net/qq_3656...
https://segmentfault.com/a/11...
有疑问加站长微信联系(非本文作者)