一、安装 Supervisor
pip install supervisor
使用 echo_supervisord_conf 命令生成默认配置文件
echo_supervisord_conf > /etc/supervisord.conf
配置文件说明
位置:etc/supervisord.conf内容:# 指定了socket file的位置
[unix_http_server]
file=/tmp/supervisor.sock ;UNIX socket 文件,supervisorctl 会使用
;chmod=0700 ;socket文件的mode,默认是0700
;chown=nobody:nogroup ;socket文件的owner,格式:uid:gid#用于启动一个含有前端的服务,可以从Web页面中管理服务。其中,port用于设置访问地址,username和password用于设置授权认证。
[inet_http_server] ;HTTP服务器,提供web管理界面
port=192.168.2.111:9001 ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性
username=user ;登录管理后台的用户名
password=123 ;登录管理后台的密码# 管理服务本身的配置
[supervisord]
logfile=/tmp/supervisord.log ;日志文件,默认是 $CWD/supervisord.log
logfile_maxbytes=50MB ;日志文件大小,超出会rotate,默认 50MB,如果设成0,表示不限制大小
logfile_backups=10 ;日志文件保留备份数量默认10,设为0表示不备份
loglevel=info ;日志级别,默认info,其它: debug,warn,trace
pidfile=/tmp/supervisord.pid ;pid 文件
nodaemon=false ;是否在前台启动,默认是false,即以 daemon 的方式启动
minfds=1024 ;可以打开的文件描述符的最小值,默认 1024
minprocs=200 ;可以打开的进程数的最小值,默认 200[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ;通过UNIX socket连接supervisord,路径与unix_http_server部分的file一致
;serverurl=http://127.0.0.1:9001 ; 通过HTTP的方式连接supervisord; [program:xx]是被管理的进程配置参数,xx是进程的名称
[program:xx]
command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run ; 程序启动命令
autostart=true ; 在supervisord启动的时候也自动启动
startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3 ; 启动失败自动重试次数,默认是3
user=tomcat ; 用哪个用户启动进程,默认是root
priority=999 ; 进程启动优先级,默认999,值小的优先启动
redirect_stderr=true ; 把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=20MB ; stdout 日志文件大小,默认50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数,默认是10
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out
stopasgroup=false ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false ;默认为false,向进程组发送kill信号,包括子进程# 对事件进行的管理
;[eventlistener:theeventlistenername]# 对任务组的管理 ,包含其它配置文件
;[group:thegroupname]
;programs=progname1,progname2 ; each refers to 'x' in [program:x] definitions
;priority=999 ; the relative start priority (default 999)[include]
files = /etc/supervisord.d/*.ini ;可以指定一个或多个以.ini结束的配置文件
注意最后行,代表我们将其他配置的supervisor文件放在/etc/supervisord.d 目录下,名称为 *.ini
[include]
files = /etc/supervisord.d/*.ini ;可以指定一个或多个以.ini结束的配置文件
inet_http_server 也要放开,下面cesi服务需要调用该接口
[inet_http_server] ;HTTP服务器,提供web管理界面
port=127.0.0.1:9001 ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性
username=user ;登录管理后台的用户名
password=123 ;登录管理后台的密码
手动创建目录
mkdir /etc/supervisord.d
自定义配置文件
[root@test111 supervisord.d]# cat ho-monitor.ini
[program:cesi-5000]
; program 表示 Supervisor 管理的服务实例,cesi-5000 是自己命名的服务名称,名字可以随便其,我为了方便管理统一命名为:服务名称-端口
directory = /home/jast/monitor-1.0-SNAPSHOT
; 程序的启动目录
command = java -cp /home/jast/ho-monitor-1.0-SNAPSHOT/lib/*:/home/jast/ho-monitor-1.0-SNAPSHOT/ho-monitor-1.0-SNAPSHOT.jar com.monitor.test111
; 启动服务的命令
priority=1
; 数字越高,优先级越高
autostart = true
; 在 supervisord 启动的时候也自动启动
startsecs = 5
; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true
; 程序异常退出后自动重启
startretries = 3
; 启动失败自动重试次数,默认是 3
user = root
; 用哪个用户启动
redirect_stderr = true
; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 50MB
; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 7
; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /var/log/monitor/stdout.log
如果要将一个程序启动多个进程则需加入配置
;启动进程数量
numprocs = 5
;当进程数量numprocs大于1是需要定义process_name
process_name=%(program_name)s_%(process_num)002d
启动五个进程Demo
[root@test111 supervisord.d]# cat ho-monitor.ini
[program:cesi-5000]
; program 表示 Supervisor 管理的服务实例,cesi-5000 是自己命名的服务名称,名字可以随便其,我为了方便管理统一命名为:服务名称-端口
directory = /home/jast/monitor-1.0-SNAPSHOT
; 程序的启动目录
command = java -cp /home/jast/ho-monitor-1.0-SNAPSHOT/lib/*:/home/jast/ho-monitor-1.0-SNAPSHOT/ho-monitor-1.0-SNAPSHOT.jar com.monitor.test111
;启动进程数量
numprocs = 5
;当进程数量numprocs大于1是需要定义process_name
process_name=%(program_name)s_%(process_num)002d
; 启动服务的命令
autostart = true
; 在 supervisord 启动的时候也自动启动
startsecs = 5
; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true
; 程序异常退出后自动重启
startretries = 3
; 启动失败自动重试次数,默认是 3
user = root
; 用哪个用户启动
redirect_stderr = true
; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 50MB
; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 7
; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /var/log/monitor/stdout.log
配置参数具体说明:
- command:启动程序使用的命令,可以是绝对路径或者相对路径 - process_name:一个python字符串表达式,用来表示supervisor进程启动的这个的名称,默认值是%(program_name)s - numprocs:Supervisor启动这个程序的多个实例,如果numprocs>1,则process_name的表达式必须包含%(process_num)s,默认是1 - numprocs_start:一个int偏移值,当启动实例的时候用来计算numprocs的值 - priority:权重,可以控制程序启动和关闭时的顺序,权重越低:越早启动,越晚关闭。默认值是999 - autostart:如果设置为true,当supervisord启动的时候,进程会自动重启。 - autorestart:值可以是false、true、unexpected。false:进程不会自动重启,unexpected:当程序退出时的退出码不是exitcodes中定义的时,进程会重启,true:进程会无条件重启当退出的时候。 - startsecs:程序启动后等待多长时间后才认为程序启动成功 - startretries:supervisord尝试启动一个程序时尝试的次数。默认是3 - exitcodes:一个预期的退出返回码,默认是0,2。 - stopsignal:当收到stop请求的时候,发送信号给程序,默认是TERM信号,也可以是 HUP, INT, QUIT, KILL, USR1, or USR2。 - stopwaitsecs:在操作系统给supervisord发送SIGCHILD信号时等待的时间 - stopasgroup:如果设置为true,则会使supervisor发送停止信号到整个进程组 - killasgroup:如果设置为true,则在给程序发送SIGKILL信号的时候,会发送到整个进程组,它的子进程也会受到影响。 - user:如果supervisord以root运行,则会使用这个设置用户启动子程序 - redirect_stderr:如果设置为true,进程则会把标准错误输出到supervisord后台的标准输出文件描述符。 - stdout_logfile:把进程的标准输出写入文件中,如果stdout_logfile没有设置或者设置为AUTO,则supervisor会自动选择一个文件位置。 - stdout_logfile_maxbytes:标准输出log文件达到多少后自动进行轮转,单位是KB、MB、GB。如果设置为0则表示不限制日志文件大小 - stdout_logfile_backups:标准输出日志轮转备份的数量,默认是10,如果设置为0,则不备份 - stdout_capture_maxbytes:当进程处于stderr capture mode模式的时候,写入FIFO队列的最大bytes值,单位可以是KB、MB、GB - stdout_events_enabled:如果设置为true,当进程在写它的stderr到文件描述符的时候,PROCESS_LOG_STDERR事件会被触发 - stderr_logfile:把进程的错误日志输出一个文件中,除非redirect_stderr参数被设置为true - stderr_logfile_maxbytes:错误log文件达到多少后自动进行轮转,单位是KB、MB、GB。如果设置为0则表示不限制日志文件大小 - stderr_logfile_backups:错误日志轮转备份的数量,默认是10,如果设置为0,则不备份 - stderr_capture_maxbytes:当进程处于stderr capture mode模式的时候,写入FIFO队列的最大bytes值,单位可以是KB、MB、GB - stderr_events_enabled:如果设置为true,当进程在写它的stderr到文件描述符的时候,PROCESS_LOG_STDERR事件会被触发 - environment:一个k/v对的list列表 - directory:supervisord在生成子进程的时候会切换到该目录 - umask:设置进程的umask - serverurl:是否允许子进程和内部的HTTP服务通讯,如果设置为AUTO,supervisor会自动的构造一个url
启动服务
supervisord -c /etc/supervisord.conf
访问安装的 http://ip:9001 ,成功
安装Cesi
安装依赖
# 安装依赖 (如果有跳过)
yum install -y git wget epel-release python34 python34-pip npm bzip2
sudo pip install flask#如果提示python34无法安装则进行源执行下面命令
yum -y install epel-release# 设置环境变量并创建安装目录
export CESI_SETUP_PATH=/usr/local/cesi
mkdir ${CESI_SETUP_PATH}
cd ${CESI_SETUP_PATH}# 下载cesi-2.6.7.tar.gz并解压
wget https://github.com/gamegos/cesi/releases/download/v2.6.7/cesi-extended.tar.gz -O cesi.tar.gz
tar -zxvf cesi.tar.gz# 创建venv虚拟环境(也可以使用已有的虚拟环境)
python3.4 -m venv venv# 激活venv虚拟环境
source venv/bin/activate
# 在venv虚拟环境中,使用pip3管道安装依赖
pip3 install -r requirements.txt
# 失效venv虚拟环境
deactivate############### 此段为可选安装,经本人测试,不建议安装,要安装一大堆东西,然并卵 ############
# (可选安装)升级node到最新版
npm install -g n
n latest
# (可选安装)安装 yarn
curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
yum install -y yarn
# (可选安装)构建ui,需要安装yarn, node, npm
cd ${CESI_SETUP_PATH}/cesi/ui
yarn install
yarn build
######################################################################################## 复制配置文件到/etc目录
cp ${CESI_SETUP_PATH}/defaults/cesi.conf.toml /etc/cesi.conf# 复制服务配置文件到/etc/systemd/system目录,并注册为服务(CentOS7)
cp ${CESI_SETUP_PATH}/defaults/cesi.service /etc/systemd/system/cesi.service
修改cesi.conf文件
> vim /etc/cesi.conf
# This is the main CeSI toml configuration file. It contains CeSI web application and
# supervisord information to connect# This is the CeSI's own configuration.
[cesi]
# Database Uri
database = "sqlite:///users.db" # Relative path
# Etc
#database = "sqlite:opt/cesi/< version >/users.db" # Absolute path
#database = "postgres://<user>:<password>@localhost:5432/<database_name>"
#database = "mysql+pymysql://<user>:<password>@localhost:3306/<database_name>"
activity_log = "activity.log" # File path for CeSI logs
admin_username = "admin" # Username of admin user 这里是cesi的登陆账号密码
admin_password = "admin" # Password of admin user# This is the definition section for new supervisord node.
# [[nodes]]
# name = "api" # (String) Unique name for supervisord node.
# environment = "" # (String) The environment name provides logical grouping of supervisord nodes. It can be used as filtering option in the UI.
# username = "" # (String) Username of the XML-RPC interface of supervisord Set nothing if no username is configured
# password = "" # (String) Password of the XML-RPC interface of supervisord. Set nothing if no username is configured
# host = "127.0.0.1" # (String) Host of the XML-RPC interface of supervisord
# port = "9001" # (String) Port of the XML-RPC interface of supervisord# Default supervisord nodes ,这里连接的是我们的supervisor 的ip、端口、账号、密码
[[nodes]]
name = "192.168.2.111"
environment = ""
username = "user"
password = "123"
host = "192.168.2.111"
port = "9001"
手动启动cesi服务
/usr/local/cesi/venv/bin/python3 /usr/local/cesi/cesi/run.py --config-file /etc/cesi.conf# 指定端口号启动
/usr/local/cesi/venv/bin/python3 /usr/local/cesi/cesi/run.py --config-file /etc/cesi.conf -p 5023
我们可以使用supervisor配置启动该服务
vim /etc/supervisord.d/cesi.ini
[program:cesi]
directory=/usr/local/cesi/cesi
command=/usr/local/cesi/venv/bin/python3 /usr/local/cesi/cesi/run.py --config-file /etc/cesi.conf
autostart=true
startsecs=10
starttries=3
user=root
priority=996
redirect_stderr=false
stdout_logfile=/usr/local/cesi/cesi.log
stderr_logfile=/usr/local/cesi/cesi-err.log
stopasgroup=false
killasgroup=true
重新加载配置
supervisorctl reload
重启cesi服务
supervisorctl restart cesi
查看页面发现成功启动
注意事项:
1.配置的日志存放目录要存在
Error: The directory named as part of the path /var/log/monitor/stdout.log does not exist in section 'program:cesi-5000' (file: '/etc/supervisord.d/monitor.ini')
For help, use /bin/supervisord -h
2.每次修改配置文件时候需要执行reload才能是配置生效
supervisorctl reload