通過 CeSi + Supervisor 可視化集中管理服務器節點進程
簡介
Supervisor 是一個用 Python
寫的進程管理工具,可以很方便的用來啟動、重啟、關閉進程。類似於 Linux
的 systemd
守護進程一樣,通過統一的命令來管理系統的各個服務,當管理的服務掛掉時會自動重新拉起。Supervisor
還提供了很多第三方插件,比如后面會講到的 CeSi,該工具是 Supervisor
的 WebUI
,可以通過這個統一的 WebUI
集中化管理各個服務器節點的進程。
Supervisor
和 Docker
的架構類似,也是 C/S
架構,服務端是 supervisord
,客戶端是 supervisorctl
。客戶端主要是用來控制服務端所管理的進程,比如控制服務的啟動、關閉、重啟、查看服務狀態,還可以重啟服務端、重載配置文件等。服務端管控各個服務的正常運行,當有服務異常退出時會自動拉起。
Supervisor 的安裝及基本使用
1. 安裝
Supervisor
的安裝特別簡單,由於是 Python
寫的,因此可以通過 pip
一鍵安裝:
pip install supervisor
- 1
在此我提供了一個 Sueprvisor 一鍵安裝配置腳本,簡化了 Supervisor
的初始配置。
2. 基本使用
安裝完成后系統會多出如下三個命令:
supervisord
:Supervisor 的服務端;supervisorctl
:Supervisor 的客戶端;echo_supervisord_conf
:Supervisor 服務端默認配置文件生成工具;
2.1 啟動 supervisor
首先通過如下命令將 supervisor
的默認配置生成到 /etc/supervisord.conf
:
echo_supervisord_conf > /etc/supervisord.conf
- 1
Supervisor
配置文件格式是 INI
格式,因此看起來比較直觀,很多配置項的含義已在上面生成的配置文件中以注釋的形式說明,以下簡要說明一下我在生產環境目前使用的配置,為了減少篇幅,在此只列出了非注釋的內容:
[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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
接下來在 /etc/supervisor/
放入需要 Supervisor
管理的各服務的配置文件,一般一個服務一個配置文件,當然也可以寫到一起,比如邏輯上有關聯的一組服務可以放到一個配置文件,這樣方便管理,下面以一個實例來介紹下要通過 Supervisor
管理服務,相應的配置文件該如何編寫(使用 Supervisor
管理 cesi
服務的配置):
; 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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
將上述配置保存為 cesi.conf
放到 /etc/supervisor/
。
前面已經對 echo_supervisord_conf
生成的默認配置文件做了微調,接下來啟動 Supervisor
服務端(建議用 root
用戶啟動):
sudo supervisord -c /etc/supervisord.conf
- 1
如果不指定 -c
參數,會通過如下順序來搜索配置文件:
$PWD/supervisord.conf $PWD/etc/supervisord.conf /etc/supervisord.conf /etc/supervisor/supervisord.conf
- 1
- 2
- 3
- 4
2.2 Supervisor 客戶端 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
- 1
- 2
- 3
- 4
- 5
- 6
另一種是 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
- 1
- 2
- 3
其中常用的 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
1. 簡介
CeSi 是 Supervisor
官方推薦的集中化管理 Supervisor
實例的 Web UI
,該工具是用 Python
編寫,基於 Flask
Web
框架 。
Superviosr
自帶的 Web UI
不支持跨機器管理 Supervisor
進程,功能比較簡單,通過 CeSi
可以集中管理各個服務器節點的進程,在 Web 界面就可以輕松管理各個服務的啟動、關閉、重啟等,很方便使用。
2. 安裝
安裝 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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
注意:CeSi
的配置文件路徑必須是 /etc/cesi.conf
,否則啟動會報錯,簡單看下 CeSi
的源碼就知道為什么了。在這里我在倉庫目錄弄了個軟連接指向了 /etc/cesi.conf
,完全是為了編輯方便弄的。
3. 配置
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
4. 啟動
CeSi
的啟動非常簡單,直接通過 Python
啟動即可:
python cesi/web.py
- 1
為了方便管理,我把 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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
啟動完成后,做個 Nginx
反向代理即可通過瀏覽器訪問,最終效果如下:
Supervisor 服務設置開機自啟動
以下為在 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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
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.
- 1
- 2
可以看出注冊過程就是在 /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