標籤:
在這篇文章裡,我們將搭建一個簡單的 Web 應用程式,在虛擬環境中基於 Flask 架構,用 Gunicorn 做 wsgi 容器,用 Supervisor 管理進程,然後使用 OneAPM Python 探針來監測應用效能,形成一個「閉環」 !希望能對大家有所協助,首先簡單來介紹一下環境:
系統內容:ubuntu 14.04 Python 2.7.6
安裝組件庫
第一步安裝所需要的存放庫,因為打算用到虛擬環境,用到 pip 安裝和管理 Python 組件,所以先更新當地套件,然後安裝組件:
sudo apt-get update sudo apt-get install python-pip python-dev nginx
建立虛擬環境 virtualenv
在一個系統中建立不同的 Python 隔離環境,相互之間還不會影響,為了使系統保持乾淨,遂決定用 virtualenv 跑應用程式,建立一個容易識別的目錄,開始安裝,再建立項目目錄 super,然後啟用環境:
sudo pip install virtualenv mkdir ~/supervisor && cd ~/supervisor virtualenv super source super/bin/activate
安裝 Flask 架構
好了,現在在虛擬環境裡面,開始安裝 Flask 架構,flask 依賴兩個庫 werkzeug 和 jinjia2, 採用 pip 方式安裝即可, pip 是一個重要的工具,Python 用它來管理組件:
pip install flask
先用 Flask 寫一個簡單的 Web 服務 myweb.py ,因為後面要做一些測試,所以設定了幾個請求:
from flask import Flask app = Flask(__name__) @app.route(‘/‘)def index(): return ‘hello world supervisor gunicorn ‘@app.route(‘/1‘)def index1(): return ‘hello world supervisor gunicorn ffffff‘@app.route(‘/qw/1‘)def indexqw(): return ‘hello world supervisor gunicorn fdfdfbdfbfb ‘if __name__ == ‘__main__‘: app.debug = True app.run()
啟動 Flask 看看!
python myweb.py
在瀏覽器中訪問 http://127.0.0.1:5000 就可以看到了「幾個路徑都試一試」
用 Gunicorn 部署 Python Web
現在我們使用 Flask 內建的伺服器,完成了 Web 服務的啟動。生產環境下,Flask 內建的伺服器,無法滿足效能要求。所以我們這裡採用 Gunicorn 做 wsgi 容器,用來部署 Python,首先還是安裝 Gunicorn:
pip install gunicorn
當我們安裝好 Gunicorn 之後,需要用 Gunicorn 啟動 Flask,Flask 用內建的伺服器啟動時,Flask 裡面的 name 裡面的代碼啟動了 app.run()。而這裡我們使用 Gunicorn,myweb.py 就等同於一個庫檔案,被 Gunicorn 調用,這樣啟動:
gunicorn -w 4 -b 0.0.0.0:8000 myweb:app
其中 myweb 就是指 myweb.py,app 就是那個 wsgifunc 的名字,這樣運行監聽 8000 連接埠,原先的 5000 連接埠並沒有啟用,-w 表示開啟多少個 worker,-b 表示 Gunicorn 開發的訪問地址。
想要結束 Gunicorn 只需執行 pkill Gunicorn,但有時候還要 ps 找到 pid 進程號才能 kill。可是這對於一個開發來說,太過於繁瑣,因此出現了另外一個神器 ---supervisor,一個專門用來管理進程的工具,還可以管理系統的工具進程。
安裝 Supervisor
pip install supervisor echo_supervisord_conf > supervisor.conf # 產生 supervisor 預設設定檔 gedit supervisor.conf # 修改 supervisor 設定檔,添加 gunicorn 進程管理
在 supervisor.conf 底部下添加 myweb.py 的配置 /home/wang/supervisor/super
是我的項目目錄」
[program:myweb]command=/home/wang/supervisor/super/bin/gunicorn -w 4 -b 0.0.0.0:8000 myweb:app directory=/home/wang/supervisor startsecs=0 stopwaitsecs=0 autostart=false autorestart=false user=wang stdout_logfile=/home/wang/supervisor/log/gunicorn.log stderr_logfile=/home/wang/supervisor/log/gunicorn.err
supervisor 的基本使用命令:
supervisord -c supervisor.conf supervisorctl -c supervisor.conf status 查看supervisor的狀態 supervisorctl -c supervisor.conf reload 重新載入 設定檔 supervisorctl -c supervisor.conf start [all]|[appname] 啟動指定/所有 supervisor 管理的程式進程 supervisorctl -c supervisor.conf stop [all]|[appname] 關閉指定/所有 supervisor 管理的程式進程
supervisor 還有一個 web 的管理介面,可以啟用。更改下配置:
[inet_http_server] ; inet (TCP) server disabled by defaultport=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
現在可以使用 supervsior 啟動 gunicorn 啦。運行命令:
supervisord -c supervisor.conf
瀏覽器訪問 http://127.0.0.1:9001 可以得到 supervisor 的 web 管理介面,訪問http://127.0.0.1:8000 可以看見 gunicorn 啟動的返回的頁面。
配置 Nginx
前面我們已經在系統內容下安裝了 Nginx, 安裝好的 Nginx 二進位檔案放在 /usr/sbin/ 檔案夾下,接下來使用 Supervisor 來管理 Nginx。這裡需要注意一個問題,許可權問題。Nginx 是 sudo 的方式安裝,啟動的適合也是 root 使用者,那麼我們現在也需要用 root 使用者啟動 supervisor。在 supervisor.conf 下添加設定檔:
[program:nginx]command=/usr/sbin/nginx startsecs=0 stopwaitsecs=0 autostart=false autorestart=false stdout_logfile=/home/wang/supervisor/log/nginx.log stderr_logfile=/home/wang/supervisor/log/nginx.err
好了,都配置完之後,啟動 supervisor:
supervisord -c supervisor.conf
訪問頁面,也可以用 ab 進行壓力測試:
ab -c 100 -n 100 http://127.0.0.1:8000/qw/1
-c 用於指定壓力測試的並發數, -n 用於指定壓力測試總共的執行次數。
安裝 Python 探針
搭建好了 web,想即時監控應用資料,有什麼好的工具,用 OneAPM 的 Python 探針試試, 首先也是安裝 Python 探針:
pip install -i http://pypi.oneapm.com/simple --upgrade blueware
根據 License Key 組建組態檔案:
blueware-admin generate-config (License Key) = blueware.ini
由於是在虛擬環境下,所以要特別注意路徑,修改 supervisor.conf 裡面兩項:
[program:myapp]command = /home/wang/supervisor/super/bin/blueware-admin run-program /home/wang/supervisor/super/bin/gunicorn -w 4 -b 0.0.0.0:8000 myapp:app environment = BLUEWARE_CONFIG_FILE=blueware.ini
重啟應用
supervisorctl # 進入命令列 supervisor> reload # 重新載入
向上面一樣訪問頁面,也可以用 ab 進行壓力測試 幾分鐘後有,可以看到頁面載入時間,web 事物,頁面輸送量,其中後面是設定自訂事物「Business Transaction」。
參考文章:
How To Serve Flask Applications with uWSGI and Nginx on Ubuntu 14.04
OneAPM Python 探針安裝
python web 部署:nginx + gunicorn + supervisor + flask 部署筆記
Tornado+nginx+supervisor 在生產環境上部署
supervisor + Tornado + Nginx 使用詳解
本文系 OneAPM 工程師編譯整理。OneAPM 是應用效能管理領域的新興領軍企業,能協助企業使用者和開發人員輕鬆實現:緩慢的程式碼和 SQL 陳述式的即時抓取。想閱讀更多技術文章,請訪問 OneAPM 官方部落格。
virtualenv 環境下 Django + Nginx + Gunicorn+ Supervisor 搭建 Python Web