上一篇我们介绍了一下树莓派上的全局代理,很多场合中,我们只需要一个公网 ip 地址做反向代理,便于访问到部署应用的生产服务器。这时候用 ngrok 做内网穿透就很便利。
ngrok 是一个反向代理程序,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放。
官网列出了一些主要的应用场景:
Public URLs for
首先在官网上注册一个账号,也可以用google账号或是github账号授权登录。登录后,就能看见数据面板了。
在树莓派上,我们之前选择的是官方32位版本的系统,所以下载 Linux (ARM) 版本。这里下载的是客户端程序,所以需要下载待发布的 APP 所在平台对应的安装包。
这里下载到树莓派上,解压程序
mkdir ngrok cd ngrok unzip ngrok-stable-linux-arm.zip
在右侧菜单中,选择 Authentication --> Your Authtoken,复制自己的认证码。
运行以下命令添加刚才复制的认证码到默认配置文件 ngrok.yml 中
./ngrok authtoken 替换成复制的Authentication
配置文件生成完毕。
./ngrok tcp 22
开启了服务,绑定到远端的 tcp://2.tcp.ngrok.io:14324 上。
Tip:
注意,现在 ngrok 官网需要开启 VPN 或 Polipo 才能访问了。
在 ngrok 的数据面板中,可以找到连接的状态信息,复制 URL 准备远程访问。
在主电脑上(win10),开一个shell窗口登录一下
ssh pi@2.tcp.ngrok.io -p 14324
看到了之前在树莓派上配置的 openvino 初始化信息,已经登录成功了。
./ngrok http 80
一句话就把本地的 web 服务放到公网上去了。
有时候需要临时测试后端服务的功能,但前端必须采用 https 才能访问,比如微信小程序之类,就可以用 ngrok 来转发在封装一下。我们用 notebook 来测试一下。
先启动 notebook
jupyter notebook
notebook 默认端口运行在 8888,记得复制 token 后面需要用到。
Tip:
需要修改用户主目录下~/.jupyter/jupyter_notebook_config.py文件,配置项 c.NotebookApp.allow_remote_access = True ,启用远程访问功能。
./ngrok http 8888
ngrok 服务器将随机域名绑定到 notebook 的 8888 端口上,同时提供了 http 和 https 服务。这省去了一堆配置 ssl 证书等等一系列操作,对于移动端的APP调试和演示来说,极大的提高了效率。
在主电脑(win10)上开浏览器,登录 https://c1a80df740ac.ngrok.io。提示需要输入登录验证,也可以改为密码方式登录,具体操作可以点击文档链接查看详情。
填入之前复制的 token 信息,点击登录,验证成功后,就能正常使用了。
完美!
前面的操作都需要依赖官网的 ngrok 服务,考虑到现在被和谐的状态,我们可以在自己的云服务器上建一个 server 端,提供反向代理服务。
现在官网的 ngrok 是2.0版本,而开源版本是1.0的,注意客户端版本差异。
git clone https://github.com/tutumcloud/ngrok.git myngrok cd myngrok
国内云服务厂商一般都提供免费的 SSL 证书服务,绑定你所在云服务的域名,这里也可以自己生成自签名证书文件。
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 server.key 2048 openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000
然后把证书拷贝到本目录的assets下:
cp rootCA.pem assets/client/tls cp server.crt assets/server/tls cp server.key assets/server/tls
编译需要用到 GO 语言,先安装依赖
sudo apt-get install golang-1.9 mkdir ~/gocode
修改配置文件
sudo nano /etc/profile
添加环境变量如下:
export GOROOT=/usr/lib/go-1.9 export GOPATH=/home/pi/gocode export PATH=$PATH:$GOROOT/bin
然后source /etc/profile生效后,安装完后使用命令 go version 验证安装结果。
make release-all
bin 目录下 ngrokd 是服务器端程序,ngrok 是客户端程序
./ngrokd -tlsKey="/home/pi/ngrok/server.key" -tlsCrt="/home/pi/ngrok/server.crt" -domain="$NGROK_DOMAIN" -httpAddr=:19091 -httpsAddr=:19092 -tunnelAddr=:19094
tunnelAddr 表示和客户端链接的通道端口,默认是4443。这里指定了端口号,要保证防火墙开启这些端口。
服务器开启成功,等待连接中,然后就可以用 ngrok 客户端,配置 ngrok.cfg 文件,如前文所述,正常进行端口绑定操作了。
Tip:
类似功能的还有 frp,功能更为强大,数据面板也很漂亮,配置起来大同小异。这里就不过多赘述了,待用到之时查一下官网就行了。
本教程基于树莓派4B打造一个稳定的软硬件开发环境,再在其上构建AI应用。比如选择构建OpenCV 4.4,pyTorch 1.6和1.7,Tensorflow 2.1,然后在上面跑yolo v5应用,用intel NCS2加速等等…