轉(zhuǎn)載:python web 部署:nginx + gunicorn + supervisor + flask 部署筆記
http://www.reibang.com/p/be9dd421fb8d
web開發(fā)中馋艺,各種語言爭奇斗艷,web的部署方面碱鳞,卻沒有太多的方式踱蛀。簡單而已,大概都是 nginx 做前端代理星岗,中間 webservice 調(diào)用程序腳本。大概方式:nginx + webservice + script
nginx 不用多說允华,一個(gè)高性能的web服務(wù)器寥掐。通常用來在前端做反向代理服務(wù)器。所謂正向與反向(reverse)召耘,只是英文說法翻譯。代理服務(wù)剖踊,簡而言之,一個(gè)請(qǐng)求經(jīng)過代理服務(wù)器從局域網(wǎng)發(fā)出德澈,然后到達(dá)互聯(lián)網(wǎng)上服務(wù)器,這個(gè)過程的代理為正向代理梆造。如果一個(gè)請(qǐng)求,從互聯(lián)網(wǎng)過來屡穗,先進(jìn)入代理服務(wù)器忽肛,再由代理服務(wù)器轉(zhuǎn)發(fā)給局域網(wǎng)的目標(biāo)服務(wù)器,這個(gè)時(shí)候麻裁,代理服務(wù)器為反向代理(相對(duì)正向而言)。
正向代理:{ 客戶端 ---》 代理服務(wù)器 } ---》 服務(wù)器
反向代理:客戶端 ---》 { 代理服務(wù)器 ---》 服務(wù)器 }
{} 表示局域網(wǎng)
nginx既可以做正向色迂,也可以做反向手销。
webservice 的方式同樣也有很多方式。常見的有FastCGI锋拖,WSGI等。我們采用gunicorn為 wsgi容器侥钳。python為服務(wù)器script柄错,采用flask框架。同時(shí)采用supervisor管理服務(wù)器進(jìn)程售貌。也就是最終的部署方式為:
nginx + gunicorn + flask ++ supervisor
創(chuàng)建一個(gè)項(xiàng)目
mkdirmyproject
創(chuàng)建 python 虛擬環(huán)境
virtualenv 可以說是 python 的一個(gè)大殺器。用來在一個(gè)系統(tǒng)中創(chuàng)建不同的 python 隔離環(huán)境敢伸。相互之間還不會(huì)影響恒削,使用簡單到令人發(fā)指尾序。(我的工作路徑是/home/rsj217/rsj217)
mkdirmyprojectcdmyprojectvirtualenv venv
創(chuàng)建了 venv 環(huán)境之后饶辙,激活就可以了
sourcevenv/bin/activate
安裝 python web 框架 ---flask
flask 是一個(gè) python web micro framework。簡潔高效弃揽,使用也很簡單则北。flask 依賴兩個(gè)庫werkzeug和jinjia2。采用 pip 方式安裝即可涌矢。
pipinstallflask
測試我們的 flask 安裝是否成功快骗,并使用 flask 寫一個(gè)簡單的 web 服務(wù)。
vim myapp.py
fromflaskimportFlaskapp = Flask(__name__)@app.route('/')defindex():return'hello world'if__name__ =='__main__':? ? app.debug =Trueapp.run()
啟動(dòng) flask
pythonmyapp.py
此時(shí)方篮,用瀏覽器訪問http://127.0.0.1:5000就能看到網(wǎng)頁顯示hello world。
使用 gunicorn 部署 python web
現(xiàn)在我們使用 flask 自帶的服務(wù)器匕得,完成了 web 服務(wù)的啟動(dòng)巾表。生產(chǎn)環(huán)境下,flask 自帶的 服務(wù)器集币,無法滿足性能要求。我們這里采用 gunicorn 做 wsgi容器乞榨,用來部署 python偶妖。
安裝 gunicorn
pipinstallgunicorn
pip 是一個(gè)重要的工具,python 用來管理包趾访。還有一個(gè)最佳生產(chǎn)就是每次使用 pip 安裝的庫,都寫入一個(gè) requirement 文件里面申鱼,既能知道自己安裝了什么庫,也方便別人部署時(shí)捐友,安裝相應(yīng)的庫。
pipfreeze>requirements.txt
以后每次 pip 安裝了新的庫的時(shí)候科吭,都需freeze 一次猴鲫。
當(dāng)我們安裝好 gunicorn 之后,需要用 gunicorn 啟動(dòng) flask拂共,注意 flask 里面的name里面的代碼啟動(dòng)了 app.run(),這個(gè)含義是用 flask 自帶的服務(wù)器啟動(dòng) app。這里我們使用了 gunicorn势告,myapp.py 就等同于一個(gè)庫文件抚恒,被 gunicorn 調(diào)用。
gunicron-w4-b0.0.0.0:8000myapp:app
此時(shí)柑爸,我們需要用 8000 的端口進(jìn)行訪問,原先的5000并沒有啟用馅而。其中 gunicorn 的部署中譬圣,,-w 表示開啟多少個(gè) worker厘熟,-b 表示 gunicorn 開發(fā)的訪問地址。
想要結(jié)束 gunicorn 只需執(zhí)行 pkill gunicorn登澜,有時(shí)候還的 ps 找到 pid 進(jìn)程號(hào)才能 kill飘庄。可是這對(duì)于一個(gè)開發(fā)來說,太過于繁瑣迂求,因此出現(xiàn)了另外一個(gè)神器---supervisor晃跺,一個(gè)專門用來管理進(jìn)程的工具,還可以管理系統(tǒng)的工具進(jìn)程掀虎。
安裝 supervisor
pipinstallsupervisorecho_supervisord_conf > supervisor.conf# 生成 supervisor 默認(rèn)配置文件vim supervisor.conf# 修改 supervisor 配置文件,添加 gunicorn 進(jìn)程管理
在myapp supervisor.conf 配置文件底部添加 (注意我的工作路徑是/home/rsj217/rsj217/)
[program:myapp]command=/home/rsj217/rsj217/myproject/venv/bin/gunicorn -w4 -b0.0.0.0:2170myapp:app? ? ; supervisor啟動(dòng)命令directory=/home/rsj217/rsj217/myproject? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ; 項(xiàng)目的文件夾路徑startsecs=0; 啟動(dòng)時(shí)間stopwaitsecs=0; 終止等待時(shí)間autostart=false; 是否自動(dòng)啟動(dòng)autorestart=false; 是否自動(dòng)重啟stdout_logfile=/home/rsj217/rsj217/myproject/log/gunicorn.log? ? ? ? ? ? ? ? ? ? ? ? ? ; log 日志stderr_logfile=/home/rsj217/rsj217/myproject/log/gunicorn.err? ? ? ? ? ? ? ? ? ? ? ? ? ; 錯(cuò)誤日志
supervisor的基本使用命令
supervisord -csupervisor.conf通過配置文件啟動(dòng)supervisorsupervisorctl -csupervisor.confstatus? ? ? ? ? ? ? ? ? ? 察看supervisor的狀態(tài)supervisorctl -csupervisor.confreload? ? ? ? ? ? ? ? ? ? 重新載入 配置文件supervisorctl -csupervisor.confstart [all]|[appname]? ? 啟動(dòng)指定/所有 supervisor管理的程序進(jìn)程supervisorctl -csupervisor.confstop[all]|[appname]? ? ? 關(guān)閉指定/所有 supervisor管理的程序進(jìn)程
supervisor 還有一個(gè)web的管理界面十气,可以激活春霍。更改下配置
[inet_http_server]? ? ? ? ; inet (TCP) server disabledbydefaultport=127.0.0.1:9001; (ip_address:port specifier, *:portforall iface)username=user? ? ? ? ? ? ? ; (defaultisnousername(open server))password=123; (defaultisnopassword(open server))[supervisorctl]serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL? for a unix socketserverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socketusername=user? ? ? ? ? ? ? ; should be sameashttp_usernameifsetpassword=123; should be sameashttp_passwordifset;prompt=mysupervisor? ? ? ? ;cmd lineprompt(default"supervisor");history_file=~/.sc_history? ; use readline historyifavailable
現(xiàn)在可以使用 supervsior 啟動(dòng) gunicorn啦址儒。運(yùn)行命令supervisord -c supervisor.conf
訪問http://127.0.0.1:9001可以得到 supervisor的web管理界面衅疙,訪問http://127.0.0.1:2170可以看見gunciron 啟動(dòng)的返回的 hello world
安裝配置 nginx
采用 apt-get方式安裝最簡單。運(yùn)行sudo apt-get install nginx饱溢。安裝好的nginx的二進(jìn)制文件放在/usr/sbin/文件夾下面。而nginx的配置文件放在/etc/nginx下面潘鲫。
使用 supervisor 來管理 nginx肋杖。這里需要注意一個(gè)問題,linux的權(quán)限問題状植。nginx是sudo的方式安裝,啟動(dòng)的適合也是 root用戶津畸,那么我們現(xiàn)在也需要用 root用戶啟動(dòng)supervisor。增加下面的配置文件
[program:nginx]command=/usr/sbin/nginxstartsecs=0stopwaitsecs=0autostart=falseautorestart=falsestdout_logfile=/home/rsj217/rsj217/myproject/log/nginx.logstderr_logfile=/home/rsj217/rsj217/myproject/log/nginx.err
到此為止肉拓,進(jìn)步的 web 部屬已經(jīng)完成。當(dāng)然徘郭,最終我們需要把項(xiàng)目代碼部屬到服務(wù)器上.批量的自動(dòng)化部屬需要另外一個(gè)神器 fabric.具體使用,就不再這篇筆記闡述残揉。項(xiàng)目源碼中包含了fabric文件。下載fabric壳快,更改里面的用戶名和秘密镇草,就可以部屬在自己或者遠(yuǎn)程的服務(wù)器上了。
項(xiàng)目源碼:https://coding.net/u/rsj217/p/myproject/git