Supervisor 部署和使用

温馨提醒

离线安装

  • 安装 setuptools

    1
    2
    3
    4
    
    https://pypi.org/project/setuptools/41.1.0/#files
    unzip setuptools-41.1.0.zip
    cd setuptools-41.1.0
    python setup.py install
  • 安装 supervisor

    1
    2
    3
    4
    
    https://github.com/Supervisor/supervisor/tags
    tar xf supervisor-4.2.4.tar.gz
    cd supervisor-4.2.4
    python setup.py install

在线安装

  • pip 方式安装

    1
    
    pip3 install supervisor
  • yum 安装

    1
    2
    
    yum install epel-release
    yum install supervisor

配置 supervisor

  • 创建目录

    1
    2
    3
    
    mkdir /etc/supervisord.d
    mkdir /var/run/supervisord/
    mkdir /var/log/supervisord/
  • 生成配置文件

    1
    
    echo_supervisord_conf > /etc/supervisord.conf
  • 修改配置文件

    vim /etc/supervisord.conf

    1
    2
    3
    4
    5
    6
    7
    8
    
    [unix_http_server]
    file=/var/run/supervisord/supervisord.sock
    
    [supervisorctl]
    serverurl=unix:///var/run/supervisord/supervisord.sock
    
    [include]
    files=/etc/supervisord.d/*.ini
  • 创建启动脚本

    vim /usr/lib/systemd/system/supervisord.service

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    
    [Unit]
    Description=Process Monitoring and Control Daemon
    After=rc-local.service nss-user-lookup.target
    
    [Service]
    Type=forking
    ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf
    
    [Install]
    WantedBy=multi-user.target
    
    
    # 启动
    systemctl daemon-reload
    systemctl enable --now supervisord
  • 开启 web 界面

    vim /etc/supervisord.conf

    1
    2
    3
    4
    
    [inet_http_server]
    port=192.168.1.81:9001				# 修改IP
    username=user						# 用户名
    password=123 						# 密码
  • 创建文件

    每次开机自动创建 /var/run/supervisord 目录

    1
    2
    3
    
    cat > /usr/lib/tmpfiles.d/supervisord.conf << EOF
    d /var/run/supervisord 0755 root root -
    EOF
  • 添加要管理的进程

    vim /etc/supervisord.d/test.ini

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    [program:test]								# 启动程序的名字test,启动时需要指定
    environment=JAVA_HOME=/usr/local/java/bin	# 配置java启动环境
    directory=/data/							# 程序所在路径
    command=java -jar test.jar					# 运行命令
    autostart=true								# 当supervisor启动时,程序自动启动
    startsecs=5									# 启动5秒后没有异常退出,就表示进程正常启动,默认1秒
    autorestart=true							# 程序退出后自动重启
    startretries=3								# 启动失败,重试次数
    user=root									# 用哪个用户启动程序
    priority=999								# 优先级,默认999,数字越小越先启动,越晚停止
    stopsignal=INT								# 当收到stop请求的时候,发送信号给程序,默认是TERM信号,也可以是 HUP, INT, QUIT, KILL, USR1, or USR2。
    exitcodes=0,2								# 退出码是0,2时,执行重启,默值是0,2
    # 日志
    #redirect_stderr=true						# 把stderr重定向到stdout,默认false
    stdout_logfile_maxbytes=1GB					# stdout 日志文件大小,默认50MB
    stdout_logfile_backups=20					# stdout 日志文件保存个数
    stdout_logfile=/data/logs/test.out.log		# 标准日志,满20MB区分
    stderr_logfile=/data/logs/test.err.log		# 错误日志

配置示例

  • 配置 tomcat

    vim /etc/supervisord.d/tomcat.ini

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    
    [program:tomcat]
    command=/usr/local/apache-tomcat-8.0.35/bin/catalina.sh run				# 程序启动命令
    autostart=true									# supervisord启动时程序自动启动
    startsecs=5										# 启动5秒后没有异常退出,表示进程正常启动了,默认为1秒
    autorestart=true								# 程序退出后自动重启,默认unexpected,进程意外杀死才重启
    startretries=3									# 启动失败自动重试次数,默认为3
    user=tomcat										# 启动程序的用户
    priority=999									# 进程启动优先级,默认999,值小的优先启动
    redirect_stderr=true							# 把stderr重定向到stdout,默认false
    stdout_logfile_maxbytes=20MB					# stdout 日志文件大小,默认50MB
    stdout_logfile_backups=20						# stdout 日志文件备份数,默认10
    stdout_logfile=/usr/local/apache-tomcat-8.0.35/logs/catalina.out
    stopasgroup=false								# 进程被杀死时,是否向这个进程组发送stop信号,包括子进程,默认false
    killasgroup=false								# 向进程组发送kill信号,包括子进程,默认false
  • 配置 springboot

    vim /etc/supervisord.d/java.ini

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    
    [program:stock-icon]
    directory=/data/program/capital/stock-icon/src				# 命令执行的目录
    environment=PORT=13000,NODE_ENV=production,NODE_DIR=src		# 环境变量,多个环境变量用逗号分隔
    command=/usr/local/node/bin/node bin/server.js				# 运行程序的命令
    autostart=true			# 是否自动启动
    startsecs=5				# 自动重启间隔
    autorestart=true		# 程序意外退出是否自动重启
    startretries=3			# 启动失败重试的次数,默认是3
    stdout_logfile=/data/program/capital/stock-icon/logs/stdout.log
    stderr_logfile=/data/program/capital/stock-icon/logs/stderr.log
    stdout_logfile_backups=10
    stdout_logfile_maxbytes=1GB
  • 配置 zookeeper 集群

    vim /etc/supervisord.d/zookeeper.ini

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    
    [program:zookeeper]
    command=/data/program/zookeeper/bin/zkServer.sh start-foreground
    autostart=true
    startsecs=10
    autorestart=true
    startretries=3
    user=admin
    priority=500
    redirect_stderr=true
    stdout_logfile_maxbytes=20MB
    stdout_logfile_backups=20
    stdout_logfile=/data/zookeeper/logs/stdout.log
    stderr_logfile=/data/zookeeper/logs/stderr.log
    stopasgroup=false
    killasgroup=false

常用命令

1
2
3
4
5
6
7
8
supervisorctl shutdown								# 关闭所有任务
supervisorctl stop|start|restart PROGRAM_NAME
supervisorctl status								# 查看所有任务状态

# 如果新增了配置文件,可以在命令行使用update更新子任务(将子程序纳入主程序来管理,并且启动子程序)
supervisorctl update			# 默认更新全部,后面加任务文件名,启动特定任务
supervisorctl reload			# 主配置文件修改后,执行使之生效
supervisorctl reread			# 读取有更新(增加)的配置文件,不会启动新添加的程序

集群管理工具 - cesi

CeSi(Centralized Supervisor Interface) 是 Supervisor 官方推荐的集中化管理 Supervisor 实例的 Web UI,该工具是用 Python 编写,基于 Flask Web 框架 。Supervisor 进程,功能比较简单,通过 CeSi 可以集中管理各个服务器节点的进程,在 Web 界面就可以轻松管理各个服务的启动、关闭、重启等,很方便使用

  • 安装依赖

    1
    
    yum install -y git epel-release python36
  • 安装 cesi

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    wget https://github.com/gamegos/cesi/releases/download/v2.7.1/cesi-extended.tar.gz -O cesi.tar.gz
    tar -xvf cesi.tar.gz
    
    mv cesi /usr/local/
    mv defaults requirements.txt /usr/local/cesi/
    
    # 安装依赖
    cd /usr/local/cesi
    pip3 install -r requirements.txt
  • 配置 cesi

    vim /usr/local/cesi/defaults/cesi.conf.toml

    1
    2
    3
    4
    5
    6
    7
    8
    
    # 在最后添加一个node
    [[nodes]]
    name = "172.16.20.252"
    environment = "test"
    username = "admin"
    password = "XXXXXXXX"
    host = "172.16.10.252"
    port = "9001"
  • 启动 cesi

    1
    
    python3 /usr/local/cesi/run.py --config-file /usr/local/cesi/defaults/cesi.conf.toml
  • 配置 supervisord 管理 cesi

    1
    2
    3
    4
    5
    
    [program:cesi]
    command=/usr/bin/python3 /usr/local/cesi/run.py --config-file /usr/local/cesi/defaults/cesi.conf.toml
    autostart=true
    startsecs=1
    starttries=3