摘要:生產(chǎn)環(huán)境下,自帶的服務(wù)器,無法滿足性能要求。配置前面我們已經(jīng)在系統(tǒng)環(huán)境下安裝了安裝好的二進制文件放在文件夾下,接下來使用來管理。參考文章探針安裝部署部署筆記在生產(chǎn)環(huán)境上部署使用詳解本文系工程師編譯整理。
由于字?jǐn)?shù)的限制,其實本篇文章的全標(biāo)題為 《如何在 virtualenv 環(huán)境下 Django + Nginx + Gunicorn+ Supervisor 搭建 Python Web》
在這篇文章里,我們將搭建一個簡單的 Web 應(yīng)用,在虛擬環(huán)境中基于 Flask 框架,用 Gunicorn 做 wsgi 容器,用 Supervisor 管理進程,然后使用 OneAPM Python 探針來監(jiān)測應(yīng)用性能,形成一個「閉環(huán)」 !希望能對大家有所幫助,首先簡單來介紹一下環(huán)境:
系統(tǒng)環(huán)境:ubuntu 14.04 Python 2.7.6
安裝組件庫第一步安裝所需要的存儲庫,因為打算用到虛擬環(huán)境,用到 pip 安裝和管理 Python 組件,所以先更新本地包,然后安裝組件:
sudo apt-get update sudo apt-get install python-pip python-dev nginx創(chuàng)建虛擬環(huán)境 virtualenv
在一個系統(tǒng)中創(chuàng)建不同的 Python 隔離環(huán)境,相互之間還不會影響,為了使系統(tǒng)保持干凈,遂決定用 virtualenv 跑應(yīng)用程序,創(chuàng)建一個容易識別的目錄,開始安裝,再創(chuàng)建項目目錄 super,然后激活環(huán)境:
sudo pip install virtualenv mkdir ~/supervisor && cd ~/supervisor virtualenv super source super/bin/activate安裝 Flask 框架
好了,現(xiàn)在在虛擬環(huán)境里面,開始安裝 Flask 框架,flask 依賴兩個庫 werkzeug 和 jinjia2, 采用 pip 方式安裝即可, pip 是一個重要的工具,Python 用它來管理包:
pip install flask
先用 Flask 寫一個簡單的 Web 服務(wù) myweb.py ,因為后面要做一些測試,所以設(shè)置了幾個請求:
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現(xiàn)在我們使用 Flask 自帶的服務(wù)器,完成了 Web 服務(wù)的啟動。生產(chǎn)環(huán)境下,F(xiàn)lask 自帶的服務(wù)器,無法滿足性能要求。所以我們這里采用 Gunicorn 做 wsgi 容器,用來部署 Python,首先還是安裝 Gunicorn:
pip install gunicorn
當(dāng)我們安裝好 Gunicorn 之后,需要用 Gunicorn 啟動 Flask,F(xiàn)lask 用自帶的服務(wù)器啟動時,F(xiàn)lask 里面的 name 里面的代碼啟動了 app.run()。而這里我們使用 Gunicorn,myweb.py 就等同于一個庫文件,被 Gunicorn 調(diào)用,這樣啟動:
gunicorn -w 4 -b 0.0.0.0:8000 myweb:app
其中 myweb 就是指 myweb.py,app 就是那個 wsgifunc 的名字,這樣運行監(jiān)聽 8000 端口,原先的 5000 端口并沒有啟用,-w 表示開啟多少個 worker,-b 表示 Gunicorn 開發(fā)的訪問地址。
想要結(jié)束 Gunicorn 只需執(zhí)行 pkill Gunicorn,但有時候還要 ps 找到 pid 進程號才能 kill。可是這對于一個開發(fā)來說,太過于繁瑣,因此出現(xiàn)了另外一個神器 ---supervisor,一個專門用來管理進程的工具,還可以管理系統(tǒng)的工具進程。
安裝 Supervisorpip install supervisor echo_supervisord_conf > supervisor.conf # 生成 supervisor 默認(rèn)配置文件 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的狀態(tài) supervisorctl -c supervisor.conf reload 重新載入 配置文件 supervisorctl -c supervisor.conf start [all]|[appname] 啟動指定/所有 supervisor 管理的程序進程 supervisorctl -c supervisor.conf stop [all]|[appname] 關(guān)閉指定/所有 supervisor 管理的程序進程
supervisor 還有一個 web 的管理界面,可以激活。更改下配置:
[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
現(xiàn)在可以使用 supervsior 啟動 gunicorn 啦。運行命令:
supervisord -c supervisor.conf
瀏覽器訪問 http://127.0.0.1:9001 可以得到 supervisor 的 web 管理界面,訪問 http://127.0.0.1:8000 可以看見 gunicorn 啟動的返回的頁面。
配置 Nginx前面我們已經(jīng)在系統(tǒng)環(huán)境下安裝了 Nginx, 安裝好的 Nginx 二進制文件放在 /usr/sbin/ 文件夾下,接下來使用 Supervisor 來管理 Nginx。這里需要注意一個問題,權(quán)限問題。Nginx 是 sudo 的方式安裝,啟動的適合也是 root 用戶,那么我們現(xiàn)在也需要用 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 用于指定壓力測試的并發(fā)數(shù), -n 用于指定壓力測試總共的執(zhí)行次數(shù)。
安裝 Python 探針搭建好了 web,想實時監(jiān)控應(yīng)用數(shù)據(jù),有什么好的工具,用 OneAPM 的 Python 探針試試,
首先也是安裝 Python 探針:
pip install -i http://pypi.oneapm.com/simple --upgrade blueware
根據(jù) License Key 生成配置文件:
blueware-admin generate-config (License Key)?=?blueware.ini
由于是在虛擬環(huán)境下,所以要特別注意路徑,修改 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
重啟應(yīng)用
supervisorctl # 進入命令行 supervisor> reload # 重新加載
向上面一樣訪問頁面,也可以用 ab 進行壓力測試
幾分鐘后有下圖,可以看到頁面加載時間,web 事物,頁面吞吐量,其中后面是設(shè)置自定義事物「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 在生產(chǎn)環(huán)境上部署
supervisor + Tornado + Nginx 使用詳解
本文系 OneAPM 工程師編譯整理。想閱讀更多技術(shù)文章,請訪問 OneAPM 官方博客。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/37572.html
摘要:生產(chǎn)環(huán)境下,自帶的服務(wù)器,無法滿足性能要求。配置前面我們已經(jīng)在系統(tǒng)環(huán)境下安裝了安裝好的二進制文件放在文件夾下,接下來使用來管理。參考文章探針安裝部署部署筆記在生產(chǎn)環(huán)境上部署使用詳解本文系工程師編譯整理。 由于字?jǐn)?shù)的限制,其實本篇文章的全標(biāo)題為 《如何在 virtualenv 環(huán)境下 Django + Nginx + Gunicorn+ Supervisor 搭建 Python Web》...
摘要:模板函數(shù)到底長什么樣下面我們就可以來看看模板函數(shù)到底長什么樣了。當(dāng)然,首先得創(chuàng)建一個模板文件。總結(jié)通過打印中間結(jié)果和分析代碼,我們已經(jīng)大概知道了的模板是如何轉(zhuǎn)化成內(nèi)容的。下一篇文章會闡述模板的各種語法所對應(yīng)的動態(tài)函數(shù)內(nèi)容。 web.py模板的實現(xiàn)原理 web.py的模板實現(xiàn)利用了Python的可執(zhí)行對象的動態(tài)特性:根據(jù)模板內(nèi)容和渲染函數(shù)的參數(shù)創(chuàng)建一個函數(shù),該函數(shù)執(zhí)行的時候會返回一個Te...
摘要:從今天起,我將在這里更新一個系列的簡單爬蟲到建立網(wǎng)站的實踐手記。內(nèi)容將會從最簡單的開始,環(huán)境搭建,基本爬蟲,入庫,用建立可供用戶訪問的網(wǎng)站,網(wǎng)站部署。第一部分,買,裝環(huán)境。我們爬蟲站點的所有文件都放在里面。 從今天起,我將在這里更新一個系列的python簡單爬蟲到建立網(wǎng)站的實踐手記。 內(nèi)容將會從最簡單的開始,環(huán)境搭建,基本爬蟲,入庫,用Django建立可供用戶訪問的網(wǎng)站,網(wǎng)站部署。 ...
摘要:原來叫做,后來改名為,意思是,囊括了三大數(shù)據(jù)科學(xué)語言。文學(xué)化編程支持編程模式,代碼和正文有機交融在一起,在代碼可運行結(jié)果可見的情況下又很好地保留了研究邏輯,非常便于交流。在安裝過程中,我們使用來對做環(huán)境隔離。 Jupyter原來叫做IPython,后來改名為Jupyter,意思是Julia+Python+R,囊括了三大數(shù)據(jù)科學(xué)語言。Jupyter編程環(huán)境具有以下兩個特點: 中心化工作...
閱讀 3265·2021-09-02 15:41
閱讀 2827·2021-09-02 09:48
閱讀 1368·2019-08-29 13:27
閱讀 1157·2019-08-26 13:37
閱讀 831·2019-08-26 11:56
閱讀 2477·2019-08-26 10:24
閱讀 1636·2019-08-23 18:07
閱讀 2614·2019-08-23 15:16