一、Supervisor入门
1.1、Supervisor是什么?
Supervisor是一个使用Python语言开发的一个用于管理与监控进程的程序,基于Client/Server架构,可运行在除window之外的所有类UNIX的系统之上(如linux、unix、macos等),通过简单的配置文件设置,就能让用户实现通过Supervisor来对所有类UNIX系统中需要被管理的进程/服务进行有效的监控与管理,且Supervisor提供一个简单的基于事件监听机制实现的事件通知,能够让你更好的及时了解到Supervisor所管理的每一个你关心的进程的相关状态与所发生的事件,让你能够基于收到的事件通知可以快速的做出响应或执行相应的处理。
1.2、为什么选择Supervisor
1)、简单方便。
相对于传统的进程管理:
- 可能需要你每次都要通过root用户SSH登录到服务器才能进行操作与管理。
- 需要为每个进程实例在/etc/init.d/目录下编写一个能够实现start/stop/restart/reload功能的管理脚本(如rc.d脚本),最后编写的rc.d脚本还无法自动重新启动奔溃的进程。
- linux系统不会自动重启挂掉的进程,想要自动重启就需要你另外写一个监控重启的脚本。
而Supervisor通过fork/exec和集中式的配置文件管理,就可以帮助你解决上面的问题。
2)、集中管理
Supervisor可以让你通过一个简单的配置文件来配置所有你要监控的进程/服务,当然你还可以对每个进程进行单独控制以及指定以指定user用户来启动,还对要管理的进程进行分组控制。除此之外,您还可以本地或远程命令行和Web界面等多种方式来对你的Supervisor进行管理,让你能够便捷的管理和监控你的服务和进程。
3)、精确高效
linux对进程状态的反馈有时候不太准确, 所以通常很难让你精确了解到你所关心的进程的UP/DOWN状态。而Supervisor通过fork/exec启动的方式将被管理的进程当成父进程supervisor的子进程来运行。这样当子进程终止时,操作系统立即向Supervisor发出信号,从而让Supervisor有能力能够精准高效的知道子进程目前所处于的运行状态,以快速的做出响应(启动、重启、重试、发送事件通知)。这与一些依赖麻烦的 PID文件 和 定期轮询 来重新启动失败进程的解决方案不同。
4)、分组管理
你可以根据需要对进程进行分组管理,并为他们设置启动顺序优先级,这样子一组逻辑相关的进程就可以作为一个单元进行统一的管理:启动、停止,Supervisor会根据你给进程分配的优先级来启动甚至重启他们。
5)、可扩展
Supervisor有一个简单的事件通知协议,用任何语言编写的程序都可以用来监控它,以及一个XML-RPC接口进行控制。它还使用Python开发人员可以利用的扩展点构建。
6)、兼容
除了Windows,主管几乎什么都工作。它在Linux、Mac OS X、Solaris和FreeBSD上进行了测试和支持。它完全用Python编写,因此安装不需要C编译器。
7)、用户权限
通过Supervisor,你除了可以为supervisord守护线程以及每个你需要被管理和监控的子进程都各自分配一个只有有限权限的user用户,作为启动每个子进程的启动用户,以避免权限溢出(提升),同时你还可以通过directory配置项限定子进程的可操作的chroot目录。
1.3、Supervisor主要组件
1)、supervisord服务守护进程
supervisord是Supervisor服务所启动的守护进程,主要负责将Supervisor所管理的进程作为它的子进程来启动,从而可以以父进程的角色对其下的所有子进程进行有效的管理与监控,以及重新启动奔溃或退出的进程;响应来自supervisorctl客户端的命令;记录其子进程的stdout和stderr,以及生成和处理所管理进程(包括自己)的生命周期相关的事件通知。
2)、supervisorctl命令客户端
提供了一个类似shell的交互界面,让你能够通过熟悉的命令行方式,来通过简单的几个命令来查看和管理Supervisor服务所管理的进程。
使用该组件需要在supervisord.conf文件做相关的配置:
此处需要注意的是:因为supervisorctl与supervisord2个进程之间可以通过套接字(UNIX_SOCKET)或者网络(TCP)的方式进行通行,所以这2种方式,你在配置的时候可以选择其一即可,以下暂时用UNIX_SOCKET方式,
[unix_http_server]
file=/tmp/supervisor.sock ; the path to the socket file
;chmod=0700 ; socket file mode (default 0700)
;chown=nobody:nogroup ; socket file uid:gid owner
;username=chris ; default is no username (open server)
;password=123 ; default is no password (open server)#主要是提供TCP类型的HTTP服务,如WebServer就是使用此地址,当然supervisorctl也可以通过此UTL来与supervisord通讯
[inet_http_server] ; inet (TCP) server disabled by default
port=127.0.0.1:9001 ; ip_address:port specifier, *:port for all iface
;username=chris ; default is no username (open server)
;password=123 ; default is no password (open server)[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
#此处的用户名和密码需要对应你选择的通讯方式下面所设置的username和password
;username=chris ; should be same as in [*_http_server] if set
;password=123 ; should be same as in [*_http_server] if set
;prompt=mysupervisor ; cmd line prompt (default "supervisor")
;history_file=~/.sc_history ; use readline history if available
3)、Web Server 管理操作界面
默认WebServer地址:127.0.0.1:9001,能够让你通过Web界面来查看和管理Supervisor服务所管理的进程。
具体配置项你可以通过supervisord.conf文件修改:
[inet_http_server] ; inet (TCP) server disabled by default
port=127.0.0.1:9001 ; ip_address:port specifier, *:port for all iface
#默认无用户验证,即任何人都可以登陆操作,如果需要则可以去掉以下注解,并配置相应的用户名和密码
#username=chris ; default is no username (open server)
#password=123 ; default is no password (open server)
4)、XML-RPC Interface
为web UI提供服务的HTTP服务器提供XML-RPC接口,该接口可用于询问和控制监控器及其运行的程序。
二、Supervisor管理进程架构示意图
三、Supervisor安装与使用
3.1、下载安装Supervisor
1)、通过pip安装
这个首先需