python每日一记: 学习使用supervisor
介绍
Supervisor 是基于 Python 的进程管理工具,只能运行在 Unix-Like 的系统上,也就是无法运行在 Windows 上。Supervisor 官方版目前只能运行在 Python 2.4 以上版本,
但是还无法运行在 Python 3 上,不过已经有一个 Python 3 的移植版 supervisor-py3k。
Supervisor 有两个主要的组成部分:
supervisord
,运行 Supervisor 时会启动一个进程 supervisord,它负责启动所管理的进程,并将所管理的进程作为自己的子进程来启动,而且可以在所管理的进程出现崩溃时自动重启。supervisorctl
,是命令行管理工具,可以用来执行 stop、start、restart 等命令,来对这些子进程进行管理。
安装supervisor
pip安装
-
pip为python-pip2.7
sudo pip install supervisor
-
apt安装
apt-get install supervisor
创建配置文件
-
执行命令:
echo_supervisord_conf > /etc/supervisord.conf
如果遇到 报错 permission denied: /etc/supervisord.conf
sudo su - root -c "echo_supervisord_conf > /etc/supervisord.conf"
配置文件说明
想要了解怎么配置需要管理的进程,只要打开 supervisord.conf 就可以了,里面有很详细的注释信息。
- 打开配置文件
vim /etc/supervisord.conf
默认的配置文件是下面这样的,但是这里有个坑需要注意,supervisord.pid 以及 supervisor.sock
是放在 /tmp 目录下,但是 /tmp 目录是存放临时文件,里面的文件是会被 Linux 系统删除的,一旦这些文件丢失,
就无法再通过 supervisorctl 来执行 restart 和 stop 命令了,会提醒unix:///tmp/supervisor.sock 不存在的错误
。
[unix_http_server]
;file=/tmp/supervisor.sock ; (the path to the socket file)
;修改为 /var/run 目录,避免被系统删除
file=/var/run/supervisor.sock ; (the path to the socket file)
...
-
web管理
supervsior服务是有web管理界面的,可以对服务可视化,看到服务的状态,同时可以控制服务,
不过默认是关闭的,因为如果将所有服务暴露给坏人,这肯定是运维的噩梦。
所以你还是选择开web节目,记住!记住!记住! 防火墙,改端口,加认证。
[inet_http_server] ; inet (TCP) server disabled by default
;port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for ;all iface)
;username=user ; (default is no username (open server))
;password=123 ; (default is no password (open server))
...
同理:
在[supervisord]中,是配置supervisor的日志,尽量将/tmp,改为/var/log下
[supervisord]
;logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
;修改为 /var/log 目录,避免被系统删除
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10 ; (num of main logfile rotation backups;default 10)
loglevel=info ; (log level;default info; others: debug,warn,trace)
;pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
;修改为 /var/run 目录,避免被系统删除
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
...
;设置启动supervisord的用户,一般情况下不要轻易用root用户来启动,除非你真的确定要这么做
;user=chrism ; (default is current user, required if root)
...
默认情况下,进程的日志文件达到50MB时,将进行分割,最多保留10个文件,当然这些配置也可以对每个进程单独配置。
- 这部分需要跟[unix_http_server]、[inet_http_server]内容匹配哦,内容大致相同;
[supervisorctl]
; 必须和'unix_http_server'里面的设定匹配
;serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
;修改为 /var/run 目录,避免被系统删除
serverurl=unix:///var/run/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=chris ; should be same as http_username if set
;password=123 ; should be same as http_password if set
权限问题
设置好配置文件后,应先创建上述配置文件中新增的文件夹。如果指定了启动用户 user,
这里以 star为例,那么应注意相关文件的权限问题,包括日志文件,否则会出现没有权限的错误。
例如设置了启动用户 star,然后启动 supervisord 出现错误
Error: Cannot open an HTTP server: socket.error reported errno.EACCES (13)
就是由于上面的配置文件中 /var/run 文件夹,没有授予启动 supervisord 的用户 oxygen 的写权限。
/var/run 文件夹实际上是链接到 /run,因此我们修改 /run 的权限。
sudo chmod 777 /run
sudo chmod 777 /var/log
这样有点简单粗暴,也可以考虑把上述配置文件中 .sock,.pid 等文件修改到其他文件夹中,
并确保有相应的权限即可。一般情况下,我们可以用 root 用户启动 supervisord 进程,然后在其所管理的进程中,
再具体指定需要以那个用户启动这些进程。
如nginx 启动的属主为 nginx. nginx
使用 include
在配置文件的最后,有一个 [include] 的配置项,跟 Nginx 一样,可以 include 某个文件夹下的所有配置文件,这样我们就可以为每个进程或相关的几个进程的配置单独写成一个文件。
12 [include]files = /etc/supervisord.d/*.ini