契機

自己建立的 flask 服務不知莫名的原因一直掛掉非常苦惱,當務之急是讓這個服務不要中斷,於是找到這個 supervisor 套件可以幫忙監控服務。而本篇文章特別紀念一下這位 Supervisor 大功臣。

簡介

Supervisor 是一個用 python 撰寫的程序管理套件,提供視覺化介面,方便可以啟用、重啟和關閉。該套件可以監控程序的狀態,若程序掛掉可以自動重啟,易於開發者監控服務。

安裝步驟

實作環境為 Ubuntu 20.04.2 LTS

sudo apt-get install supervisor

待會有兩個檔案需要設定,分別為 Supervisor 設定檔和自己服務的設定檔

Supervisor 設定檔

將範例檔存到自己的路徑,而我是存放於 /etc/supervisor 的路徑之下

echo_supervisord_conf > /etc/supervisor/supervisord.conf

接著進入設定檔修改參數

vim /etc/supervisor/supervisord.conf

修改最後兩行參數,修改 files 指向,待會要新增設定服務檔

[include]
files = /etc/supervisor/conf.d/*.conf ;

我有特別將 unix_http_server、inet_http_server 、supervisorctl 的註解做改寫如下(因為一直遇到 ProtocolError: <ProtocolError for 127.0.0.1/RPC2: 401 Unauthorized> 的錯誤,主要是因為 authentication,有找這篇文章解決問題)

[unix_http_server]
file=/tmp/supervisor.sock
chmod=0700
chown=nobody:nogroup
username=user
password=123
...
[inet_http_server]
port=127.0.0.1:9001
username=user
password=123
...
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock
serverurl=http://127.0.0.1:9001
username=user
password=123

服務設定檔

新增自己要監控的服務設定檔,例如我創建一個 demo.conf

vim /etc/supervisor/conf.d/demo.conf

在這個 demo.conf 可以設定您的服務,這邊的 program 名稱等等會用到哦!

[program:demo_server]
command = python3 manager.py runserver
directory = /home/erik/demo_server
user = erik
autostart = true
autorestart = true
stdout_logfile = /home/erik/supervisor/log/demo_server.log
stderr_logfile = /home/erik/supervisor/log/demo_server_err.log
environment = NODE_ENV='prod'

啟用監控服務

啟動 Supervisor
上面都設定完畢後就可以啟動 Supervisor 囉!

supervisord -c /etc/supervisor/supervisord.conf

可以看一下是否有在 9001 port 啟動服務或是用 ps -ef 看一下

lsof -i:9001
ps -ef | grep supervisor

啟動服務監控

接者就啟動自己的服務

supervisorctl start demo_server

如果發現沒有啟動成功,可以看一下錯誤問題是什麼

supervisorctl tail demo_server stderr

筆者就發現該環境沒有安裝好 flask_script (應該要用 docker 來避免環境的問題)

裝好後大家就可以自己殺掉服務,看 supervisor 有沒有幫你重啟服務。

常用 Supervisor 指令

supervisorctl start
supervisorctl restart
supervisorctl stop

使用心得

只要幾個安裝步驟就可以方便監控服務,之後不需要服務掛掉要自己重啟,還有 web 面板可以操控,真是不錯!