一、序言

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. Balancing Act(poj1655)

    Balancing Act Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12703   Accepted: 5403 De ...

  2. Discrete Logging(poj2417)

    Discrete Logging Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5120   Accepted: 2319 ...

  3. uniapp医院预约挂号微信小程序

    开头感言:最近看小程序很火,也想弄一个看看,用了一些时间从0开始写,也记录了一些笔记,自己用框架写的模板,不是很精美,后面会慢慢优化,功能也是后面慢慢加上去的, 其中功能这块,起初只是一些简单的功能, ...

  4. Nginx 常用配置清单

    侦听端口: server {# Standard HTTP Protocollisten 80;# Standard HTTPS Protocollisten 443 ssl;# For http2l ...

  5. 自动化集成:Docker容器入门简介

    前言:该系列文章,围绕持续集成:Jenkins+Docker+K8S相关组件,实现自动化管理源码编译.打包.镜像构建.部署等操作:本篇文章主要描述Docker基础用法. 一.Docker简介 1.基础 ...

  6. pandas tutorial 2

    @ 目录 Group_By 对数据进行分组 对 group进行迭代 选择一个group get_group() Aggregations 在group的基础上传入函数整合 Transformation ...

  7. css 快速入门 系列 —— 浮动

    浮动 以 mdn float 文档 为基础,逐一介绍浮动的本质.浮动的诸多特性.清除浮动以及块格式化上下文(bfc). 概念 当一个元素浮动之后,它会被移出正常的文档流,然后向左或者向右平移,一直平移 ...

  8. PostgreSQL数据库安装Version10.5

    PostgreSQL数据库安装,基于版本10.5安装, 在Linux系统上使用*.gz二进制压缩包手动安装. 操作系统:Red Hat Enterprise Linux Server release ...

  9. 解构插槽 Prop

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <link rel ...

  10. Docker 部署 ElasticSearch-Head 及其他插件

    拉取ElasticSearch-Head镜像 docker pull mobz/elasticsearch-head:5 运行ElasticSearch-Head容器 docker run -d -- ...