之前一直用AWS的服务,使用的也是AWS官方提供的系统镜像,感觉挺好使的,所以centos7的版本用的不多。最近刚好需要使用腾讯云,记录一下supervisor的安装配置,不管简单与否,好久没写博客了还是记录一下吧。
安装
Env:
- OS:
CentOS Linux release 7.4.1708 (Core)
- Python:
Python 2.7.5
- Pip:
pip 8.1.2 from /usr/lib/python2.7/site-packages (python 2.7)
- OS:
Install supervisor with pip
12345678yum install python-pip #8.1.2-6.el7pip install supervisor #meld3-1.0.2 supervisor-3.3.4supervisord -v#Install supervisormkdir /etc/supervisorecho_supervisord_conf > /etc/supervisor/supervisord.confcat /etc/supervisor/supervisord.conf |egrep -v "^$|^;"#Create supervisor config fileSupport systemd
123456789101112131415systemctl --version #systemd 219#Support systemdwget https://raw.githubusercontent.com/zokeber/supervisor-systemd/master/etc/systemd/system/supervisord.service -O /etc/systemd/system/supervisord.service#Download systemd config for supervisor.#https://github.com/Supervisor/initscriptssystemctl status supervisord#Now can use systemctl command to manage supervisor servicesystemctl start supervisord #{start|stop|restart|reload}#Start servicesystemctl list-unit-files | grep supervisor#检查所有服务开机启动状态并过滤指定服务systemctl enable supervisord#添加服务到开机自启动systemctl is-enabled supervisord#查询指定服务开机启动状态Tip:
supervisord.service
文件如下12345678910111213[Unit]Description=Supervisor process control system for UNIXDocumentation=http://supervisord.orgAfter=network.target[Service]ExecStart=/usr/bin/supervisord -n -c /etc/supervisor/supervisord.confExecStop=/usr/bin/supervisorctl $OPTIONS shutdownExecReload=/usr/bin/supervisorctl $OPTIONS reloadKillMode=processRestart=on-failureRestartSec=50s[Install]WantedBy=multi-user.targetTip: 主配置
/etc/supervisor/supervisord.conf
示例(参考Flowsnow的博客及官方文档)【附:我的配置】12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061[unix_http_server]file = /tmp/supervisor.sock ;socket文件路径;chmod=0700 ; socket 文件 模式 (默认 0700);chown=nobody:nogroup ; socket file uid:gid owner;username=user ; 使用supervisorctl连接的用户,默认没有用户;password=123 ; 使用supervisorctl连接的用户密码,默认没有密码;[inet_http_server]port = 172.21.0.4:9001 ;Web Server和远程的supervisorctl配置,默认关闭username = user123 ;登录用户,默认没有password = password123 ;用于登录密码,默认没有;[supervisord]logfile = /tmp/supervisord.log ;supervisord进程的日志路径logfile_maxbytes = 100MB ;supervisor单个日志的大小,默认为50Mlogfile_backups = 20 ;日志文件的个数,默认为10个loglevel = info ;日志级别,默认info {trace|info|warn|debug}pidfile = /tmp/supervisord.pid ;supervisor的pid文件路径nodaemon = false ;默认为false在后台运行,改为true即在前台运行minfds = 20000 ;系统最少有的空闲文件描述符,低于这个值supervisor不会启动,另外跟最大文件句柄数相关minprocs = 200 ;最小可用的进程描述符,低于这个值supervisor将不会正常启动;[rpcinterface:supervisor];supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface;给XML_RPC用的,要使用supervisord或者web server必须要开启[supervisorctl]serverurl = unix:///tmp/supervisor.sock ;supervisorctl本地连接supervisord,使用本地UNIX socke;[program:theprogramname] ; 指定管理服务的名称command=/bin/tail -f /etc/fstab ; 要执行的进程,可以带参数,不能是守护进程;process_name=%(program_name)s ; numprocs参数为1时,就不用管这个参数 默认值%(program_name)s也就是上面的那个program冒号后面的名字;numprocs=1 ; 启动进程的数目。当不为1时,就是进程池的概念,默认为1directory=/tmp ; 进程运行前,会前切换到这个目录autostart=true ; 设置为true 子进程将在supervisord启动后被自动启动,默认为truestartretries=3 ; 进程启动失败后,最大尝试启动的次数 当超过3次后,supervisor将把此进程的状态置为FAILautorestart=unexpected ; 设置子进程挂掉后自动重启的情况,有三个选项,false,unexpected和true。默认为unexpectedexitcodes=0,2 ; 注意和上面的的autorestart=unexpected对应 exitcodes里面的定义的退出码是expected的。stopsignal=QUIT ; 进程停止信号,可以为TERM, HUP, INT, QUIT, KILL, USR1, or USR2等信号 默认为TERM 当用设定的信号去杀掉进程,退出码会被认为是expectedstopwaitsecs=10 ; 这个是当我们向子进程发送stopsignal信号后,到系统返回信息给supervisord,所等待的最大时间。 超过这个时间,supervisord会向该子进程发送一个强制kill的信号(默认10秒);stopasgroup=false ; 这个东西主要用于,supervisord管理的子进程,这个子进程本身还有子进程 那么我们如果仅仅干掉supervisord的子进程的话,子进程的子进程有可能会变成孤儿进程 所以咱们可以设置这个选项,把整个该子进程的整个进程组都干掉 设置为true的话,一般killasgroup也会被设置为true 该选项发送的是stop信号(def false);killasgroup=false ; 这个和上面的stopasgroup类似,不过发送的是kill信号(def false)user=chrism ; 如果supervisord是root启动,我们在这里设置这个非root用户,可以用来管理该program 默认不设置;redirect_stderr=true ; 为true,则stderr的日志会被写入stdout日志文件中 (default false)stdout_logfile=/a/path ; 子进程的stdout的日志路径,可以指定路径,AUTO,none等三个选项 设置为none的话,将没有日志产生。设置为AUTO的话,将随机找一个地方成日志文件,而且当supervisord重新启动的时候,以前的日志文件会被清空。当 redirect_stderr=true的时候,sterr也会写进这个日志文件stdout_logfile_maxbytes=100MB ; 日志文件最大大小,和[supervisord]中定义的一样 (default 50MB);stdout_logfile_backups=10 ; 和[supervisord]定义的一样 (0 means none, default 10);stdout_capture_maxbytes=1MB ; 这个东西是设定capture管道的大小,当值不为0的时候,子进程可以从stdout发送信息,而supervisor可以根据信息,发送相应的event (default 0);stdout_events_enabled=false ; 为ture的时候,当子进程由stdout向文件描述符中写日志的时候,将触发supervisord发送PROCESS_LOG_STDOUT类型的event(default false)stderr_logfile=/a/path ; 设置stderr写的日志路径,当redirect_stderr=true。这个就不用设置了,设置了也是白搭。因为它会被写入stdout_logfile的同一个文件中 default AUTO(随便找个地存,supervisord重启被清空)stderr_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB)stderr_logfile_backups=10 ; # of stderr logfile backups (default 10);stderr_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0);stderr_events_enabled=false ; emit events on stderr writes (default false);environment=A="1",B="2" ; 这个是该子进程的环境变量,和别的子进程是不共享的;serverurl=AUTO ; override serverurl computation (childutils);;[group:thegroupname] ; 给programs分组,划分到组里面的program。我们就不用一个一个去操作了 我们可以对组名进行统一的操作。 注意:program被划分到组里面之后,就相当于原来的配置从supervisor的配置文件里消失了supervisor只会对组进行管理,而不再会对组里面的单个program进行管理了;programs=progname1,progname2 ; 组成员,用逗号分开;priority=999 ; 优先级,相对于组和组之间 (default 999)[include]files = /etc/supervisord/conf.d/*.conf ;包含其他的程序配置文件Tip: 子服务配置
/etc/supervisor/conf.d/example1.conf
示例(即上面的program配置项可以提取到单独文件)【附:我的配置】12345678910111213[program:example1]command=/bin/tail -f 121directory=/tmpuser=arvonstdout_logfile=/tmp/example1.logstdout_logfile_maxbytes=100MBstdout_logfile_backups=10redirect_stderr=trueautostart=trueautorestart=unexpectedexitcodes=0,2stopsignal=QUITstopwaitsecs=20注意点(踩坑)
- supervisord中参数minfds和minprocs决定了supervisord进程及其守护的子进程的Max Processes及Max open files,并且这个limit限制不受系统ulimit所影响
- supervisord守护的子进程无法在supervisord配置文件中单独修改minfds和minprocs这两个参数。下面红色部分的配置是无效的
以上截取自旺仔牛奶Blog的结论
附:CentOS7与CentOS6对比
CentOS7并没有在生产环境大量使用,刚好可以利用这次线上测试的机会稍微总结下
主要区别大致包含以下几个方面:
- 基础命令
- 内核版本(2.x和3.x)
- 文件系统(ext4和xfs)
- 安全系统(防火墙)
- 服务管理(service和systemctl)
- 新增特性(虚拟化、性能管理、身份管理、网络管理等)
建议
- 使用Docker建议使用系统版本>=7.4,7.2印象中之前测试有关于cgroup的坑,另外啰嗦一个下Docker对内核版本的要求是至少3.8;目前官方推荐大于3.10【官网地址】
- 看到【CSDN上的一篇Blog】里面介绍了一些命令的不同,我也懒得总结了
- 还是看这个好【CentOS官方ReleaseNote】