管理多个 Supervisor——集群管理

继前两篇文章(Supervisor 基础监控并报警)后,用 Supervisor 管理单个机器上的进程没啥问题了。但是 A 机器上的 Supervisor 只能管理 A 机器上的进程,管理不了 B 上边的。在当今这个云的时代,大家都玩集群了,如果用其管理的话,需要打开 N 个网页去各各机器上的进程显然是不现实的(OP 们要哭晕在厕所了)。
其实之前仔细看配置文件的话,应该会想到一种解决的办法——通过 XML-RPC 接口

nodervisor-dashboard

现有解决方案

本来以为网上解决方案会比较多呢,结果 google 搜到的都是一些不相关的(因为 Supervisor 本来就是一个单词),百度就找到一篇《Supervisor集群管理WEB UI》,大致看了一下,可行,不过我是主要做后端开发的,php 一窍不通,决定去官网看看。
官网上关于多实例管理的方案还是那四个:(http://supervisord.org/plugins.html#dashboards-and-tools-for-multiple-supervisor-instances)

  • Django-Dashvisor(2011)
    Web-based dashboard written in Python. Requires Django 1.3 or 1.4.
  • Nodervisor(2015)
    Web-based dashboard written in Node.js.
  • Supervisord-Monitor(2015)
    Web-based dashboard written in PHP.
  • SupervisorUI(2012)
    Another Web-based dashboard written in PHP.

四个项目,最后一次更新的年份我已经标注在后边的括号里了。这三种语言中,其中我最熟悉的也就 Python 了,不过这项目已经4年没更新了,pass 掉。四个中“最新”的应该是 Supervisord-Monitor。又看了一下 Nodervisor 的代码,虽然没接触过 Node.js,但是我还是有较好的 JavaScript 基础的,代码看起来并不吃力,并且服务器上都安装过 nodejs 环境,就用它了。(它若不好用就准备自己用 Golang 写一个了。。。)

安装

安装 Nodervisor 没什么复杂的,按照其 GitHub 上的 README 安装就好了,步骤简述如下:

安装 Node.js 环境

node 的版本好像不能过高,我 Mac 上node -vnpm -v分别是v4.2.02.14.7,在安装 Nodervisor 的时候报错(主要表现为安装 sqlite 模块时报错)。服务器上v0.10.40的 node 就没有问题。我也不懂 Node.js,希望懂的朋友能指点一下。另外为什么版本号差异这么大?

如果你的 node 不好使,可参考这篇文章,先删除 node,并按以下步骤安装

1
2
3
4
5
6
$ wget http://nodejs.org/dist/v0.10.40/node-v0.10.40.tar.gz
$ tar zxvf node-v0.10.40.tar.gz
$ cd node-v0.10.40
$ ./configure
$ make
$ make install

安装 nodervisor

先找个目录把 nodervisor clone 下来,然后执行npm install

1
2
3
$ git clone https://github.com/TAKEALOT/nodervisor.git nodervisor
$ cd nodervisor
$ npm install

Tips: 因为众所周知的原因,建议把 npm 源换成淘宝 npm 源

1
2
3
4
5
$ alias cnpm="npm --registry=https://registry.npm.taobao.org \
--cache=$HOME/.npm/.cache/cnpm \
--disturl=https://npm.taobao.org/dist \
--userconfig=$HOME/.cnpmrc"
$ cnpm install

等执行完毕并且没有报错的话,nodervisor 就安装好了。直接执行以下命令就启动 nodervisor 了

1
$ npm start

然后你可以通过 3000 端口访问它,例如本机的话 http://localhost:3000 (当然,可以自己指定端口的)
默认的登录账户:

  • Email: admin@nodervisor
  • Password: admin

登录后点击导航栏的 Hosts 就可以添加 Supervisor 实例了。这里需要注意:

  • 你的 Supervisor 的配置中要配置[inet_http_server]以允许 xmlrpc 接口调用
    *[inet_http_server]中是可以设置usernamepassword

一个栗子如下:

1
2
3
4
5
6
7
8
# supervisord.conf
[inet_http_server]
port = *:9001 ;
username: admin
password: 123456

# nodervisor Add Hosts
Url: http://admin:123456@127.0.0.1:9001

再次回到首页应该就能看到你刚刚添加的 Host 与它管理的 Process 了。
Tips: 如果只看到 Host 没有看到它管理的进程,并且无任何报错的话,八成是因为你 Supervisor 配置用户名密码,而 Host Url 里边没有认证信息。

一点小改进

你可能会注意到你的 nodervisor 和我的看起来不太一样,我是把它 fork 下来改动了一些地方,主要有:

  1. 增加EXITED状态相关的一些东西。原来EXITED状态的话,按钮处会一直为Updating,无法启动,现在为Start,并调整背景色。EXITED状态有人在源 repo 中提了 RP,但看着好像并未真正实现。
  2. Changed 栏以前从未启动过的程序会显示“46 years ago”,现在和 Supervisor 自带 WebUI 中的描述一致——“Not started”。
  3. 去掉了导航栏的背景色,感觉这样更加和谐一点。
  4. 每个 router 方法入口处都 check 一下权限,User 用户登录后直接跳到/dashboard而不是/
  5. Dash 页面显示上方导航栏,否则 User 无法 logout。
  6. 增加一个 Dockerfile 以便快速构建一个 nodervisor 的 container(感谢@jrandall,他已向源 repo 提了 RP)
  7. 对 Process 进行操作(Start、Stop 或 Restart all)的时候,增加了一个确认弹窗,以避免误操作。
  8. 增加“全部展开”、“全部折叠”按钮。
  9. 调整了“新增”或“修改” Hosts、Users 和 Groups 后的重定向规则。
  10. 在日志的stdout页增加 “ClearLogs” 按钮,因为一般都会配置redirect_stderr=true,所以stderr页就不加了。注:“ClearLogs” 会把stdoutstderr的都清理掉,官方只给了这么一个接口。
  11. 为单个进程(RUNNING状态的)增加 “Restart” 按钮。
  12. 日志中的特殊字符进行转义(感谢@DeanF
  13. 可以配置绑定的 host(默认127.0.0.1

你可以从这里获取:https://github.com/zhaoyibo/nodervisor

TODO

  1. [DONE]本来想为单个 Process 增加一个 Restart 按钮的,但是看了官方的 API,发现官方并未直接提供restart()方法,而是需要先stop()start()(nodervisor的“Restart all”也是这么实现的),目前看来这个并不急切需要,有空了加上。
  2. ./routes/ajax_supervisord.js 的函数入口加权限过滤
  3. [DONE]增加“全部展开”、“全部折叠”按钮
  4. [DONE]增加“清除日志”按钮
  5. 毕竟之前没接触过 Node.js,对 nodervisor 只能比葫芦画瓢。抽空用 Golong 写一个,顺便可以练练手:P

参考资料:
Supervisor集群管理WEB UI (monitor)
GitHub - TAKEALOT/nodervisor
Supervisor - Dashboards and Tools for Multiple Supervisor Instances
如何彻底删除node.js以及node.js安装教程