一、Supervisor 簡介
Supervisor 是一款基於 Python 開發的進程管理工具,能夠將普通命令行進程轉換為後台守護進程,並提供以下核心能力:
- 進程監控:實時監控子進程運行狀態
- 自動重啓:進程異常退出時自動恢復
- 集中管理:通過命令行或 Web 界面統一管理多進程
- 日誌聚合:自動捕獲進程的標準輸出和錯誤日誌
其工作原理是通過 fork/exec 機制啓動被管理進程,使其成為 Supervisor 的子進程。當子進程異常終止時,父進程能及時感知並觸發重啓策略。
二、核心應用場景
-
消息隊列消費
- 管理多進程消費隊列任務,避免單點故障導致的業務中斷
- 示例:RabbitMQ、Kafka 消費者進程守護
-
定時任務調度
- 確保 Cron 任務穩定執行,失敗後自動重試
- 示例:數據同步、報表生成等定時作業
-
關鍵服務守護
- 維持 Web 服務、API 接口等長時運行進程的可用性
- 示例:Flask/Gunicorn、Node.js 應用守護
-
批處理任務管理
- 監控數據處理、文件解析等批處理任務的執行狀態
三、安裝部署(CentOS 環境)
# 通過 yum 快速安裝
yum install -y supervisor
# 驗證安裝
supervisord --version
四、配置文件詳解
-
主配置文件路徑
vim /etc/supervisord.conf -
啓用 Web 控制枱
取消以下配置段的註釋,並按需修改:[unix_http_server] file=/var/run/supervisor/supervisor.sock ; Socket 文件路徑 chmod=0700 ; 文件權限(默認 0700) [inet_http_server] port=127.0.0.1:9001 ; 監聽地址和端口(生產環境建議綁定內網 IP) username=user ; 登錄用户名 password=123 ; 登錄密碼安全建議:
- 若需外網訪問,可將
port改為0.0.0.0:9001,但需配合防火牆限制 IP 訪問 - 使用強密碼並定期更換
- 若需外網訪問,可將
-
服務管理命令
# 啓動/停止/重啓 systemctl start|stop|restart supervisord # 查看狀態 systemctl status supervisord
五、子進程配置實戰(以 ThinkPHP6 隊列為例)
-
創建子進程配置文件
cd /etc/supervisord.d touch test_queue.ini -
編寫進程配置
[program:test_queue] ; 程序名稱(需與文件名一致) command=php /www/wwwroot/tp6/think queue:listen --queue test_queue ; 啓動命令(絕對路徑更可靠) directory=/www/wwwroot/tp6 ; 可選:指定命令執行的工作目錄 autostart=true ; Supervisor 啓動時自動拉起該進程 autorestart=true ; 進程異常退出時自動重啓 startretries=3 ; 啓動失敗重試次數(默認 3) user=root ; 運行用户(建議使用非 root 用户) stdout_logfile=/var/log/test_queue.out.log ; 標準輸出日誌(自動切割需額外配置) stderr_logfile=/var/log/test_queue.err.log ; 錯誤日誌 environment=LANG="en_US.UTF-8" ; 可選:設置環境變量 -
生效配置
# 語法檢查(重要!) supervisord -c /etc/supervisord.conf --check # 重新加載配置 supervisorctl reread # 讀取新配置 supervisorctl update # 應用變更並重啓相關進程 # 或直接重啓服務(影響所有進程) systemctl restart supervisord
六、進程管理技巧
# 查看所有進程狀態
supervisorctl status
# 管理單個進程
supervisorctl start|stop|restart test_queue
# 查看進程日誌
tail -f /var/log/test_queue.out.log
# 進入交互式控制枱
supervisorctl
七、Web 控制枱使用指南
-
訪問方式
-
若
port=127.0.0.1:9001:通過 SSH 端口轉發訪問ssh -L 9001:localhost:9001 your_server_ip瀏覽器訪問
http://localhost:9001 - 若
port=0.0.0.0:9001:直接訪問http://your_server_ip:9001
-
-
控制枱功能
- 實時查看進程狀態(運行中、停止、重啓次數)
- 一鍵啓停進程
- 查看實時日誌輸出
- 修改配置後在線重載
八、最佳實踐
-
日誌管理
- 使用
logrotate實現日誌自動切割和歸檔 - 避免日誌文件無限增長導致磁盤佔滿
- 使用
-
權限控制
- 使用非 root 用户運行進程(通過
user=www-data配置) - 限制 Web 控制枱的訪問 IP
- 使用非 root 用户運行進程(通過
-
高可用方案
- 對 Supervisor 本身配置監控,防止單點故障
- 結合 Keepalived 實現雙機熱備
-
異常排查
- 通過
supervisorctl tail test_queue stderr快速查看錯誤 - 檢查系統資源(內存、CPU、句柄數)是否不足
- 通過
附錄:常用配置參數説明
| 參數 | 説明 |
|---|---|
numprocs |
啓動進程數(實現多進程負載均衡) |
priority |
啓動優先級(數字越小越早啓動) |
stopwaitsecs |
強制終止前的等待時間(默認 10 秒) |
redirect_stderr |
將標準錯誤重定向到標準輸出(簡化日誌管理) |
通過合理配置 Supervisor,可顯著提升服務的可靠性和運維效率。