supervisor 分為 客戶端和服務端, 這里記錄使用supervisor管理gunicorn測試機ubuntu16.04 + python3.6
supuervisor 屬於系統級別的直接安裝在 虛擬環境之外就可以
主要實現的是在虛擬環境中基於 Flask 框架 搭建一個web 應用,用 Gunicorn 做 wsgi 容器,用 Supervisor 管理進程, 這里我主要記錄Supervisor 進行進程管理
1 安裝
pip install supervisor
2 生成默認的配置文件 建議放在自建配置目
cd /etc mkdir supervisor cd supervisor echo_supervisord_conf > supervisor.conf # 生成 supervisor 默認配置文件
3 修改配置文件 啟動一定指定配置文件絕對路徑
vim supervisor.conf # 修改 supervisor 配置文件,添加 gunicorn 進程管理 在 supervisor.conf 配置文件底部添加 [program:myapp] 進程管理名稱隨便擬定 有時候和項目啟動腳本重復時 會出現Bug command=/home/myproject/venv/bin/gunicorn -w4 -b0.0.0.0:8080 app:app ; supervisor啟動命令 directory=/home/myproject ; 項目的文件夾路徑 startsecs=0 ; 啟動時間 stopwaitsecs=0 ; 終止等待時間 autostart=false ; 是否自動啟動 autorestart=false ; 是否自動重啟 stdout_logfile=/home/myproject/log/gunicorn.log ; log 日志 stderr_logfile=/home/myproject/log/gunicorn.err ; 錯誤日志
4 配置 web 管理界面
supervisor 還有一個 web 的管理界面,可以激活。更改下配置 客戶端 (ctl 表示客戶端 **d 表示服務端) [inet_http_server] ; inet (TCP) server disabled by default port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for alliface) username=wang ; (default is no username (open server) 登錄客戶端的賬號 password=123 ; (default is no password (open server)) 登錄客戶端的密碼 隨便擬定 服務端與下面客戶端配置必須一致 [supervisorctl] serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket username=wang ; should be same as http_username if set password=123 ; should be same as http_password if set ;prompt=mysupervisor ; cmd line prompt (default "supervisor") ;history_file=~/.sc_history ; use readline history if available
5 啟動服務
supervisord -c /etc/supervisor/supervisord.conf 啟動 同時啟動的客戶端和服務端 進入客戶端 supervisorctl -c /etc/supervisor/supervisord.conf 1 基本操作 help status 察看supervisor的狀態 reload 重新載入 配置文件 start [all]|[appname] 啟動指定/所有 supervisor管理的程序進程 stop [all]|[appname] 關閉指定/所有 supervisor管理的程序進程 2 直接操作 supervisorctl -c /etc/supervisor/supervisord.conf status 察看supervisor的狀態 supervisorctl -c /etc/supervisor/supervisord.conf reload 重新載入 配置文件 supervisorctl -c /etc/supervisor/supervisord.conf start [all]|[appname] 啟動指定/所有 supervisor管理的程序進程 supervisorctl -c supervisor.conf stop [all]|[appname] 關閉指定/所有 supervisor管理的程序進程
注意事項:
1. 先確認[program:XXX]中自己的程序的command=<啟動命令>和 directory=<運行命令的路徑>沒有問題,python是不是用的自己要的環境的python(比如虛擬環境的),log文件的文件夾是不是已經創建(沒創建的話supervisor沒權限生成log文件),以及改log文件是不是授權給所有用戶了(可參考前面的解決辦法chmod +x aaaaa.log)
2. 確保用上面的配置中的command在指定路徑可以直接運行不會報錯,這時候一般就不會有什么問題了。這時候tail你自己的log文件一般就能看到log信息,啟動失敗報錯的信息也會在你的log文件中,照着解決后supervisorctl reload就好了。
3. 如果上面的命令確保可以跑,但還是沒法正常運行,也看不到自己程序的報錯(不然你就能根據報錯解決問題了),那么恭喜,你遇到了跟我一樣的情況。我的解決辦法很詭異,嘗試把[program:XXX]中的名字換成了一個跟啟動命令不一樣的另一個名字(不要太短),reload之后居然就可以跑了
參考:
https://www.jianshu.com/p/be9dd421fb8d
https://blog.csdn.net/kkevinyang/article/details/80539940