Supervisor 是一個用 Python
寫的進程管理工具,能夠很方便的用來啓動、重啓、關閉進程。相似於 Linux
的 systemd
守護進程同樣,經過統一的命令來管理系統的各個服務,當管理的服務掛掉時會自動從新拉起。Supervisor
還提供了不少第三方插件,好比後面會講到的 CeSi,該工具是 Supervisor
的 WebUI
,能夠經過這個統一的 WebUI
集中化管理各個服務器節點的進程。css
Supervisor
和 Docker
的架構相似,也是 C/S
架構,服務端是 supervisord
,客戶端是 supervisorctl
。客戶端主要是用來控制服務端所管理的進程,好比控制服務的啓動、關閉、重啓、查看服務狀態,還能夠重啓服務端、重載配置文件等。服務端管控各個服務的正常運行,當有服務異常退出時會自動拉起。html
Supervisor
的安裝特別簡單,因爲是 Python
寫的,所以能夠經過 pip
一鍵安裝:node
pip install supervisor
在此我提供了一個 Sueprvisor 一鍵安裝配置腳本,簡化了 Supervisor
的初始配置。python
安裝完成後系統會多出以下三個命令:ios
supervisord
:Supervisor 的服務端;supervisorctl
:Supervisor 的客戶端;echo_supervisord_conf
:Supervisor 服務端默認配置文件生成工具;git
supervisor
首先經過以下命令將 supervisor
的默認配置生成到 /etc/supervisord.conf
:github
echo_supervisord_conf > /etc/supervisord.conf
Supervisor
配置文件格式是 INI
格式,所以看起來比較直觀,不少配置項的含義已在上面生成的配置文件中以註釋的形式說明,如下簡要說明一下我在生產環境目前使用的配置,爲了減小篇幅,在此只列出了非註釋的內容:web
[unix_http_server]
file=/tmp/supervisor.sock ; 服務端套接字文件路徑,supervisorctl 客戶端會使用該文件和服務端通訊
[inet_http_server] ; Supervisor 服務端提供的 http 服務,不少 Supervisor 的 WebUI 都是經過訪問該服務來實現統一管理的,好比後面要講的 CeSi Web UI
port=0.0.0.0:9001 ; ip_address:port specifier, *:port for all iface [supervisord] ; Supervisor 服務端配置 logfile=/tmp/supervisord.log ; 服務端日誌文件路徑 logfile_maxbytes=50MB ; max main logfile bytes b4 rotation; default 50MB logfile_backups=10 ; # of main logfile backups; 0 means none, default 10 loglevel=debug ; log level; default info; others: debug,warn,trace pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid nodaemon=false ; start in foreground if true; default false minfds=1024 ; min. avail startup file descriptors; default 1024 minprocs=200 ; min. avail process descriptors;default 200 user=root [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] ; Supervisor 客戶端配置 serverurl=unix:///tmp/supervisor.sock ; 配置客戶端和服務端的通訊方式,默認 supervisorctl 和 supervisor 通訊是經過該套接字通訊,也能夠配成經過 http 方式通訊。 [include] ; 在此我將 Supervisor 所管理的服務配置文件都放到了 /etc/supervisor/ 目錄,而後經過 include 統一引入 files = /etc/supervisor/*.conf
接下來在 /etc/supervisor/
放入須要 Supervisor
管理的各服務的配置文件,通常一個服務一個配置文件,固然也能夠寫到一塊兒,好比邏輯上有關聯的一組服務能夠放到一個配置文件,這樣方便管理,下面以一個實例來介紹下要經過 Supervisor
管理服務,相應的配置文件該如何編寫(使用 Supervisor
管理 cesi
服務的配置):sql
; cesi.conf [program:cesi-5000] ; program 表示 Supervisor 管理的服務實例,cesi-5000 是本身命名的服務名稱,名字能夠隨便其,我爲了方便管理統一命名爲:服務名稱-端口 directory = /home/ec2-user/cesi ; 程序的啓動目錄 command = python cesi/web.py ; 啓動服務的命令 autostart = true ; 在 supervisord 啓動的時候也自動啓動 startsecs = 5 ; 啓動 5 秒後沒有異常退出,就看成已經正常啓動了 autorestart = true ; 程序異常退出後自動重啓 startretries = 3 ; 啓動失敗自動重試次數,默認是 3 user = ec2-user ; 用哪一個用戶啓動 redirect_stderr = true ; 把 stderr 重定向到 stdout,默認 false stdout_logfile_maxbytes = 50MB ; stdout 日誌文件大小,默認 50MB stdout_logfile_backups = 7 ; stdout 日誌文件備份數 ; stdout 日誌文件,須要注意當指定目錄不存在時沒法正常啓動,因此須要手動建立目錄(supervisord 會自動建立日誌文件) stdout_logfile = /home/ec2-user/cesi/stdout.log
將上述配置保存爲 cesi.conf
放到 /etc/supervisor/
。flask
前面已經對 echo_supervisord_conf
生成的默認配置文件作了微調,接下來啓動 Supervisor
服務端(建議用 root
用戶啓動):
sudo supervisord -c /etc/supervisord.conf
若是不指定 -c
參數,會經過以下順序來搜索配置文件:
$PWD/supervisord.conf $PWD/etc/supervisord.conf /etc/supervisord.conf /etc/supervisor/supervisord.conf
supervisorctl
supervisorctl
有兩種使用方式:
一種是直接執行 supervisorctl
,這樣會進入交互式的 Shell
, 而後在該交互式 Shell
中輸入管理命令,舉例:
[root@awsuw supervisor]# supervisorctl cesi-5000 RUNNING pid 6538, uptime 1 day, 1:21:02 zipkinstage-9411 RUNNING pid 30919, uptime 1 day, 19:51:43 supervisor> status cesi-5000 RUNNING pid 6538, uptime 1 day, 1:21:09 zipkinstage-9411 RUNNING pid 30919, uptime 1 day, 19:51:50
另外一種是 supervisorctl [action]
的方式,這樣不會陷入交互式 Shell
,直接會返回命令的執行結果,其中 action
就是管理服務進程的各個命令,舉例(查看目前所管理的服務的進程狀態):
[root@awsuw supervisor]# supervisorctl status cesi-5000 RUNNING pid 6538, uptime 1 day, 1:24:53 zipkinstage-9411 RUNNING pid 30919, uptime 1 day, 19:55:34
其中經常使用的 action
有以下(更多選項參數見 這裏):
supervisorctl status
: 查看所管理的服務狀態;supervisorctl start <program_name>
:啓動一個服務;supervisorctl restart <program_name>
:重啓一個服務(注意:重啓服務不會從新加載配置文件);supervisorctl stop <program_name>
:關閉一個服務;supervisorctl update
:從新加載配置文件,並重啓配置有變更的服務;supervisorctl reread
:從新加載配置文件,但不會重啓配置有變更的服務;supervisorctl reload
:重啓Supervisor
服務端;supervisorctl clear <program_name>
:清理一個服務的stdout log
;
CeSi 是 Supervisor
官方推薦的集中化管理 Supervisor
實例的 Web UI
,該工具是用 Python
編寫,基於 Flask
Web
框架 。
Superviosr
自帶的 Web UI
不支持跨機器管理 Supervisor
進程,功能比較簡單,經過 CeSi
能夠集中管理各個服務器節點的進程,在 Web 界面就能夠輕鬆管理各個服務的啓動、關閉、重啓等,很方便使用。
安裝 CeSi
有三個依賴:Python
,Flask
,sqlite3
通常的 Linux 發行版都默認安裝了 Python
,因此 Python
不須要再次安裝;
從 Python 2.5
開始 sqlite3
已經在標準庫內置了,因此也不須要安裝 sqlite3
模塊了;
另外不少 Linux 發行版已經自帶 sqlite3
,因此無需另外安裝;
只須要安裝 flask web
框架便可;
CeSi 已經有了新的版本,在 GitHub 倉庫的 v2_api
分支下,提供了比以前版本更加美觀的界面,如下爲 CeSi 一鍵安裝配置腳本:
# !/bin/bash set -e sudo pip install flask git clone https://github.com/gamegos/cesi.git cd cesi # 使用最新版, 最新版的 Web UI 作了很大改動 git checkout -b v2_api origin/v2_api sudo cp cesi.conf.sample /etc/cesi.conf sudo ln -s /etc/cesi.conf cesi.conf #建立用戶信息表: sqlite3 userinfo.db < userinfo.sql #CeSi log 目錄 sudo mkdir -p /var/logs/cesi sudo chmod 777 -R /var/logs exit 0
注意:CeSi
的配置文件路徑必須是 /etc/cesi.conf
,不然啓動會報錯,簡單看下 CeSi
的源碼就知道爲何了。在這裏我在倉庫目錄弄了個軟鏈接指向了 /etc/cesi.conf
,徹底是爲了編輯方便弄的。
CeSi
的配置很是簡單,和 Supervisor
的配置文件相似,也是 INI
格式,關於配置文件的各項說明在 cesi.conf.sample
配置樣例中已經經過註釋的形式給了明確的說明,稍微看下就能明白,如下爲我目前使用的配置(爲了減少篇幅,去掉了註釋):
[node:node1] ;各 Supervisor 節點的配置 username = ; 若是 Supervisor 節點沒有設置帳號密碼,這裏就保持爲空,但不能不寫 password = host = 127.0.0.1 port = 9001 [node:node2] username = password = host = node2.d.com port = 9001 [node:node3] username = password = host = node3.d.com port = 9001 [cesi] ; CeSi 自身的配置 database = userinfo.db activity_log = /var/logs/cesi/activity.log ;log目錄沒有的話須要提早建好 host = 0.0.0.0 port = 5000 ; CeSi 啓動端口 name = CeSI theme = superhero
CeSi
的啓動很是簡單,直接經過 Python
啓動便可:
python cesi/web.py
爲了方便管理,我把 CeSi
也經過 Supervisor
來管理,如下爲對應的 Supervisor
配置:
;cesi.conf [program:cesi-5000] directory = /home/ec2-user/cesi ; 程序的啓動目錄 command = python cesi/web.py autostart = true ; 在 supervisord 啓動的時候也自動啓動 startsecs = 5 ; 啓動 5 秒後沒有異常退出,就看成已經正常啓動了 autorestart = true ; 程序異常退出後自動重啓 startretries = 3 ; 啓動失敗自動重試次數,默認是 3 user = ec2-user ; 用哪一個用戶啓動 redirect_stderr = true ; 把 stderr 重定向到 stdout,默認 false stdout_logfile_maxbytes = 50MB ; stdout 日誌文件大小,默認 50MB stdout_logfile_backups = 7 ; stdout 日誌文件備份數 ; stdout 日誌文件,須要注意當指定目錄不存在時沒法正常啓動,因此須要手動建立目錄(supervisord 會自動建立日誌文件) stdout_logfile = /home/ec2-user/cesi/stdout.log
啓動完成後,作個 Nginx
反向代理便可經過瀏覽器訪問,最終效果以下:
如下爲在 RedHat7
下配置 Supervisor
開機自啓動過程,編寫 Unit
文件,使用 systemd
管理 Supervisor
:
1.編寫 Unit
文件:supervisord.service
:
#supervisord.service [Unit] Description=Supervisor daemon [Service] Type=forking ExecStart=/bin/supervisord -c /etc/supervisord.conf ExecStop=/bin/supervisorctl shutdown ExecReload=/bin/supervisorctl -c /etc/supervisord.conf reload KillMode=process Restart=on-failure RestartSec=42s [Install] WantedBy=multi-user.target
2.將上述文件拷貝到 /usr/lib/systemd/system/
目錄下
3.將 supervisor.service
註冊到系統中
[root@awsuw ~]# systemctl enable supervisord.service Created symlink from /etc/systemd/system/multi-user.target.wants/supervisord.service to /usr/lib/systemd/system/supervisord.service.
能夠看出註冊過程就是在 /etc/systemd/system/multi-user.target.wants/
目錄下建立一個軟連接指向第二步中的中拷貝到 /usr/lib/systemd/system/
的文件。
http://supervisord.org/index.html
http://www.bjhee.com/supervisor.html
https://www.jianshu.com/p/03619bf7d7f5
http://liyangliang.me/posts/2015/06/using-supervisor