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

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

簡介

Supervisor 是一個用 Python 寫的進程管理工具,能夠很方便的用來啓動、重啓、關閉進程。相似於 Linux 的 systemd 守護進程同樣,經過統一的命令來管理系統的各個服務,當管理的服務掛掉時會自動從新拉起。Supervisor 還提供了不少第三方插件,好比後面會講到的 CeSi,該工具是 Supervisor 的 WebUI,能夠經過這個統一的 WebUI 集中化管理各個服務器節點的進程。css

Supervisor 和 Docker 的架構相似,也是 C/S 架構,服務端是 supervisord,客戶端是 supervisorctl 。客戶端主要是用來控制服務端所管理的進程,好比控制服務的啓動、關閉、重啓、查看服務狀態,還能夠重啓服務端、重載配置文件等。服務端管控各個服務的正常運行,當有服務異常退出時會自動拉起。html

Supervisor 的安裝及基本使用

1. 安裝

Supervisor 的安裝特別簡單,因爲是 Python 寫的,所以能夠經過 pip 一鍵安裝:node

pip install supervisor
  • 1

在此我提供了一個 Sueprvisor 一鍵安裝配置腳本,簡化了 Supervisor 的初始配置。python

2. 基本使用

安裝完成後系統會多出以下三個命令:ios

supervisord :Supervisor 的服務端; 
supervisorctl:Supervisor 的客戶端; 
echo_supervisord_conf:Supervisor 服務端默認配置文件生成工具;git

2.1 啓動 supervisor

首先經過以下命令將 supervisor 的默認配置生成到 /etc/supervisord.confgithub

echo_supervisord_conf > /etc/supervisord.conf
  • 1

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
  • 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 服務的配置):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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

將上述配置保存爲 cesi.conf 放到 /etc/supervisor/flask

前面已經對 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

相關文章
相關標籤/搜索