容器中使用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

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