在国内开发微信公众号、企业号以及做前端开发的朋友想必对ngrok都不陌生吧,就目前来看,ngrok可是最佳的在内网调试微信服务的tunnel工 具。记得今年春节前,ngrok.com提供的服务还一切正常呢,但春节后似乎就一切不正常了。ngrok.com无法访问,ngrok虽然能连上 ngrok.com提供的服务,但微信端因为无法访问ngrok.com,导致消息一直无法发送到我们的服务地址上,比如xxxx.ngrok.com。 这一切都表明,ngork被墙了。没有了ngrok tunnel,一切开始变得困难且没有效率起来。内网到外部主机部署和调试是一件慢的让人想骂街的事情。
ngrok不能少。ngrok以及其服务端ngrokd都是开源的,之前我也知道通过源码可以自搭建ngrok服务。请求搜索引擎后,发现国内有个朋友已经搭建了一个www.tunnel.mobi的ngrok公共服务,与ngrok.com类似,我也实验了一下。
编写一个ngrok.cfg,内容如下:
server_addr: "tunnel.mobi:44433"
trust_host_root_certs: true
用ngrok最新客户端1.7版本执行如下命令:
$ngrok -subdomain tonybaiexample -config=ngrok.cfg 80
可以顺利建立一个tunnel,用于本机向外部提供"tonybaiexample.tunnel.mobi"服务。
Tunnel Status online
Version 1.7/1.7
Forwarding http://tonybaiexample.tunnel.mobi -> 127.0.0.1:80
Forwarding https://tonybaiexample.tunnel.mobi -> 127.0.0.1:80
Web Interface 127.0.0.1:4040
# Conn 0
Avg Conn Time 0.00ms
而且国内的ngrok服务显然要远远快于ngrok.com提供的服务,消息瞬间即达。
但这是在公网上直接访问的结果。放在公司内部,我看到的却是另外一个结果:
Tunnel Status reconnecting
Version 1.7/
Web Interface 127.0.0.1:4040
# Conn 0
Avg Conn Time 0.00ms
我们无法从内网建立tunnel,意味着依旧不方便和低效,因为很多基础服务都在内网部署,内外网之间的交互十分不便。但内网连不上tunnel.mobi也是个事实,且无法知道原因,因为看不到server端的连接错误日志。
于是我决定自建一个ngrok服务。
一、准备工作
搭建ngrok服务需要在公网有一台vps,去年年末曾经在Amazon申请了一个体验主机EC2,有公网IP一个,这次就打算用这个主机作为ngrokd服务端。
需要一个自己的域名。已有域名的,可以建立一个子域名,用于关联ngrok服务,这样也不会干扰原先域名提供的服务。(不用域名的方式也许可以,但我没有试验过。)
搭建的参考资料主要来自下面三个:
1) ngrok的官方SELFHOST指南:https://github.com/inconshreveable/ngrok/blob/master/docs/SELFHOSTING.md
2) 国外一哥们的博客:http://www.svenbit.com/2014/09/run-ngrok-on-your-own-server/
3) "海运的博客"中的一篇文章:http://www.haiyun.me/archives/1012.html
二、实操步骤
我的AWS EC2实例安装的是Ubuntu Server 14.04 x86_64,并安装了golang 1.4(go versi