博客 / 詳情

返回

Supervisor 從入門到實戰:守護進程管理全解析


一、Supervisor 簡介

Supervisor 是一款基於 Python 開發的進程管理工具,能夠將普通命令行進程轉換為後台守護進程,並提供以下核心能力:

  • 進程監控:實時監控子進程運行狀態
  • 自動重啓:進程異常退出時自動恢復
  • 集中管理:通過命令行或 Web 界面統一管理多進程
  • 日誌聚合:自動捕獲進程的標準輸出和錯誤日誌

其工作原理是通過 fork/exec 機制啓動被管理進程,使其成為 Supervisor 的子進程。當子進程異常終止時,父進程能及時感知並觸發重啓策略。


二、核心應用場景

  1. 消息隊列消費

    • 管理多進程消費隊列任務,避免單點故障導致的業務中斷
    • 示例:RabbitMQ、Kafka 消費者進程守護
  2. 定時任務調度

    • 確保 Cron 任務穩定執行,失敗後自動重試
    • 示例:數據同步、報表生成等定時作業
  3. 關鍵服務守護

    • 維持 Web 服務、API 接口等長時運行進程的可用性
    • 示例:Flask/Gunicorn、Node.js 應用守護
  4. 批處理任務管理

    • 監控數據處理、文件解析等批處理任務的執行狀態

三、安裝部署(CentOS 環境)

# 通過 yum 快速安裝
yum install -y supervisor

# 驗證安裝
supervisord --version

四、配置文件詳解

  1. 主配置文件路徑

    vim /etc/supervisord.conf
  2. 啓用 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 訪問
    • 使用強密碼並定期更換
  3. 服務管理命令

    # 啓動/停止/重啓
    systemctl start|stop|restart supervisord
    
    # 查看狀態
    systemctl status supervisord

五、子進程配置實戰(以 ThinkPHP6 隊列為例)

  1. 創建子進程配置文件

    cd /etc/supervisord.d
    touch test_queue.ini
  2. 編寫進程配置

    [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"              ; 可選:設置環境變量
  3. 生效配置

    # 語法檢查(重要!)
    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 控制枱使用指南

  1. 訪問方式

    • 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
  2. 控制枱功能

    • 實時查看進程狀態(運行中、停止、重啓次數)
    • 一鍵啓停進程
    • 查看實時日誌輸出
    • 修改配置後在線重載

    Web 控制枱示例


八、最佳實踐

  1. 日誌管理

    • 使用 logrotate 實現日誌自動切割和歸檔
    • 避免日誌文件無限增長導致磁盤佔滿
  2. 權限控制

    • 使用非 root 用户運行進程(通過 user=www-data 配置)
    • 限制 Web 控制枱的訪問 IP
  3. 高可用方案

    • 對 Supervisor 本身配置監控,防止單點故障
    • 結合 Keepalived 實現雙機熱備
  4. 異常排查

    • 通過 supervisorctl tail test_queue stderr 快速查看錯誤
    • 檢查系統資源(內存、CPU、句柄數)是否不足

附錄:常用配置參數説明

參數 説明
numprocs 啓動進程數(實現多進程負載均衡)
priority 啓動優先級(數字越小越早啓動)
stopwaitsecs 強制終止前的等待時間(默認 10 秒)
redirect_stderr 將標準錯誤重定向到標準輸出(簡化日誌管理)

通過合理配置 Supervisor,可顯著提升服務的可靠性和運維效率。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.