如何使用supervisor管理你的應用
1、前言
Supervisor(http://supervisord.org/)是用Python開發的一個client/server服務,是UNIX-like系統下的一個進程管理工具,不支持Windows系統。它可以很方便的監聽、啟動、停止、重啟一個或多個進程。
提供的高可用場景,當你的程序出現異常,例如core/內存溢出等,導致服務進程被殺死,這個時候supervisort監聽到進程終止後,會自動將它重新拉起。
2、安裝
supervisor是基於python開發的,所以安裝時首先要保證有python環境,當然最好已經安裝了如下工具。
pip:python的包管理工具
virtualenv:虛擬沙盒環境
當安裝方式很簡單。
pip install supervisor
supervisor是一個C/S架構的工具。安裝完成後,會生成三個執行程序:
1)supervisortd:守護進程服務(用於接收進程管理命令)
2)supervisorctl:客戶端(用於和守護進程通信,發送管理進程的指令)
3)echo_supervisord_conf:生成初始配置文件程序
3、配置
運行supervisor服務的時候,需要指定supervisor的配置文件,有兩種方式:
1)顯式的指定
可以通過-c參數顯式的指定supervior配置文件,靈活性高
$SUPERVISOR/bin/supervisorctl -c $SUPERVISOR/conf/supervisord.conf start CIServer
2)非顯式的指定
如果沒有顯示指定的話,supervisor會在如下路徑下找配置文件:
$CWD/supervisord.conf $CWD/etc/supervisord.conf /etc/supervisord.conf /etc/supervisor/supervisord.conf (since Supervisor 3.3.0) ../etc/supervisord.conf (Relative to the executable) ../supervisord.conf (Relative to the executable)
初始配置文件的生成,使用如下命令
echo_supervisord_conf > /etc/supervisor/supervisord.conf
4、配置文件參數說明
一般來說,配置管理我們采用supervisor+program的方式。
將supervisor的配置文件,和管理進程的配置文件區分開,這樣的好處是,當有多個進程需要管理的時候,不會互相幹擾。
下面分開說明一下。
1)配置supervisor
先粘上我使用的supervisor配置,後面再詳細講解。
[unix_http_server]
file=/home/kangaroo/supervisor/run/supervisor.sock ;必須,UNIX socket文件,supervisorctl 會使用
;chmod=0700 ; socket file mode (default 0700)
;chown=nobody:nogroup ; socket file uid:gid owner
;username=user ; (default is no username (open server))
;password=123 ; (default is no password (open server))
;[inet_http_server] ; inet (TCP) server disabled by default
;port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for all iface)
;username=user ; (default is no username (open server))
;password=123 ; (default is no password (open server))
[supervisord]
logfile=/home/kangaroo/supervisor/log/supervisord.log ;日誌文件,默認是 $CWD/supervisord.log
logfile_maxbytes=50MB ;日誌文件大小,超出會rotate,默認 50MB,如果設成0,表示不限制大小
logfile_backups=10 ;日誌文件保留備份數量默認10,設為0表示不備份
loglevel=info ;日誌級別,默認info,其它: debug,warn,trace
pidfile=/home/kangaroo/supervisor/run/supervisord.pid ;進程pid文件 supervisord.pid
nodaemon=false ;是否在前臺啟動,默認是false,即以 daemon 的方式啟動
minfds=1024 ;可以打開的文件描述符的最小值,默認 1024
minprocs=200 ;可以打開的進程數的最小值,默認 200
; 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:///home/kangaroo/supervisor/run/supervisor.sock ;通過UNIX socket連接supervisord,路徑與unix_http_server部分的file一致
[include]
files = /home/kangaroo/supervisor/supervisor.d/*.conf
2)配置program進程
可以看到上面文件中有[include]項,這個項指定了在/home/kangaroo/supervisor/supervisor.d/*.conf路徑下的配置文件也會被加載進來。
一般來說我們會在這些配置文件裏管理進程的配置。
vim /home/kangaroo/supervisor/supervisor.d/CIServer.conf
配置內容
[program:CIServer] ; 程序名稱,可以通過ctl指定名稱進行控制 directory = /home/kangaroo/build/CIServer ; 程序的啟動目錄 command = python manage.py runserver --noreload 0.0.0.0:8200 ; 啟動命令,可以看出與手動在命令行啟動的命令是一樣的 autostart = true ; 在 supervisord 啟動的時候也自動啟動 startsecs = 5 ; 啟動 5 秒後沒有異常退出,就當作已經正常啟動了 autorestart = true ; 程序異常退出後自動重啟 startretries = 3 ; 啟動失敗自動重試次數,默認是 3 user = xiaoju ; 用哪個用戶啟動 redirect_stderr = true ; 把 stderr 重定向到 stdout,默認 false stdout_logfile_maxbytes = 20MB ; stdout 日誌文件大小,默認 50MB stdout_logfile_backups = 20 ; stdout 日誌文件備份數 ; stdout 日誌文件,需要註意當指定目錄不存在時無法正常啟動,所以需要手動創建目錄(supervisord 會自動創建日誌文件) stdout_logfile = /home/kangaroo/supervisor/log/supervior.log
這樣就配置完成了。
5、啟動supervisor管理服務
supervisord -c /etc/supervisor/supervisord.conf
這樣,進程就被啟動並且管理起來了。
6、client的命令
最後補充上一些supervisorctl的命令供參考
supervisorctl start CIServer # 啟動,配置文件中要配置program:CIServer supervisorctl stop CIServer # 關閉 supervisorctl restart CIServer # 重啟 supervisorctl status # 查看管理進程的狀態
如何使用supervisor管理你的應用