摘要
本文主要介紹服務端部署所用到的幾個工具,如nohup, gunicorn, supervisor等。
nohup使用
nuhup
1.用途:不掛斷地運行命令。
2.語法:nohup Command [ Arg … ] [ & ]
-
無論是否將 nohup 命令的輸出重定向到終端,輸出都將附加到當前目錄的 nohup.out 文件中。
-
如果當前目錄的 nohup.out 文件不可寫,輸出重定向到 $HOME/nohup.out 文件中。
-
如果沒有文件能創建或打開以用於追加,那么 Command 參數指定的命令不可調用。
3.退出狀態:該命令返回下列出口值:
- 126: 可以查找但不能調用 Command 參數指定的命令。
- 127: nohup 命令發生錯誤或不能查找由 Command 參數指定的命令。否則,nohup 命令的退出狀態是 Command 參數指定命令的退出狀態。
&
1.用途:在后台運行
一般和nohup一起用
nohup command &
eg:
# 默認將輸出寫入nohup.out文件
nohup redis-server &
# 自定義將輸出寫入到log.txt
nohup redis-server > log.txt 2>&1 &
3.退出:
可以使用jobs
命令列出所有后台進程。然后使用fg %進程id
來將后台程序調到前台執行。如:
[xxx@localhost server]$ jobs
[1]- 運行中 nohup redis-server >> redis.log 2>&1 &
[2]+ 運行中 nohup gunicorn -c runtime/gunicorn.py "wsgi:app" &
[xxxr@localhost server]$ fg %2
nohup gunicorn -c runtime/gunicorn.py "wsgi:app"
這樣,便可以通過ctrl+c
來停止運行,或者ctrl+z
掛起任務。若想繼續啟動掛起的任務,可用bg %進程id
uwsgi
簡介
WSGI(Python Web Server Gateway Interface):Python Web 服務器網關接口,是 Python 語言定義的 Web 服務器和 Web 應用程序之間一種簡單通用的接口。WSGI 分為兩個部分,一個是“服務器”或“網關”,一個是“應用程序”或“應用框架”,在處理一個請求時,服務器為應用程序提供環境信息及一個回調函數,當應用程序完成處理請求后,通過回調函數將結果回傳給服務器。
參考:https://www.cnblogs.com/TM0831/p/11643128.html
gunicorn使用
簡介
Gunicorn是一個unix上被廣泛使用的高性能的Python WSGI UNIX HTTP Server。
和大多數的web框架兼容,並具有實現簡單,輕量級,高性能等特點.
較為綜合的介紹:https://zhuanlan.zhihu.com/p/102716258
配置參數
1.官方文檔:https://docs.gunicorn.org/en/stable/settings.html
2.gunicorn 詳解(配置案例和部分參數說明): https://www.jianshu.com/p/69e75fc3e08e
3.通過優化 Gunicorn 配置提高性能:https://juejin.im/post/6844903850713825287
部署案例
flask部署案例:https://juejin.im/entry/6844903634115756039#comment
supervisor使用
簡介
Supervisor (http://supervisord.org) 是一個用 Python 寫的進程管理工具,可以很方便的用來啟動、重啟、關閉進程(不僅僅是 Python 進程)。除了對單個進程的控制,還可以同時啟動、關閉多個進程,比如很不幸的服務器出問題導致所有應用程序都被殺死,此時可以用 supervisor 同時啟動所有應用程序而不是一個一個地敲命令啟動。
1.安裝:
pip install supervisor
2.Supervisor安裝后會生成三個部分,分別是:
- supervisord守護進程服務
- supervisorctl客戶端
- echo_supervisord_conf生成初始配置文件程序
3.supervisorctl相關命令:
$ supervisorctl status # 查看程序狀態
$ supervisorctl stop program_name # 關閉 program_name 程序
$ supervisorctl start program_name # 啟動 program_name 程序
$ supervisorctl restart program_name # 重啟 program_name 程序
$ supervisorctl reread #讀取有更新(增加)的配置文件,不會啟動新添加的程序,也不會重啟任何程序
$ supervisorctl reload # 載入最新的配置文件,停止原有的進程並按照新的配置啟動
$ supervisorctl update #重啟配置文件修改過的程序,配置沒有改動的進程不會收到影響而重啟
Supervisor特征
1.可以准確的控制子進程:通常,在Unix進程上,比較難獲得准確的進程上下文狀態,Pidfiles經常不准確(?)(Pidfiles是linxu中用來進行進程守護的一種機制,簡單而言就是要守護的進程PID進入在file中,定時檢查),Supervisor會將要監控的進程作為子進程啟動,這樣Supervisor的父進程就始終知道子進程正在的上下文狀態,同時可以很方便的控制該子進程(這就是為什么Supervisor要求要它管理的進程必須由它來啟動,而不能管理已啟動的進程)
2.Delegation機制 Delegation代表團機制,可以通過配置允許不同權限的用戶對相應的監控進程進行啟動與管理
3.優先級流程組 Supervisor可以為監控進程設置優先級,以不同的順序啟動進行,當然也可以直接 start all或 restart all
4.高效性 Supervisor的主進程會通過fork/exec的方式啟動被監控的進程,但其實不會對子進程進行守護,當被監控進程終止時,操作系統會主動立刻的向Supervisor發出信號,Supervisord接收到信號后,會執行相應的重啟邏輯,這與某些依賴於PID文件和定期輪訓重啟終止進程的方法不同,更為高效。
5.高拓展 Supervisor內有簡單的事件通知協議,可以通過任意語言來實現一個監聽器來監聽事件通知,它還有XML-RPC接口用於擴展
配置參數
1.快速入門(使用 supervisor 管理進程):http://liyangliang.me/posts/2015/06/using-supervisor/
2.官方文檔:http://supervisord.org/index.html
部署案例
1.Supervisord管理進程實踐:https://thief.one/2018/06/01/1/
存在的缺陷
目前所知缺陷:
1.Supervisor管理的進程必須由supervisord啟動,即已啟動的程序是無法使用supervisord進行管理的。
2.Supervisor要求管理的程序是非后台式的程序(not daemon program),因為Supervisord會自動幫你將要管理的進程轉為后台進程,如果原本就是后台進程就存在問題,比如要使用Supervisor管理nginx,nginx就需要在配置文件中添加daemon off讓nginx以非后台運行形式啟動。
3.Supervisor不支持windows,只支持類UNIX系統,如Centos、Ubuntu、MacOS
一個類似的監控工具:Monit
Monit可以對系統狀態、進程、文件、目錄和設備進行監控,適用於Linux平台,可以自動重啟已掛掉的程序,比較適合監控系統的關鍵進程和資源,如nginx、apache、mysql和cpu占有率等。