当你正在开发第三方异步推送通知相关功能时是不是因为你在公司内网而无法测试呢? 所以ngrok的内网穿透就显神威了! 当然国内也有一些类似服务提供, 比如花生壳;网上有ngrok的国内服务了,不过有时候不稳定。 下面跟我一起来架设自己的ngrok服务吧
分步指南
你需要的物料
- 一台有固定IP的服务器,物理服或者云服都可以
- 一个域名
- 一个聪明人!别找了就是你!
服务器环境准备
centos为例基础环境安装
编译依赖安装
yum -y install zlib-devel openssl-devel perl hg cpio expat-devel gettext-devel curl curl-devel perl-ExtUtils-MakeMaker hg wget gcc gcc-c++ git
go语言环境
wget https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.8.3.linux-amd64.tar.gz
vim /etc/profile
//添加以下内容:
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
export NGROK_DOMAIN="你的域名"
//保存退出
//使其生效
source /etc/profile
//检测是否安装成功go
go version
安装ngrok服务器
下载源码
cd /home
wget https://github.com/inconshreveable/ngrok/archive/master.zip
unzip master.zip
mv ngrok-master ngrok
cd ngrok
修改证书
mkdir cert
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
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
cp rootCA.pem ../assets/client/tls/ngrokroot.crt
cp device.crt ../assets/server/tls/snakeoil.crt
cp device.key ../assets/server/tls/snakeoil.key
编译服务端
cd ..
go env //查看环境
//编译服务端
GOOS=linux GOARCH=amd64 make release-server
编译客户端
GOOS=windows GOARCH=amd64 make release-client
#编译成功后会在ngrok/bin/下面生成一个windows_amd64目录下面有ngrok.exe
#Linux 平台 32 位系统:GOOS=linux GOARCH=386
#Linux 平台 64 位系统:GOOS=linux GOARCH=amd64
#Windows 平台 32 位系统:GOOS=windows GOARCH=386
#Windows 平台 64 位系统:GOOS=windows GOARCH=amd64
#MAC 平台 32 位系统:GOOS=darwin GOARCH=386
#MAC 平台 64 位系统:GOOS=darwin GOARCH=amd64
#ARM 平台:GOOS=linux GOARCH=arm
运行服务端
测试运行
/home/ngrok/bin/ngrokd -tlsKey="assets/server/tls/snakeoil.key" -tlsCrt="assets/server/tls/snakeoil.crt" -domain="$NGROK_DOMAIN" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443"
#参数说明:
#-domain 访问ngrok是所设置的服务地址生成证书时那个
#-httpAddr http协议端口 默认为80
#-httpsAddr https协议端口 默认为443 (可配置https证书)
#-tunnelAddr 通道端口 默认4443
后台运行
nohup /home/ngrok/bin/ngrokd -tlsKey="assets/server/tls/snakeoil.key" -tlsCrt="assets/server/tls/snakeoil.crt" -domain="$NGROK_DOMAIN" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443" > /dev/null 2>&1 &
#参数说明:
#-domain 访问ngrok是所设置的服务地址生成证书时那个
#-httpAddr http协议端口 默认为80
#-httpsAddr https协议端口 默认为443 (可配置https证书)
#-tunnelAddr 通道端口 默认4443
运行客户端
- 新建文本文件ngrok.cfg
- 配置文件
server_addr: "你的域名:4443"
trust_host_root_certs: false
使用测试
- 命令行操作
ngrok -config=ngrok.cfg -subdomain=test 80
//出现以下内容表示成功链接:
ngrok
Tunnel Status online
Version 1.7/1.7
Forwarding http://test.你的域名:80 -> 127.0.0.1:80
Forwarding https://test.你的域名:80 -> 127.0.0.1:80
Web Interface 127.0.0.1:4040
# Conn 0
Avg Conn Time 0.00ms
复杂配置ngrok.cfg
- 配置文件
server_addr: "你的域名:4443"
trust_host_root_certs: false
tunnels:
#服务器www子域名映射到本机80
http:
subdomain: "www"
proto:
http: "80"
#服务器www子域名映射到本机443
https:
subdomain: "www"
proto:
https: "443"
#服务器3889映射到本机3389
tcp:
proto:
tcp: "3889"
remote_port: 3389
#服务器的2222映射到本机22
ssh:
remote_port: 2222
proto:
tcp: "22"
- 启动方法
ngrok -config=ngrok.cfg start http #启动http服务
ngrok -config=ngrok.cfg start tcp #启动tcp服务
ngrok -config=ngrok.cfg start http tcp #同时启动两个服务
ngrok -config=ngrok.cfg start-all #启动所有服务
配合nginx使用
假设ngrok的http端口为4080, 则nginx配置如下
#后台启动
nohup /home/soft/ngrok/bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":4080" > /dev/null 2>&1 &
location / {
proxy_pass http://127.0.0.1:4080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host:4080;
proxy_set_header X-Nginx-Proxy true;
proxy_set_header Connection "";
}