轉(zhuǎn)載---python web 部署:nginx + gunicorn + supervisor + flask 部署筆記

轉(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末梯啤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子七婴,更是在濱河造成了極大的恐慌察滑,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件户盯,死亡現(xiàn)場離奇詭異饲化,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)滓侍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撩笆,“玉大人,你說我怎么就攤上這事夕冲。” “怎么了泣栈?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長掺涛。 經(jīng)常有香客問我疼进,道長,這世上最難降的妖魔是什么伞广? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮嚼锄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘区丑。我一直安慰自己,他們只是感情好既们,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布正什。 她就那樣靜靜地躺著号杏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盾致。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天罩驻,我揣著相機(jī)與錄音护赊,去河邊找鬼。 笑死节吮,一個(gè)胖子當(dāng)著我的面吹牛判耕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼碳竟,長吁一口氣:“原來是場噩夢啊……” “哼狸臣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起固棚,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤此洲,失蹤者是張志新(化名)和其女友劉穎厂汗,沒想到半個(gè)月后呜师,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衷畦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年祈争,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片菩混。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡扁藕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出亿柑,到底是詐尸還是另有隱情,我是刑警寧澤疟游,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布式矫,位于F島的核電站,受9級(jí)特大地震影響聪廉,放射性物質(zhì)發(fā)生泄漏瞬痘。R本人自食惡果不足惜板熊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望津辩。 院中可真熱鬧容劳,春花似錦、人聲如沸竭贩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽楼熄。三九已至,卻和暖如春可岂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缕粹。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工致开, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人双戳。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓糜芳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親峭竣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容