环境准备
首先需要下载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/
下载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
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:
编译成功后,应该可以在 /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将你的应用发布到公网上吧/