一、序言

Supervisor是多进程管理工具,在Docker中相关联的进程能够通过supervisor来管理。

微服务项目开发阶段,可用于微服务子项目的启动管理。

支持web可视化管理,能够极大方面开发者对项目状态的监控和重启管理。

二、安装与使用

(一)安装与配置

1、服务安装

服务安装前,建议更新Python版本,使用较新的版本有利于服务拓展,若被管理的服务依赖于较新的Python版本,需要再次重新安装服务。

yum install -y epel-release
yum install -y supervisor

查看版本号

supervisord -v
2、配置文件

配置文件路径为/etc/supervisord.conf,其中用英文;表示注释。将配置文件备份,过滤注释配置后形成新的配置文件。

# 备份配置文件
mv /etc/supervisord.conf /etc/supervisord.example.conf
# 保留非注释配置,初始化为新的配置文件
cat /etc/supervisord.example.conf | grep -v '^;' | tr -s "\n" > /etc/supervisord.conf

使用命令echo_supervisord_conf查看默认配置

[unix_http_server]
file=/var/run/supervisor/supervisor.sock ; 可视化web监控模块(不需要直接注释)
[inet_http_server]
port=0.0.0.0:9001
username=root
password=root [supervisord]
logfile=/var/log/supervisor/supervisord.log
; 最大单个日志文件大小
logfile_maxbytes=50MB
; 最大日志文件保留份数
logfile_backups=10
loglevel=info
pidfile=/var/run/supervisord.pid
; 如果将设置为系统服务,需要设置为false
nodaemon=false
minfds=1024
minprocs=200 [rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl]
serverurl=unix:///var/run/supervisor/supervisor.sock ; 子进程配置存放目录
[include]
files = supervisord.d/*.ini

通过如下命令查看版本号:

supervisord -v

(二)启动

1、后台启动

将supervisord设置成开机自启,保证委托其管理的服务能够正常启动,建议使用此方式启动。

# 设置开机自启
systemctl enable supervisord # 启动主服务
systemctl start supervisord
2、前台启动

在编写Docker镜像,需要在一个镜像中同时管理多个服务,需要使用前台启动。supervisord的默认启动方式是daemon,若要配置为前台启动需修改配置文件/etc/supervisord.confnodaemon属性值为true

# 使用脚本替换
sed -i 's/nodaemon=false/nodaemon=true/g' /etc/supervisord.conf

前台启动命令如下

supervisord -c /etc/supervisord.conf
3、启动参数

通常情况下参数都是添加在配置文件中,有些场景下,修改配置文件比较繁琐(比如已经生成的镜像),这时在命令行中添加运行时参数就比较方便。

参数 用途 默认值
-c 指定配置文件路径 /etc/supervisord.conf
-s supervisord服务器监听的URL http://localhost:9001
-u 用于与服务器进行身份验证的用户名 user
-p 用于与服务器进行身份验证的密码 123

三、服务管理

服务管理包含对主服务进行管理和对子服务进行管理;子服务分为单个管理和批量(分组)管理。

1、查看主服务状态

如果不指定子服务名称,默认重新查看所有的子服务状态。指定子服务名,仅仅查看当前子服务状态。

# 查看服务状态
supervisorctl status

主进程管理

#进程管理常用命令
systemctl stop supervisord
systemctl start supervisord
systemctl restart supervisord
2、可视化界面管理

可视化界面在软件的不同开发阶段采用不同的策略,项目开发和测试阶段,为了提高开发效率,往往开启可视化界面,当项目开发完毕进行交付时,为保证服务器的安全,通常关闭可视化界面。

开启Web可视化服务需要在配置文件中添加inet_http_server模块。

(一)单服务管理

单服务管理是指针对单个子服务进行管理,所有子服务在默认分组中,但是不显示的标出。

1、刷新子服务列表

当添加新加入子服务时,需要刷新列表,主服务方能纳入管理范畴。

(1)reload

如果不指定子服务名称,默认重新启动所有的子服务列表。指定子服务名,仅仅重启当前子服务,其它服务不受影响。

所有子服务是指不管配置是否发生修改,都会重启。

# 刷新服务列表
supervisorctl reload

(2)update

重启所有配置发生更改的子服务(包含新增子服务),配置未发生变化的子服务不重启。

# 刷新服务列表
supervisorctl update
2、进程管理运行

此种方式管理子进程颗粒度更小。

# 启动指定服务
supervisorctl start program_name
# 停止指定服务
supervisorctl stop program_name
# 重启指定服务
supervisorctl restart program_name
# 启动所有服务
supervisorctl start all
# 停止所有服务
supervisorctl stop all

(二)分组管理

当有相关联的子服务时,可采用分组管理,一旦设置分组并添加子服务,那么子服务名称就会发生变化:由原来的program_name变成group_name:program_name,比如redis:redis80

分组管理需要修改主服务配置文件。

1、查看分组子服务列表

查看指定分组名称下子服务列表,

# 查看分组子服务列表
supervisorctl status group_name:
2、分组子进程管理

以组为单位对子进程进行管理,包含启动服务、停止服务、重启服务。

# 启动指定组名下服务
supervisorctl start group_name:
# 停止指定组名下服务
supervisorctl stop group_name:
# 重启指定组名下服务
supervisorctl restart group_name:

注意组名后的冒号:

3、分组应用

将进程委托给Supervisor管理,并分组对于一组关联进程来说很方便,比如Redis主从服务、ES集群、ZK集群、Kafka集群,他们是一组关联度较高的子服务集合。

四、编写子进程运行配置文件

supervisor主进程配置文件为/etc/supervisord.conf

在目录/etc/supervisord.d下新建以.ini为后缀的配置文件,每一个配置文件代表一个子进程。执行如下命令,即可添加子进程配置。

快捷脚本传送门

(一)参数解释

1、directory

当子进程启动命令不能从环境变量读取到时,使用此参数切换到指定的工作目录,然后运行入口命令。

2、priority

priority参数越大时,优先级越低。

3、environment

如果子应用无法获取系统环境变量,那么可显式指明特定环境的路径。

environment=JAVA_HOME=/usr/local/java

(二)日志管理

1、查看子进程日志

子进程被Supervisor管理后会产生相应的运行日志,常见的有访问日志和错误日志。

; 访问日志
stdout_logfile=/var/log/park/access.log
; 错误日志
stderr_logfile=/var/log/park/error.log

在子进程配置文件中增加日志配置,可以在不使用可视化界面的情况下查看子进程日志。可视化Web界面查看日志固然方便,缺陷是不能查看错误日志。

tail -f /var/log/park/access.log

子进程配置文件添加参数stdout_logfilestderr_logfile的日志文件会自动纳入主进程日志管理,自动进行日志轮转操作,用户无需干预。

当子进程未显示的指明日志文件路径时,默认日志文件存在于/tmp路径下。

Supervisord 会基于 logfile_maxbyteslogfile_backups 轮转日志,前者限制单个日志文件的大小,后者限制日志备份的数量。此配置存在与主配置文件,非子进程配置文件。

(三)常见组件配置

1、Nginx
cat <<EOF> /etc/supervisord.d/nginx.ini
[program:nginx]
directory=/usr/local/nginx/sbin
command=/usr/local/nginx/sbin/nginx -g 'daemon off;'
; 主服务启动时自动启动当前子服务
autostart=true
; 子服务异常退出自动重启
autorestart=true
; 子服务启动时间(与时间情况尽量一致)
startsecs=5
startretries=3
redirect_stderr=true
stdout_logfile=/usr/local/nginx/logs/access.log
stderr_logfile=/usr/local/nginx/logs/error.log
EOF

子进程的命令必须是以前台运行的方式执行,不能使用后台运行的方式执行。

2、Redis
cat <<EOF> /etc/supervisord.d/redis.ini
[program:redis]
command=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf --daemonize no
autostart=true
autorestart=true
startsecs=5
startretries=3
redirect_stderr=true
EOF

子进程的命令必须是以前台运行的方式执行,不能使用后台运行的方式执行。

3、Nacos
cat <<EOF> /etc/supervisord.d/nacos.ini
[program:nacos]
command=sh /usr/local/nacos/bin/startup.sh -m standalone
autostart=true
autorestart=true
startsecs=8
startretries=3
redirect_stderr=true
environment=JAVA_HOME=/usr/local/java
priority=1
EOF

子进程的命令必须是以前台运行的方式执行,不能使用后台运行的方式执行。

4、ElasticSearch
cat <<EOF> /etc/supervisord.d/es.ini
[program:es]
command=/usr/local/elasticsearch/bin/elasticsearch -Enetwork.host=127.0.0.1
user=es
password=es.123.456
umask=002
autostart=true
autorestart=true
startsecs=8
startretries=3
redirect_stderr=true
priority=100
EOF
5、ZooKeeper
cat <<EOF> /etc/supervisord.d/zk.ini
[program:zk]
command=/usr/local/zookeeper/bin/zkServer.sh start-foreground
autostart=true
autorestart=true
startsecs=5
startretries=3
redirect_stderr=true
priority=100
EOF
6、Jenkins
cat <<EOF> /etc/supervisord.d/jenkins.ini
[program:jenkins]
command=/usr/local/jenkins/bin/catalina.sh run
autostart=true
autorestart=true
startsecs=8
startretries=3
redirect_stderr=true
priority=100
EOF
7、Kafka
cat <<EOF> /etc/supervisord.d/kafka.ini
[program:kafka]
command=/usr/local/kafka/bin/kafka-server-start.sh /usr/local/kafka/config/server.properties
autostart=true
autorestart=true
startsecs=8
startretries=3
redirect_stderr=true
priority=100
EOF
8、Kibaba
cat <<EOF> /etc/supervisord.d/kibana.ini
[program:kibana]
command=/usr/local/kibana/bin/kibana -H 0.0.0.0
autostart=true
autorestart=true
startsecs=8
startretries=3
redirect_stderr=true
EOF
9、MongoDb
cat <<EOF> /etc/supervisord.d/mongo.ini
[program:mongo]
command=/usr/local/mongo/bin/mongod --config=/usr/local/mongo/conf/config.yml
autostart=true
autorestart=true
startsecs=8
startretries=3
redirect_stderr=true
priority=100
EOF

原文地址

Supervisor多进程管理 异常自动重启 可视化管理的更多相关文章

  1. Docker可视化管理工具对比(DockerUI、Shipyard、Rancher、Portainer)

    1.前言 谈及docker,避免不了需要熟练的记住好多命令及其用法,对于熟悉shell.技术开发人员而言,还是可以接受的,熟练之后,命令行毕竟是很方便的,便于操作及脚本化.但对于命令行过敏.非技术人员 ...

  2. systemd实践: 依据情况自动重启服务

    systemd服务异常自动重启很好用,但有的时候希望某些服务只在特定情况下进行重启,其他时候不要自动重启(比如OOM,需要人工介入). 本文抛砖引玉,旨在能够让读者对systemd的重启机制有一定了解 ...

  3. 用Supervisor实现进程守护,在异常退出时自动重启

    程序启动后,有些是以daemon的形式运行,但在意外退出后,如果不能及时重新启动,会有比较严重的影响. 比如Zimg在图片处理中由于某些图片处理失败,会导致zimg进程挂掉,影响正常的服务提供,并且只 ...

  4. node.js零基础详细教程(7.5):mongo可视化工具webstorm插件、nodejs自动重启模块Node Supervisor(修改nodejs后不用再手动命令行启动服务了)

    第七章 建议学习时间4小时  课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑. ...

  5. Docker容器可以使用容器平台管理自动重启实现自修复吗?

    容器的自修复功能是经常被吹嘘的.因为容器是衣服,人躺下了,衣服也躺下了,容器平台能够马上发现人躺下了,于是可以迅速将人重新唤醒工作. 而虚拟机是房子,人躺下了,房子还站着.因而虚拟机管理平台不知道里面 ...

  6. supervisor的安装部署及集群管理

    supervisor的安装部署及集群管理 supervisor官网:http://www.supervisord.org/ 参考链接: http://blog.csdn.net/xyang81/art ...

  7. centos7.6使用 supervisor 对filebeat7.3.1进程进行管理

    centos7.6使用 supervisor 对filebeat7.3.1进程进行管理 Supervisor 是一个 Python 开发的 client/server 系统,可以管理和监控类 UNIX ...

  8. 【转】Android Service被关闭后自动重启,解决被异常kill 服务

    http://www.kaifajie.cn/android/10182-2.html 每次调用startService(Intent)的时候,都会调用该Service对象的onStartComman ...

  9. supervisor开机自动启动脚本+redis+MySQL+tomcat+nginx进程自动重启配置

    [root@mongodb-host supervisord]# cat mongo.conf [program:mongo]command=/usr/local/mongodb/bin/mongod ...

随机推荐

  1. Azure Data Lake(一) 在NET Core 控制台中操作 Data Lake Storage

    一,引言 Azure Data Lake Storage Gen2 是一组专用于大数据分析的功能,基于 Azure Blob Storage 构建的.Data Lake Storage Gen2 包含 ...

  2. 编写Java程序_银行终端服务系统

    目录 一.General description 总体概述 二.About the Project 项目介绍 三.Soft function 软件功能 四.UI Model Use Case Diag ...

  3. 一键抠除路人甲,昇腾CANN带你识破神秘的“AI消除术”

    摘要:都说人工智能改变了生活,你感觉到了么?AI的魔力就在你抠去路人甲的一瞬间来到了你身边.今天就跟大家聊聊--神秘的"AI消除术". 引语 旅途归来,重温美好却被秀丽河山前的路人 ...

  4. Swoole 协程的并发调用及使用示例

    示例一: 利用通道pop会自动挂起当前协程,等待生产者推送数据的特性,实现并发调用,并在协程完成后组合结果集. $serv = new Swoole\Http\Server("127.0.0 ...

  5. 深入 Laravel 内核之观察者模式

    装饰模式核心内容: 观察者模式又称为发布订阅模式,定义了对象间的一对多依赖关系,当一个对象状态发生改变时,其相关依赖的其他对象都能接收到通知: 观察者模式的核心在于目标(Subject)和观察者(Ob ...

  6. 字母 Letters

    D. 字母 Letters 内存限制:256 MiB 时间限制:500 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 给定两个长度相同且由大写英文字母组成的字符串 A 和 B,保证 ...

  7. pytest用例的执行顺序

    Pytest执行的顺序 当pytest运行测试函数时,它会查看该测试函数中的参数,然后搜索与这些参数具有相同名称的fixture.一旦pytest找到这些对象,它就会运行这些fixture 影响执行顺 ...

  8. DRF框架在嵌套关系下实现嵌套对象字段的过滤

    当需要对关联对象的字段进行选择性显示时,在所对应的serializer类中声明引用的字段. 例如: class TrackSerializer(serializers.ModelSerializer) ...

  9. Flask_蓝图Blueprint(十四)

    什么是蓝图? 蓝图:用于实现单个应用的视图.模板.静态文件的集合. 蓝图就是模块化处理的类. 简单来说,蓝图就是一个存储操作路由映射方法的容器,主要用来实现客户端请求和URL相互关联的功能. 在Fla ...

  10. SSM实现支付宝支付

    学习支付宝支付 一.支付宝测试环境代码测试 1.下载电脑网站的官方demo: 下载地址:https://docs.open.alipay.com/270/106291/ 2.下载解压导入eclipse ...