目录
一、Supervisor简介
二、Supervisor安装与配置
1.安装Supervisor
2.生成supervisor初始配置文件
3.打开配置文件,修改为自己项目需要的配置
三、在容器中使用Supervisor启动应用
1.supervisor启停命令
2.在容器中使用Supervisor
四、可能出现的问题
1.能用gunicorn启动应用,但使用supervisor启动应用,流水线部署通过,但是docker里面应用起不来,无限重启,显示异常,并且没有日志。
2.报错日志显示:entered FATAL state, too many start retries too quickly
一、Supervisor简介
Supervisor是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。
不使用守护进程会出现的三个问题:
- 1、ASP.NET Core应用程序运行在shell之中,如果关闭shell则会发现 ASP.NET Core程序被关闭,从而导致应用无法访问,这种情况当然是我们不想遇到的,而且生产环境对这种情况是零容忍的。
- 2、如果 ASP.NET Core进程意外终止那么需要人为连进shell进行再次启动,往往这种操作都不够及时。
- 3、如果服务器宕机或需要重启,我们则还是需要连入shell进行启动。
为了解决这些问题,我们需要有一个程序来监听 ASP.NET Core 应用程序的状况。并在应用程序停止运行的时候立即重新启动。
二、Supervisor安装与配置
1.安装Supervisor
pip install supervisor
2.生成supervisor初始配置文件
echo_supervisord_conf > supervisor.conf
3.打开配置文件,修改为自己项目需要的配置
我这边是用supervisor来启动gunicorn,然后gunicorn再去运行flask应用,所以我的supervisor得配置文件如下:
[unix_http_server]
file=/tmp/supervisor.sock ; the path to the socket file
[supervisord]
logfile=/opt/deployments/flask-app/log/supervisord.log ; main log file; default $CWD/supervisord.log
logfile_maxbytes=50MB ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=0 ; # of main logfile backups; 0 means none, default 10
loglevel=info ; log level; default info; others: debug,warn,trace
pidfile=/opt/deployments/flask-app/log/supervisord.pid ; supervisord pidfile; default supervisord.pid
nodaemon=true ; start in foreground if true; default false
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
[program:chinese_ocr]
command=gunicorn -c gunicorn.conf.py chinese_ocr:app ; the program (relative uses PATH, can take args)
startsecs=10 ; # of secs prog must stay up to be running (def. 1)
startretries=3 ; max # of serial start failures when starting (default 3)
autorestart=true ; when to restart if exited after running (def: unexpected)
user=ocpuser ; setuid to this UNIX account to run the program
redirect_stderr=true ; redirect proc stderr to stdout (default false)
stdout_logfile=/opt/deployments/flask-app/log/chinese_ocr_stdout_supervisord.log ; stdout log path, NONE for none; default AUTO
三、在容器中使用Supervisor启动应用
1.supervisor启停命令
启动命令:supervisord -c supervisor.conf
停止命令:supervisorctl -c supervisor.conf shutdown
2.在容器中使用Supervisor
CMD supervisord -c supervisor.conf
四、可能出现的问题
1.能用gunicorn启动应用,但使用supervisor启动应用,流水线部署通过,但是docker里面应用起不来,无限重启,显示异常,并且没有日志。
解决方法:容器里面不能以 daemon 模式启动,即不能以后台启动,检查配置文件里面的nodaemon是否为true,或在CMD命令中加入-n参数,即:CMD supervisord -n -c supervisor.conf
2.报错日志显示:entered FATAL state, too many start retries too quickly
解决方法:因为配置文件的默认用户是root,而容器限制了启动的用户。比如我这边限制了应用的启动用户为ocpuser,故检查配置文件中的用户是否是ocpuser,若不是则改为ocpuser