Swift服务端开发系列完整版
一、Supervisor 简介
将应用部署到线上后,需要保证应用一直处于运行状态,在遇到程序异常、报错等情况,导致应用终止时,需要保证程序可以立刻重启,继续提供服务。
Supervisor 是一个用 Python 写的进程管理工具,可以在 UNIX 系统(不支持 Windows)下时刻监控应用的运行情况,管理进程的启动、停止、崩溃自动重启等。
二、安装
Ubuntu系统下,建议使用:
apt-get install supervisor
通过这种方式安装后,自动设置为开机启动。
三、Supervisor 配置
Supervisor 是一个 C/S 模型的程序,supervisord
是 server 端,supervisorctl
是 client 端。
1、准备程序文件
在 home/ubuntu/
目录下,新建三个文件夹分别为 applications 、spareFiles 、logs ,示例
mkdir applications
mkdir spareFiles
mkdir logs
将swift build
编译好的项目拷贝到 applications
文件夹下
cp /home/ubuntu/AimTrendServerSide/.build/debug/Run /home/ubuntu/applications/
在spareFiles
文件夹中创建一个 Run.conf
用于编辑Run
程序的进程守护配置,下面会用到。
cd spareFiles
touch Run.conf
在logs
文件夹中创建一个 Run_stout.log
用于存储log信息。
cd logs
touch Run_stout.log
2、supervisord配置
supervisord 的配置文件默认位于 /etc/supervisord.conf,打开 supervisord.conf
文件
vim supervisord.conf
默认内容如下(;后面为注释):
; supervisor config file
[unix_http_server]
file=/var/run/supervisor.sock ; (the path to the socket file) UNIX socket 文件,supervisorctl 会使用
chmod=0700 ; sockef file mode (default 0700) socket 文件的 mode,默认是 0700
[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log) 日志文件,默认是 $CWD/supervisord.log
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid) pid 文件
childlogdir=/var/log/supervisor ; ('AUTO' child log dir, default $TEMP)
; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket 通过 UNIX socket 连接 supervisord,路径与 unix_http_server 部分的 file 一致
; 在增添需要管理的进程的配置文件时,推荐写到 `/etc/supervisor/conf.d/` 目录下,所以 `include` 项,就需要像如下配置。
; 包含其他的配置文件
[include]
files = /etc/supervisor/conf.d/*.conf ; 引入 `/etc/supervisor/conf.d/` 下的 `.conf` 文件
确认下最后两行的读取配置的路径,设置如下:
[include]
files = /etc/supervisor/conf.d/*.conf
2、program 配置
如果不是root账号,需要对这些目录进行权限设置。
$ sudo chmod 777 /var/run
$ sudo chmod 777 /etc/supervisor
打开 /home/ubuntu/spareFiles
目录下的 Run.conf
vim Run.conf
在 Run.conf 中存储 以下内容
[program:Run] ; Run 运行的可执行文件名
directory=/home/ubuntu/applications ; 可执行文件所在文件目录
command=/home/ubuntu/applications/Run ;可执行程序要用绝对路径执行
user=ubuntu ; 在该账户中运行程序
autostart=true ; 开机启动
autorestart=true ; 自动重启动
startretries=10 ; 连续自动重启次数
redirect_stderr=true ; 如果为true,则stderr的日志会被写入stdout日志文件中
默认为false,非必须设置
stdout_logfile_maxbytes = 50MB ;日志文件大小
stdout_logfile_backups = 20 ;日志文件备份文件数量
stdout_logfile=/home/ubuntu/logs/Run_stout.log ;程序的stdout的日志文件路径
再将 Run.conf 拷贝到 /etc/supervisor/conf.d
目录下
sudo cp /home/ubuntu/spareFiles/Run.conf /etc/supervisor/conf.d
注意:
1、command 可执行程序要用绝对路径执行。扩展阅读
2、stdout_logfile 对应的目录文件一定要存在,否则会启动失败。
四、Supervisor 操作
1、启动Supervisor服务端
sudo supervisord
可能会遇到提示错误,端口被另一个占用
Error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting supervisord.
表示supervisord 已启动,查看supervisord 进程
ps -ef | grep supervisord
看到如下输出,则启动完成
ubuntu@VM-0-9-ubuntu:~/logs$ ps -ef | grep supervisord
ubuntu 11041 4926 0 01:31 pts/0 00:00:00 grep --color=auto supervisord
root 26317 1 0 Dec21 ? 00:00:01 /usr/bin/python /usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf
2、查看保活程序是否正常启动
1、查看Run相关进程
ps -ef | grep Run
看到如下输出,则正常运行中
ubuntu@VM-0-9-ubuntu:~/logs$ ps -ef | grep Run
ubuntu 9094 26317 20 01:26 ? 00:00:59 /home/ubuntu/applications/Run
ubuntu 11060 4926 0 01:31 pts/0 00:00:00 grep --color=auto Run
2、确认正常启动
supervisorctl status
看到如下输出,表示 Run 已正常启动
ubuntu@VM-0-9-ubuntu:~/logs$ supervisorctl status
Run RUNNING pid 9094, uptime 0:09:39
3、查看log输出
进入到/home/ubuntu/logs 目录下查看 Run_stout.log最后10条日志信息
tail -n 10 Run_stout.log
3、supervisorctl 常用命令
命令 | 说明 |
---|---|
supervisorctl start program_name | 启动某个进程 |
supervisorctl stop program_name | 停止某个进程 |
supervisorctl restart program_name | 重启某个进程 |
supervisorctl stop all | 停止全部进程 |
supervisorctl status | 查看supervisorctl状态 |
supervisorctl reload | 更新所有配置文件,并重启进程 |
supervisorctl update | 仅重启有更新配置或有改动的进程 |
推荐阅读:Swift服务端开发系列完整版
扩展阅读:
1、supervisor(一)基础篇
2、supervisor(二)event
3、supervisor(三)xml_rpc