Ngrok为何物
“ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放。”这是百度百科上给Ngrok给出的定义。说俗点就是内网穿透,将自己电脑上的Web页面或API等穿透内网,发布到网络上。和国内有名的“花生壳”内网版相似。
调试API时,每次修改提交服务器会比较麻烦,而花生壳经常无缘无故丢我POST参数,稳定点的价格还不菲,无奈选择了Ngrok。但现在大陆地区,Ngrok的官方服务在非“*”的环境下,无法正常访问。好在Ngrok开源,可以下载编译后将服务端部署到自己的服务器上,比较便捷与稳定,同时由于Ngrok采用go语言开发,编译后可到对应的平台运行,具有跨平台的特性。由于需要生成openssl证书,所以接下去编译的演示基于mac os平台,liunx下基本是一模一样的,编译生成的exe程序基于win386运行。
需要准备什么
1.一个域名 几级的无所谓,我解析了一个叫ngrok的二级域名给它,同时设置了这个二级域名下*.ngrok的泛解析。
2.一台主机 阿里云上或**云**云上的云主机都行。
如果没有这两个,那就直接看文章最后吧。正好有一台没有用的云主机,搭建了一台自己的Ngrok服务器,可以分享给大家用于测试,但为了保证稳定,不可能分享很多,先到先得。
编译
1.为mac安装go环境 这个简单,直接用homebrew安装,使用 ‘brew install go’一键安装,安装完后配置环境变量。
2.在git下载Ngrok源码 懒得clone,直接去git上下载 https://github.com/inconshreveable/ngrok 下载完成后解压到工作目录。
3.生成openssl证书 为了方便复制,先cd到刚刚的工作目录,运行下面的命令生成公钥私钥。
1
2
3
4
5
|
openssl genrsa -out rootCA.key 2048 openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=ngrok.facebeek.cn" -days 5000 -out rootCA.pem
openssl genrsa -out server.key 2048 openssl req -new -key server.key -subj "/CN=ngrok.facebeek.cn" -out server.csr
openssl x509 -req - in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000
|
其中ngrok.facebeek.cn是我绑定的二级域名。务必替换成你自己的。
生成完成后将对应的证书复制到assets文件夹下的对应目录,替换原有的证书。如不替换,域名与证书不一致,客户端与服务端是没法正常连接的。
1
2
3
|
cp rootCA.pem assets /client/tls/ngrokroot .crt
cp server.crt assets /server/tls/snakeoil .crt
cp server.key assets /server/tls/snakeoil .key
|
4.修改log下的logger.go go编译时会下载对应依赖项,如果依赖了code.google.com下的,你懂的。这里将ngrok/src/ngrok/log/logger.go中的第四行更改为“github.com/keepeye/log4go”,如果源码中已经是github的地址,那就不用更改了。
5.编译服务端与客户端 由于go语言的特性,在编译时直接生成机器码,所以在运行过程中并不需要go的环境。在ngrok目录下,运行一下命令分别生成对应的客户端/服务端。
1
2
3
4
5
6
7
8
|
#win服务端 GOOS=windows GOARCH=386 make release-server
#win客户端 GOOS=windows GOARCH=386 make release-client
#linux服务端 GOOS=linux GOARCH=386 make release-server
#linux客户端 GOOS=linux GOARCH=386 make release-client
|
生成完成后,在工作目录的bin文件夹下,产生对应的文件。以编译win平台为例,会产生“ngrok.exe”与“ngrokd.exe”这两个文件,前者客户端,后者需要运行在服务器上。
服务器端部署
将ngrokd.exe复制到服务器上,偷懒写个bat
1
|
C:\ngrokd.exe -domain= "ngrok.facebeek.cn" -httpAddr= ":801" -httpsAddr= ":802" -tunnelAddr= ":4443"
|
如上,将ngrokd.exe放至c盘根目录上,绑定的域名换成自己的域名,http使用801端口,https使用802端口,供客户端连接的管道端口设置为4443端口。
运行bat,得到下图,说明运行正常。
客户端连接
将ngrok.exe复制至客户端,创建ngrok.cfg配置文件
1
2
|
server_addr: "ngrok.facebeek.cn:4443"
trust_host_root_certs: false
|
将server_addr替换为对应的地址。
偷懒再写个bat,其中指定配置文件,使用的域名前缀为test,映射本地的80端口。以我的配置为例,当用户访问test.ngrok.facebeek.cn域名时,将会显示本机80端口所显示的内容。
1
|
D:\ngrok\ngrok.exe -config=. /ngrok .cfg -subdomain= test 80
|
运行bat,得到下图,表示连接正常。
连接成功后,在浏览器中输入test.facebeek.cn:801,可以正常访问。
大体上Ngrok的服务已经可以开始使用了。
IIS的URL重写
由于服务器上同时运行着IIS,故服务端Ngrok启动时无法使用80端口,所以在上面,我使用了801作为Ngrok服务器的http端口,但在上图中,我并没有在URL后添加801端口,因此在这里,我使用了IIS的代理功能。在调试开发微信等必须使用80端口的应用时,这一点很有必要。
首先需要为IIS安装ARR,下载地址(http://www.iis.net/downloads/microsoft/application-request-routing)。
安装完成后,开启ARR,如下图。
创建网站,绑定信息如下,由于IIS不支持*.XXX.XXX.cn这类格式,所以为了泛解析只能绑定*。
选择URL重写。
添加规则,用正则表达式匹配URL,模式^(.*),表示匹配任意URL,在下方添加一条匹配条件,条件输入填写{HTTP_HOST},模式填写如下,表示后匹配“.ngrok.facebeek.cn”的域名。添加重写规则为http://{C:0}:801/{R:1}。如下图
经过以上的操作,可以将80端口上的请求重写到801端口上,完成反向代理。
最后分享台我部署好的Ngrok服务器
未了保证原系统的稳定,暂时不分享新的Ngrok用户,见谅
转载请注明出处 huhuhuo的博客园
地址:http://www.cnblogs.com/linhan/p/5440790.html