前言
上一篇我们介绍了一下树莓派上的全局代理,很多场合中,我们只需要一个公网 ip 地址做反向代理,便于访问到部署应用的生产服务器。这时候用 ngrok 做内网穿透就很便利。
ngrok 是一个反向代理程序,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放。
安装 ngrok
官网列出了一些主要的应用场景:
Public URLs for
- SSH access to your Raspberry Pi.
- building webhook integrations.
- exposing your local web server.
- testing on mobile devices.
- sending previews to clients.
- testing your chatbot.
1. 注册账号
首先在官网上注册一个账号,也可以用google账号或是github账号授权登录。登录后,就能看见数据面板了。
2. 下载对应的安装包
在树莓派上,我们之前选择的是官方32位版本的系统,所以下载 Linux (ARM) 版本。这里下载的是客户端程序,所以需要下载待发布的 APP 所在平台对应的安装包。
这里下载到树莓派上,解压程序
mkdir ngrok
cd ngrok
unzip ngrok-stable-linux-arm.zip
3. 获取认证授权码
在右侧菜单中,选择 Authentication --> Your Authtoken,复制自己的认证码。
4. 连接账号
运行以下命令添加刚才复制的认证码到默认配置文件 ngrok.yml 中
./ngrok authtoken 替换成复制的Authentication
配置文件生成完毕。
远程登录 ssh
1. 转发 SSH 服务
./ngrok tcp 22
开启了服务,绑定到远端的 tcp://2.tcp.ngrok.io:14324 上。
Tip:
注意,现在 ngrok 官网需要开启 VPN 或 Polipo 才能访问了。
2. 远程登录 ssh
在 ngrok 的数据面板中,可以找到连接的状态信息,复制 URL 准备远程访问。
在主电脑上(win10),开一个shell窗口登录一下
ssh pi@2.tcp.ngrok.io -p 14324
看到了之前在树莓派上配置的 openvino 初始化信息,已经登录成功了。
发布 web 服务
1. 转发 web 服务
./ngrok http 80
一句话就把本地的 web 服务放到公网上去了。
2. 远程访问 jupyter notebook
有时候需要临时测试后端服务的功能,但前端必须采用 https 才能访问,比如微信小程序之类,就可以用 ngrok 来转发在封装一下。我们用 notebook 来测试一下。
先启动 notebook
jupyter notebook
notebook 默认端口运行在 8888,记得复制 token 后面需要用到。
Tip:
需要修改用户主目录下~/.jupyter/jupyter_notebook_config.py文件,配置项 c.NotebookApp.allow_remote_access = True ,启用远程访问功能。
3. 转发 jupyter notebook 服务
./ngrok http 8888
ngrok 服务器将随机域名绑定到 notebook 的 8888 端口上,同时提供了 http 和 https 服务。这省去了一堆配置 ssl 证书等等一系列操作,对于移动端的APP调试和演示来说,极大的提高了效率。
4. 远程登录
在主电脑(win10)上开浏览器,登录 https://c1a80df740ac.ngrok.io。提示需要输入登录验证,也可以改为密码方式登录,具体操作可以点击文档链接查看详情。
5. 验证身份
填入之前复制的 token 信息,点击登录,验证成功后,就能正常使用了。
完美!
自建 ngrok 服务端
前面的操作都需要依赖官网的 ngrok 服务,考虑到现在被和谐的状态,我们可以在自己的云服务器上建一个 server 端,提供反向代理服务。
1. 下载源码
现在官网的 ngrok 是2.0版本,而开源版本是1.0的,注意客户端版本差异。
git clone https://github.com/tutumcloud/ngrok.git myngrok
cd myngrok
2. 生成 ssl 证书
国内云服务厂商一般都提供免费的 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
3. 配置环境
编译需要用到 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 验证安装结果。
4. 编译程序
make release-all
5. 运行服务器
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,功能更为强大,数据面板也很漂亮,配置起来大同小异。这里就不过多赘述了,待用到之时查一下官网就行了。
软件下载
本期相关文件资料,可在公众号后台回复:“rpi11”,获取下载链接。
下一篇预告
环境问题基本解决了
我们将继续在树莓派上,
开启 AI 项目实战开发之旅,
敬请期待...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。