1.使用场景
将闲置的电脑变成服务器,在家中联网的电脑由于没有固定的IP,所以不能从外网访问;而个人购买的便宜的云主机可能因为配置低,在搭建网站时备受局限,这时使用ngrok搭建个人服务器就有用武之地了。将云服务器做为具有固定IP的代理,个人电脑作为部署网站的服务器,以后在更换云服务器时也特别方便。
2. 必备物料
- a. 云服务器或VPS:如阿里云,腾讯云。即云服务器会有一个固定IP,在该服务器上搭建ngrok服务端。
- b. 一个备案的域名。将域名解析到云服务器。剩下的就交给ngrok和nginx了。
3.环境准备
- a. 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
- b. go语言环境
//请下载合适自己的go语言包 我是centos 7 64位 所以选择以下包 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 PATH=$PATH:/usr/local/go/bin source /etc/profile //检测是否安装成功go go version
4. 搭建ngrok服务器
- a. 下载ngrok源码包
cd /usr/local cd /usr/local git clone https://github.com/inconshreveable/ngrok.git
- b. 生成证书 生成并替换源码里默认的证书,注意域名修改为你自己的。 (之后编译出来的服务端客户端会基于这个证书来加密通讯,保证了安全性)
cd /usr/local/ngrok
NGROK_DOMAIN="kzone.top" openssl genrsa -out base.key 2048 openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=$NGROK_DOMAIN" -out base.pem openssl genrsa -out server.key 2048 openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr openssl x509 -req -in server.csr -CA base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt
- c. 替换原证书
Yes|cp base.pem /usr/local/ngrok/assets/client/tls/ngrokroot.crt yes|cp server.crt /ngrok/ngrok/assets/server/tls/snakeoil.crt yes|cp server.key /ngrok/ngrok/assets/server/tls/snakeoil.key
- d. 编译生成ngrok
go env //查看环境 GOOS=linux GOARCH=amd64 make release-server
如果一切正常,ngrok/bin 目录下应该有 ngrok、ngrokd 两个可执行文件。 ngrokd 为服务器端使用的,ngrok 是 linux 客户端使用的
- e. 运行测试 注意将域名替换为自己的
./bin/ngrokd -tlsKey="assets/server/tls/snakeoil.key" -tlsCrt="assets/server/tls/snakeoil.crt" -domain="kzone.top" -httpAddr=":8081" -httpsAddr=":8082" -tunnelAddr=":8083" #参数说明: #-domain 访问ngrok是所设置的服务地址生成证书时那个 #-httpAddr http协议端口 默认为80 #-httpsAddr https协议端口 默认为443 (可配置https证书) #-tunnelAddr 通道端口 默认4443
在浏览器中输入网址 http://www.kzone.top:8081 就可以访问到 ngrok 提供的转发服务。(为了使用方便,建议把域名泛解析到 VPS 上,这样能方便地使用不同子域转发不同的本地服务。)如果浏览器中显示Tunnel liyuans.com:8081 not found,这说明ngrok服务器都已经正常启动了。下面就可以准备ngrok客户端了。
5. 添加到systemctl 服务
cd /usr/lib/systemd/system/
在文件夹下创建 ngrok.service 文件
[Unit] Description=Share local port(s) with ngrok After=syslog.target network.target [Service] PrivateTmp=true Type=simple Restart=always RestartSec=1min StandardOutput=null StandardError=null ExecStart=/usr/local/ngrok/bin/ngrokd -tlsKey=/usr/local/ngrok/assets/server/tls/snakeoil.key -tlsCrt=/usr/local/ngrok/assets/server/tls/snakeoil.crt -domain=kzone.top -httpAddr=:8081 -httpsAddr=:443 -tunnelAddr=:4443 %i ExecStop=/usr/bin/killall ngrok [Install] WantedBy=multi-user.target
systemctl enable ngrok.service //加入开机启动 systemctl daemon-reload //重新载入 systemd,扫描新的或有变动的单元 Systemctl start ngrok //启动ngrok服务
6. 客户端编译和使用
- a. 编译生成客户端程序 根据客户端操作系统环境选择生成命令,本测试电脑为 linux 64位,故使用以下命令(注意是在ngrok服务端操作哦)
GOOS=linux GOARCH=amd64 make release-client 编译成功后会在ngrok/bin/下面生成一个ngrok文件,将其拷贝到客户端电脑的/usr/local/ngrok中 #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
- b. 配置文件ngrok.cfg 在/usr/local/ngrok中创建ngrok.cfg
server_addr: "kzone.top:4443" trust_host_root_certs: false tunnels: http: subdomain: "www" proto: http: "80" https: subdomain: "ssl" proto: https: "443" tcp: remote_port: 5555 proto: tcp: "8001" mysql: remote_port: 8306 proto: tcp: "3306" ssh: remote_port: 2222 proto: tcp: "22" ftp: remote_port: 2221 proto: tcp: "21"
- c. 启动客户端服务
ngrok -config=ngrok.cfg start web #启动web服务 ngrok -config=ngrok.cfg start tcp #启动tcp服务 ngrok -config=ngrok.cfg start web tcp #同时启动两个服务 ngrok -config=ngrok.cfg start-all #启动所有服务 //出现以下内容表示链接成功: ngrok (Ctrl+C to quit) Tunnel Status online Version 1.7/1.7 Forwarding tcp://kzone.top:2221 -> 127.0.0.1:21 Forwarding http://www.kzone.top:8081 -> 127.0.0.1:80 Forwarding https://ssl.kzone.top -> 127.0.0.1:443 Forwarding tcp://kzone.top:5555 -> 127.0.0.1:8001 Forwarding tcp://kzone.top:8306 -> 127.0.0.1:3306 Forwarding tcp://kzone.top:2222 -> 127.0.0.1:22 Web Interface 127.0.0.1:4040 # Conn 0.00ms Avg Conn Time 0.00ms
7. 添加到systemctl 服务
在 /usr/lib/systemd/system 创建ngrok.service
[Unit] Description=Share local port(s) with ngrok After=syslog.target network.target [Service] PrivateTmp=true Type=simple Restart=always RestartSec=1min StandardOutput=null StandardError=null ExecStart=/usr/local/ngrok/ngrok -config /usr/local/ngrok/ngrok.cfg start-all %i ExecStop=/usr/bin/killall ngrok [Install] WantedBy=multi-user.target
systemctl enable ngrok.service //加入开机启动 systemctl daemon-reload //重新载入 systemd,扫描新的或有变动的单元 Systemctl start ngrok //启动ngrok服务
8. 总结:
ngrok服务端作为中间代理将请求的地址转发到ngrok客户端,这样就可以在外网访问到家庭局域网中的电脑啦!配合nginx功能会更强大。
附录:
我在部署中遇到的问题,当服务端正常启动后,如果客服端无法联通时,首先检查下客户端电脑是否能上外网,
ping www.baidu.com
如果无法联通, ping一下百度的ip地址,如果能联通说明dns解析有问题,试着在配置文件中加上dns,
service network restart #重启服务。
ngrok(version 1.7) 百度网盘地址
链接:https://pan.baidu.com/s/17sncmqO9jAZZh0UmORShdg 提取码:pw9w
版权声明:如无特殊说明,文章均为本站原创,转载请注明出处
本文链接:http://kzone.top/article/ngrok/