环境准备


首先需要下载go环境,这里是下载的 go1.8.linux-amd64.tar.gz 的版本,其他版本可以在GO的官方网站复制对应的下载链接

1
wget http://www.golangtc.com/static/go/1.8/go1.8.linux-amd64.tar.gz

将下载完的压缩解压到服务器 /usr/local/go 即可,然后将/usr/local/go/bin/* 复制到 /usr/bin/

1
cd /usr/local/src/

下载ngrok源代码,在github上能够搜到ngrok项目的最新版本

1
git clone https://github.com/inconshreveable/ngrok.git

设置GOPATH环境变量

1
export GOPATH=/usr/local/src/ngrok/

设置域名变量,为了后续方便,建议这里使用一级域名,因为ngrok会需要你的二级域名做为host(client不填二级域名的话ngrok会随机给你分配一个二级域名)

1
export NGROK_DOMAIN="yourdomain.com"

打开ngrok目录,环境准备完成

1
cd ngrok

开始编译


首先为根域名生成证书

1
openssl genrsa -out rootCA.key 2048
1
2
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
1
2
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
1
2
3
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp device.crt assets/server/tls/snakeoil.crt
cp device.key assets/server/tls/snakeoil.key

编译服务端比较容易,先指定一下环境变量,然后再make:

1
GOOS=linux GOARCH=amd64
1
make release-server

编译成功后,应该可以在 /usr/local/src/ngrok/bin 下生成了一个 ngrokd 可执行文件,这就是我们的服务端了,现在启动服务端试试:

1
bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":80"

如果没有报错的话,会出现以下输出:

1
2
3
4
5
[10:05:48 CST 2015/04/17]
[INFO] (ngrok/log.(*PrefixLogger).Info:83) [registry] [tun] No affinity cache specified
[10:05:48 CST 2015/04/17] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting every 30 seconds
[10:05:48 CST 2015/04/17] [INFO] (ngrok/log.Info:112)
Listening for public http connections on [::]:8000[10:05:48 CST 2015/04/17] [INFO] (ngrok/log.Info:112) Listening for public https connections on [::]:443[10:05:48 CST 2015/04/17] [INFO] (ngrok/log.Info:112) Listening for control and proxy connections on [::]:4443

编译客户端


现在先 ctrl+c 退出,我们还需要编译客户端呢。
首先编译linux客户端:

1
2
3
cd /usr/local/src/ngrok
GOOS=linux GOARCH=amd64
make release-client

同理,这里的amd64是64位系统,32位改成386#应该会在 bin/ 目录下生成ngrok客户端程序

如果是windows下的客户端,是这样的:

windows 环境有点小问题,需要go1.4版本才可以执行这里后续再更新详细步骤

1
2
3
4
5
cd /usr/local/go/src
GOOS=windows GOARCH=amd64 ./make.bash
cd -
GOOS=windows GOARCH=amd64
make release-client

同理,这里的amd64是64位系统,32位改成386#应该会在 bin/windows_amd64 目录下生成ngrok客户端程序

运行客户端


现在我们来到自己电脑上,通过scp命令将客户端文件复制到本地,并准备启动客户端。在启动之前,我们需要为客户端编写一个配置文件 ngrok.cfg :

1
2
server_addr: "ngrok.yourdomain.com:4443"
trust_host_root_certs: false

然后启动客户端,假设我们要分配一个二级域名 test.yourdomain.com 执行以下命令:

1
./ngrok -config=./ngrok.cfg -subdomain=test 80

解释一下参数:
-config 就是上面配置文件ngrok.cfg的路径-subdomain 就是需要分配域名的前缀部分80 就是本机websever的端口,比如apache监听的端口,一会ngrok会将请求映射到该端口上。

如果没错误,应该会出现以下的输出:

1
2
3
4
5
6
7
Tunnel Status online
Version 1.7/1.7
Forwarding http://test.ngrok.ekan001.com:8000 -> 127.0.0.1:80
Forwarding https://test.ngrok.ekan001.com:8000 -> 127.0.0.1:80
Web Interface 127.0.0.1:4040
# Conn 0
Avg Conn Time 0.00ms

加入开机启动项


由于我的服务端是Ubuntu的环境,运行在其他操作上的小伙伴可以参考下:
rc.local脚本是一个ubuntu开机后会自动执行的脚本,我们可以在该脚本内添加命令行指令。
该脚本位于/etc/路径下,需要root权限才能修改。该脚本具体格式如下:

将如下命令添加到脚本中即可开机自启动

1
/usr/local/src/ngrok/bin/ngrokd -domain="yourdomain.com" -httpAddr=":80"

本文地址: http://despot-zaza.github.io/2017/05/09/搭建ngrok将你的应用发布到公网上吧/