前言
对于大部分程序员来说, 主要工作都是进行编码以及一些简单的中间件安装, 这就导致了很多人对于 "运维" 相关的工作会比较生疏. 例如当我们拥有一台自己的服务器以后, 可能会在上面跑一跑自己 blog 程序, MySQL,nginx 等等. 当程序越来越多了没有一个统一的入口管理启停, 也可能会遇到一些特殊的原因导致程序被 kill 掉了, 这时候又没装相关的监控程序或者脚本 (太麻烦了懒得装, 机器配置差不想装), 所以只能当我们访问自己程序发现异常的时候才会登上服务器查找原因.
这些状况对我们来说是比较麻烦的, 那么这就需要一个 "神器" 来解放我们的双手, 铛铛铛!!Supervisor 就来了.
正文
Supervisor 介绍
Supervisor 是用 Python 开发的一套通用的进程管理程序, 能将一个普通的命令行进程变为后台 daemon, 并监控进程状态, 异常退出时能自动重启. 它是通过 fork/exec 的方式把这些被管理的进程当作 supervisor 的子进程来启动, 这样只要在 supervisor 的配置文件中, 把要管理的进程的可执行文件的路径写进去即可. 也实现当子进程挂掉的时候, 父进程可以准确获取子进程挂掉的信息的, 可以选择是否自己启动和报警.
supervisor 安装
简单粗暴
yum install supervisor -y
supervisor 配置说明
通过这种形式安装的 supervisor, 其配置文件的目录位于:
- /etc/supervisord.conf (主配置文件, 下面会详细介绍)
- /etc/supervisor.d/ (默认子进程配置文件, 也就是需要我们根据程序配置的地方)
supervisord.conf 基本配置项说明, 由于其参数比较多, 这些只贴出一些常用的配置项, 详细内容可参阅官网. 温馨提示 ";" 符号是表示该行配置被注释.
[unix_http_server]
file=/home/supervisor/supervisor.sock ; supervisorctl 使用的 socket 文件的路径
;chmod=0700 ; 默认的 socket 文件权限 0700
;chown=nobody:nogroup ; socket 文件的拥有者
[inet_http_server] ; 提供 web 管理后台管理相关配置
port=0.0.0.0:9001 ; Web 管理后台运行的 ip 地址及端口, 绑定外网需考虑安全性
;username=root ; Web 管理后台登录用户名密码
- ;password=root
- [supervisord]
- logfile=/var/log/supervisord.log ; 日志文件, 默认在 $CWD/supervisord.log
logfile_maxbytes=50MB ; 日志限制大小, 超过会生成新文件, 0 表示不限制
logfile_backups=10 ; 日志备份数量默认 10,0 表示不备份
loglevel=info ; 日志级别
pidfile=/home/supervisor/supervisord.pid ; supervisord pidfile; default supervisord.pid ; pid 文件
nodaemon=false ; 是否在前台启动, 默认后台启动 false
minfds=1024 ; 可以打开文件描述符最小值
minprocs=200 ; 可以打开的进程最小值
- [supervisorctl]
- serverurl=unix:///home/supervisor/supervisor.sock ; 通过 socket 连接 supervisord, 路径与 unix_http_server->file 配置的一致
- [include]
files = supervisor.d/*.conf ; 指定了在当前目录 supervisor.d 文件夹下配置多个配置文件
准备测试项目
这里我打包了一个简单的 spring-boot 程序, 存放与 "/opt/project/" 下.
在这个程序中我们只是简单的定义了一个 REST 接口, 主要用于演示作用.
- @RestController
- public class HelloController {
- @RequestMapping("/hello")
- public String hello(){
- return "hello world";
- }
- }
如果不用 supervisor 的话, 我们启动程序一般用一下命令
nohup java -jar springboot-hello-sample.jar &
这是以后台的方式启动 jar 包, 程序运行相关输出会在 nohup.out 中, 我们我们就不再赘述了, 那么我们来看一下, 切换到 supervisor 的方式, 我们是怎么配置项目, 以及管理的呢?
定义 supervisor 管理进程配置文件
从上面的配置文件 [include]->files 配置项我们可以知道, supervisor 会把 supervisor.d / 下以 conf 结尾的配置文件都加载进来, 那么我们在这个目录下面新建一个 sboot.conf, 内容如下:
[program:sboot] ;[program:xxx] 这里的 xxx 是指的项目名字
directory = /opt/project ; 程序所在目录
command = java -jar springboot-hello-sample.jar ; 程序启动命令
autostart=true ; 是否跟随 supervisord 的启动而启动
autorestart=true; 程序退出后自动重启, 可选值:[unexpected,true,false], 默认为 unexpected, 表示进程意外杀死后才重启
stopasgroup=true; 进程被杀死时, 是否向这个进程组发送 stop 信号, 包括子进程
killasgroup=true; 向进程组发送 kill 信号, 包括子进程
stdout_logfile=/var/log/sboot/supervisor.log; 该程序日志输出文件, 目录需要手动创建
stdout_logfile_maxbytes = 50MB; 日志大小
stdout_logfile_backups = 100; 备份数
可以看到, 在配置文件里面已经有配置该程序名, 启动路径等, 这样一来, supervisor 就可以完全的掌管程序的生死了. 接着我们执行
service supervisord restart
重启 supervisord.
观察效果
浏览器输入: 服务器 ip:9001 (这里的 Web 管理页面端口是在配置文件配置好的.)
如图所示, 我们可以可以观察到 springboot 程序已经是 running 状态了, pid 是 27517, 我们可以点击 Tail -f 来观察输出日志, 它的作用跟我们在服务器直接 "tail -f" 是类似的.
这里我们为了方便演示就没有添加验证了, 如果大家是在公网的使用环境, 需要配置文件里面的用户名密码验证注释打开. 不然别人扫出你的后台管理页面就可以随意控制程序了.
除了 Web 管理页面, 还有一些简单的命令也是需要我们掌握的.
直接在命令行输入 supervisorctl 会展示当前已配置好的项目信息.
- [root@wangzh supervisor.d]# supervisorctl
- sboot RUNNING pid 27517, uptime 0:18:04
- supervisor>
然后可以执行
start/stop/restart sboot 来简单控制项目的启停等
其他常用命令
- supervisorctl update #更新配置文件
- supervisorctl reload #重新启动配置的程序
- supervisorctl stop all #停止全部管理进程
结语
只需要一点简单的配置, 就可以统一的管理我们的程序了, 同时也可以在进程意外死掉的时候自动重启, 这些工作以后就交给 supervisor 了, 我们只要掌握一点简单的命令就可以 "为所欲为".
supervisor 官网: http://www.supervisord.org/
来源: https://www.cnblogs.com/coding-night/p/10694055.html