容器中使用supervisor监控应用进程

一、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

参考:https://www.jianshu.com/p/39b476e808d8

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章