golang開發:環境篇(六) Go執行監控Supervisord的使用
為什麼要使用Supervisord
17年第一次寫Go專案的時候,用Go開發專案倒沒沒費多大勁,很快就開發完成了。到了在測試環境部署的時候,由於不知道有 Supervisord 這個軟體,著實花了些功夫。總不能跟開發環境一樣,直接執行編譯生成的二進位制檔案吧,即使 後臺執行了,萬一它掛了,沒人知道,即使測試人員發現了,開發還得登入到伺服器再次啟動下這個二進位制檔案。很明顯這個解決方案沒有任何意義,後來就在網上找解決方案。
然後,諮詢Go開發的前同事,發現了Supervisord,喜出望外。它就是最優的解決方案啊。
Supervisord 是什麼?
Supervisord 是用 Python 實現的一款非常實用的程序管理工具,supervisord 還要求管理的程式是非 daemon 程式,supervisord 會幫你把它轉成 daemon 程式,因此如果用 supervisord 來管理 nginx 的話,必須在 nginx 的配置檔案裡新增一行設定 daemon off 讓 nginx 以非 daemon 方式啟動。
官方的解釋
Supervisor: A Process Control System
Supervisor is a client/server system that allows its users to monitor and control a number of processes on UNIX-like operating systems.
It shares some of the same goals of programs like launchd, daemontools, and runit. Unlike some of these programs, it is not meant to be run as a substitute for init as “process id 1”. Instead it is meant to be used to control processes related to a project or a customer, and is meant to start like any other program at boot time.
它是程序控制系統。監控和控制 Unix系統上程序。
Supervisor 安裝
當然是在我們的虛擬機器中安裝 Supervisor
sudo vagrant ssh apt-get install supervisor supervisorctl -h supervisorctl -- control applications run by supervisord from the cmd line. Usage: /usr/bin/supervisorctl [options] [action [arguments]] Options: -c/--configuration FILENAME -- configuration file path (default /etc/supervisord.conf) -h/--help -- print usage message and exit 出現上面的幫助資訊表示安裝成功了 安裝完成後,可以檢視配置 vim /etc/supervisor/supervisord.conf 看到 [include] files = /etc/supervisor/conf.d/*.conf supervisord 監控的專案的配置必須部署到 /etc/supervisor/conf.d/目錄下, 並且使用conf字尾
舉個栗子
找個簡單的Go Web的專案試試supervisor怎麼監控軟體執行的。
首先生成一個Go編譯生成的二進位制可執行檔案
main.go
package main
import (
"fmt"
"net/http"
"log"
)
func sayhelloName(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello China!")
}
func main() {
http.HandleFunc("/", sayhelloName)
err := http.ListenAndServe(":9090", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
編譯生成可執行檔案,測試下是否訪問是否正常
go build -o test.gobin
./test.gobin
curl http://192.168.0.10:9090
Hello China!
說明Go Web是正常的
接下來我們用使用Supervisord監控這個Go web程式。
先看下Supervisord監控的軟體的配置說明
[program:專案名]
command=/data/www/go/src/test/test.bin
程式啟動命令
autostart=true
在supervisord啟動的時候也自動啟動
startsecs=10
啟動10秒後沒有異常退出,就表示程序正常啟動了,預設為1秒
autorestart=true
程式退出後自動重啟,可選值:[unexpected,true,false],預設為unexpected,表示程序意外殺死後才重啟
startretries=3
啟動失敗自動重試次數,預設是3
user=root
用哪個使用者啟動程序,預設是root
priority=999
程序啟動優先順序,預設999,值小的優先啟動
redirect_stderr=true
把stderr重定向到stdout,預設false
stdout_logfile_maxbytes=20MB
stdout 日誌檔案大小,預設50MB
stdout_logfile_backups = 20
stdout 日誌檔案備份數,預設是10
stdout 日誌檔案,需要注意當指定目錄不存在時無法正常啟動,所以需要手動建立目錄(supervisord 會自動建立日誌檔案)
stdout_logfile=/data/logs/test/test.log
日誌輸出的檔案地址
stopasgroup=false
預設為false,程序被殺死時,是否向這個程序組傳送stop訊號,包括子程序
killasgroup=false
預設為false,向程序組傳送kill訊號,包括子程序
為上面我們生成 test.bin 的執行檔案建立一個Supervisord監控的配置檔案,配置檔案必須在 /etc/supervisor/conf.d 目錄下
cd /etc/supervisor/conf.d
vim test.conf
[program:test]
command=/data/www/go/src/test/test.bin
autostart=true
startsecs=10
autorestart=true
startretries=3
user=root
priority=999
redirect_stderr=true
stdout_logfile_maxbytes=20MB
stdout_logfile_backups = 20
stdout_logfile=/data/logs/test/test.log
stopasgroup=false
killasgroup=false
執行Supervisord,使之監控 test.gobin
添加了新的配置之後一定需要執行
supervisorctl update
會提示
test: added process group
表示test新增成功了。
檢視執行狀態
supervisorctl status
test RUNNING pid 4354, uptime 0:00:16
這樣表示執行成功了。
我們請求試下test.bin的服務是否正常。
curl http://192.168.0.10:9090
Hello China!
整個專案監控服務部署完成。
Supervisord 的常用命令
supervisorctl status 監控的程式的執行狀態的列表
supervisorctl stop test 停止監控的程式
supervisorctl start test 啟動監控的程式
supervisorctl restart test 重啟監控的程式
supervisorctl update 更新監控的程式,如有新的配置新增一定要先執行update
想了解更多,當然檢視官方文件。
http://supervisord.o