通過 CeSi + Supervisor 可視化集中管理服務器節點進程


通過 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 有三個依賴:PythonFlasksqlite3 
一般的 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM