首页
使用 supervisor 配置 ngrok 内网穿透为守护进程

需求

最近在做文件在线预览的功能,需要借助到 Office Online。在它提供的接口后面加上需要预览的文件在线地址就可以实现在线预览了。

https://view.officeapps.live.com/op/view.aspx?src=文件地址

这就需要我们的文件地址是 Office Online 能够访问到的。所以在本地开发的时候使用了[ngrok][1]来实现内网穿透,以便很方便地进行调试。

ngrok

ngrok 是一款免费的内网穿透工具。当然,它也提供一些付费的高级服务。这里,我们只用到它的免费功能。

它的基本使用很简单,下载解压后就可以使用了,基本不需要配置什么东西。这里以Ununtu系统为例。

# 下载
curl https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
# 解压
unzip /path/to/ngrok.zip
# 启动(转发本地的 http://localhost:4000 服务)
./ngrok http localhost:4000

执行后会看到以下的界面

image_1eeaeem4nmv71lbtnu1tuv1goh9.png-26.4kB

访问 http://addbf53b4ebc.ngrok.io 即可访问到本地的http://localhost:4000

supervisor

Supervisor 是一款进程控制工具,主要用它来实现把ngrok作为守护进程在后台运行。

安装

它的安装方式有很多种,这里使用apt命令来安装。更多的安装方式可以去文档 查看。

apt-cache show supervisor
apt install supervisor
supervisord -v

使用

supervisor安装完后,会生成三个可执行程序:supervisordsupervisorctlecho_supervisord_conf。它们所在的位置如下:

$ which supervisord
/usr/bin/supervisord

$ which supervisorctl
/usr/bin/supervisorctl

$ which echo_supervisord_conf
/usr/bin/echo_supervisord_conf
  • supervisord : 用于管理 supervisor 本身的服务
  • supervisorctl : supervisor 管理后台进程的服务
  • echo_supervisord_conf:用于生成 supervisor 的配置文件

配置文件及日志存放位置:

# 配置文件
/etc/supervisor

# 日志
/var/log/supervisor/

supervisorctl 命令

# 状态查询,所有的服务状态
supervisorctl status 
# 后面可以加上具体的服务名称,只查询该服务的状态
supervisorctl status ngrok
# 停止服务
supervisorctl stop ngrok      
# 启动服务
supervisorctl start ngrok  
# 服务重启
supervisorctl restart ngrok     
# 重新加载服务,主要用于配置文件修改后
supervisorctl reoload ngrok 

新增 ngrok 守护进程

通过前面对ngroksupervisor的了解,我们可以开始使用supervisorngrok添加到系统的守护进程中。

注册 ngrok 并生成账户配置

ngrok 可以下载后直接使用,但有一个很严重的问题是它提供的免费域名隔一段时间后会失效。注册账户后,可以保持免费的域名一直可以使用,不需要付费。

# 生成账户配置
./ngrok authtoken yourtoken  

Authtoken saved to configuration file: /root/.ngrok2/ngrok.yml

新增 ngrok 配置文件

vi /etc/supervisor/conf.d/ngrok.conf

# 项目名称,对应前面supervisorctl命令里的服务名称
[program:ngrok] 
# 目录
directory = /usr/local/bin/
# 执行的命令
command = /usr/local/bin/ngrok http -log stdout --authtoken yourtoken 192.168.0.200:4000
# 在 supervisord 启动的时候也自动启动
autostart = true
# 启动 5 秒后没有异常退出,就当作已经正常启动了
startsecs = 5
# 程序异常退出后自动重启
autorestart = true
# 启动失败自动重试次数,默认是 3
startretries = 3
# 执行命令的用户
user = root
# 把 stderr 重定向到 stdout,默认 false
redirect_stderr = true
# stdout 日志文件大小,默认 50MB
stdout_logfile_maxbytes = 50MB
# stdout 日志文件备份数
stdout_logfile_backups = 20
# stdout 日志文件
stdout_logfile = /var/log/supervisor/ngrok.log

注意事项:

  1. 执行ngrok命令需加上-log stdout参数,不然服务启动后不会输出日志的

  2. ngrok--authtoken 参数为注册账号后,app分配的。使用该参数后,ngrok的域名会一直保持。对于没有注册账号直接使用,一段时间后,域名会失效。

运行

# 加载 ngrok 服务
supervisorctl reoload ngrok

# 查看生成的域名
cat /var/log/supervisor/ngrok.log

参考文档:

  1. https://ngrok.com/docs
  2. https://ngrok.com/download
  3. http://supervisord.org/
  4. https://zhuanlan.zhihu.com/p/147305277
  5. http://supervisord.org/configuration.html
  6. https://gist.github.com/ifnull/6a1f6602c99816757f65a26c278a1dce