相信搞过微信开发、小程序的同学都踩过调试的坑,那种线上折腾通常能让你憋上一口老痰。当然你也可以找其他的方式进行内网转发,比如用QQ浏览器、别人已经搭建好的转发服务、使用ssh+nginx。这这几种我都使用过,为了省时间你值得拥有。但是最近看了ngrok的源码,基于golang,那我就来劲了,因为我最近刚好在折腾golang网络这一块的内容。所以就自己来吧

前提

1.记得看标题啊,我采用的是aws,所以意思你必须有一个服务器,必须有公网ip

2.再有就是你要有一个域名,如果你使用过别人提供的ngrok,就知道,别人都采用三级域名泛解析的方式。所以希望你有一个自己的域名。不然没办法走下去了。

3.环境:redhat7.3

必要工具

 yum install -y mercurial git vim wget

这个mercurialngrok强制要求的。

安装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
检查一下goenv环境变量:
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/binngrokd文件.希望你可以一步到位

可能有的错误:
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 getgo-bindata下载到GOBIN目录中了,所以你要把go-bindata复制到ngrokbin目录中,但是默认是没有这个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...


soledad
888 声望35 粉丝

我们努力的付出想换来的是什么,我只想让自己过得快乐点