Python Web 部署: 使用 flask + gunicorn + supervisor + nginx

  • flask?? python 的服務(wù)器框架
  • gunicorn?? webservice,WSGI 的容器
  • supervisor?? 進(jìn)程管理工具
  • nginx?? 一個(gè)高性能的 web 服務(wù)器

創(chuàng)建項(xiàng)目

mkdir server

先為應(yīng)用創(chuàng)建一個(gè)路徑

構(gòu)建 Python 的虛擬環(huán)境

我們使用 virtualenv 來(lái)構(gòu)建一個(gè)系統(tǒng)中不同的 python 隔離環(huán)境, virtualenv 的使用十分的簡(jiǎn)單,安裝使用方法可以看這里virtualenv

cd server // cd 切換到我們的項(xiàng)目目錄
virtualenv venv // 構(gòu)建我們的虛擬環(huán)境

創(chuàng)建了 venv 環(huán)境后,我們需要激活才能使用(有時(shí)是自動(dòng)激活)奢米,激活后可以看見(jiàn)控制臺(tái)前面有 (venv)

source venv/bin/activate

關(guān)閉環(huán)境直接使用 deactivate

deactivate

安裝 flask 框架

安裝的虛擬環(huán)境里面已經(jīng)自動(dòng)安裝了 pip,我們使用 pip 可以很簡(jiǎn)單快捷的安裝 flask

pip install flask

flask 已經(jīng)安裝好了彼宠,我們可以通過(guò)一個(gè)小應(yīng)用來(lái)測(cè)試一下我們的flask 框架, 'vim myapp.py' 創(chuàng)建一個(gè) python 文件

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return 'hello world !'

if __name__ = '__main__':
    app.debug = True
    app.run()

啟動(dòng)腳本

python myapp.py

此時(shí)涉瘾,使用瀏覽器訪問(wèn) http://127.0.0.1:5000 就能看見(jiàn)網(wǎng)頁(yè)顯示的 hello world !

使用 gunicorn 部署 python web

剛才打開(kāi)的是 flask 自帶的服務(wù)器,完成了 web 服務(wù)的啟動(dòng)。但是 flask 自帶的服務(wù)器一般是用來(lái)調(diào)試使用的鸦做,性能不佳。這里我們使用 gunicorn 作為 wsgi 的容器谓着,用來(lái)部署 python泼诱。

安裝 gunicorn
pip install gunicorn

pip 是 python 的管理包工具。隨著項(xiàng)目增長(zhǎng)赊锚,你會(huì)發(fā)現(xiàn)它的依賴列表也一并隨著增長(zhǎng)治筒。在你能運(yùn)行一個(gè)Flask應(yīng)用之前,即使已經(jīng)需要數(shù)以十記的依賴包也毫不奇怪舷蒲。 管理依賴的最簡(jiǎn)單的方法就是使用一個(gè)簡(jiǎn)單的文本文件耸袜。 pip可以生成一個(gè)文本文件,列出所有已經(jīng)安裝的包牲平。它也可以解析這個(gè)文件堤框,并在新的系統(tǒng)(或者新的環(huán)境)下安裝每一個(gè)包。

pip freeze > requirements.txt # 生成txt 文件

pip install -r requirements.txt # 別人使用時(shí)可以直接安裝所有的包

以后每次 pip 安裝了新的庫(kù)的時(shí)候,都需 freeze 一次蜈抓,保證更新

接下來(lái)我們就是用 gunicorn 來(lái)啟動(dòng) flask

gunicorn -w 4 -b 0.0.0.0:8000 myapp:app

此時(shí)我們使用8000端口進(jìn)行訪問(wèn)启绰,-w 表示開(kāi)啟了多少個(gè) worker, -b 表示訪問(wèn)地址。myapp 就是 myapp.py 的文件名沟使,mypp.py 相當(dāng)于一個(gè)庫(kù)文件被 gunicorn 調(diào)用酬土。app 則是 myapp.py 里創(chuàng)建的 app,這樣 gunicorn 才可以定位 flask 應(yīng)用格带。
想結(jié)束 gunicorn 可以通過(guò)執(zhí)行 pkill gunicorn撤缴,有時(shí)還要找到 pid 才能 kill 掉。這樣的操作過(guò)于繁瑣叽唱,所以我們使用另一個(gè)神器 supervisor, 用來(lái)專門(mén)管理系統(tǒng)的進(jìn)程屈呕。

安裝 supervisor

pip install supervisor
echo_supervisord_conf > supervisor.conf # 生成 supervisor 默認(rèn)配置文件
vim supervisor.conf # 修改 supervisor 配置文件,添加 gunicorn 進(jìn)程管理

supervisor.conf 配置文件底部添加 (注意我的工作路徑是/var/www/server)

[program:myapp]
command=/var/www/server/venv/bin/gunicorn -w4 -b0.0.0.0:2170 myapp:app    ; supervisor啟動(dòng)命令
directory=/var/www/server                                                ; 項(xiàng)目的文件夾路徑
startsecs=0                                                                             ; 啟動(dòng)時(shí)間
stopwaitsecs=0                                                                          ; 終止等待時(shí)間
autostart=false                                                                         ; 是否自動(dòng)啟動(dòng)
autorestart=false                                                                       ; 是否自動(dòng)重啟
stdout_logfile=/var/www/server/log/gunicorn.log                           ; log 日志
stderr_logfile=var/www/server/log/gunicorn.err  

其中的 log 目錄是用來(lái)記錄日志的棺亭,我們需要先創(chuàng)建一個(gè) log 目錄虎眨,否則會(huì)碰見(jiàn)未找到目錄的錯(cuò)誤

mkdir log
supervisor 的基本使用命令
supervisord -c supervisor.conf                             通過(guò)配置文件啟動(dòng)supervisor
supervisorctl -c supervisor.conf status                    察看supervisor的狀態(tài)
supervisorctl -c supervisor.conf reload                    重新載入 配置文件
supervisorctl -c supervisor.conf start [all]|[appname]     啟動(dòng)指定/所有 supervisor管理的程序進(jìn)程
supervisorctl -c supervisor.conf stop [all]|[appname]      關(guān)閉指定/所有 supervisor管理的程序進(jìn)程

部署 Nginx

nginx 是一個(gè)高性能的 HTTP 和 反向代理服務(wù)器,在高并發(fā)方面表現(xiàn)非常不錯(cuò)镶摘。

安裝 nginx

sudo apt-get install nginx

nginx 安裝完后嗽桩,我們可以通過(guò)以下命令控制 nginx 的開(kāi)啟和關(guān)閉

sudo /etc/init.d/nginx restart // 重啟
sudo /etc/init.d/nginx start 開(kāi)啟
sudo /etc/init.d/nginx stop 關(guān)閉

配置 nginx

cd /etc/nginx/sites-available/default
cd /etc/nginx/sites-enabled/default

這是 nginx 的具體應(yīng)用的配置文件,便于管理凄敢。修改默認(rèn)的 default 文件

server {
  #偵聽(tīng)80端口
    listen 80;
#定義使用www.xx.com訪問(wèn)
    server_name www.app.com; // 或則是地址(http://118.89.235.150/)
    client_max_body_size 10M;
 
   #設(shè)定本虛擬主機(jī)的訪問(wèn)日志
    access_log logs/app.log main;
 
  #默認(rèn)請(qǐng)求
    location / {
        #請(qǐng)求轉(zhuǎn)向本機(jī)ip:8888
        proxy_pass http://0.0.0.0:8000;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    #配置靜態(tài)文件轉(zhuǎn)發(fā)
    location ~.*(js|css|png|gif|jpg|mp3|ogg)$ {
        root /home/zhoujianghai/temp/data/app/medias/;
    }
    #配置靜態(tài)頁(yè)面轉(zhuǎn)發(fā)
    location ~.*(html)$ {
        root /home/zhoujianghai/temp/data/app/app_static_pages/;
    }
}

重啟你的 nginx 就可以在瀏覽器上通過(guò)http://118.89.235.150/訪問(wèn)你的應(yīng)用了碌冶。

參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市涝缝,隨后出現(xiàn)的幾起案子扑庞,更是在濱河造成了極大的恐慌,老刑警劉巖拒逮,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件罐氨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡滩援,警方通過(guò)查閱死者的電腦和手機(jī)栅隐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)玩徊,“玉大人租悄,你說(shuō)我怎么就攤上這事∮独担” “怎么了恰矩?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)憎蛤。 經(jīng)常有香客問(wèn)我外傅,道長(zhǎng)纪吮,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任萎胰,我火速辦了婚禮碾盟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘技竟。我一直安慰自己冰肴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布榔组。 她就那樣靜靜地躺著熙尉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搓扯。 梳的紋絲不亂的頭發(fā)上检痰,一...
    開(kāi)封第一講書(shū)人閱讀 49,741評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音锨推,去河邊找鬼铅歼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛换可,可吹牛的內(nèi)容都是我干的椎椰。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼沾鳄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼慨飘!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起洞渔,我...
    開(kāi)封第一講書(shū)人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤套媚,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后磁椒,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡玫芦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年浆熔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桥帆。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡医增,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出老虫,到底是詐尸還是另有隱情叶骨,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布祈匙,位于F島的核電站忽刽,受9級(jí)特大地震影響天揖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜跪帝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一今膊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧伞剑,春花似錦斑唬、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至抒倚,卻和暖如春褐着,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背衡便。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工献起, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人镣陕。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓谴餐,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親呆抑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子岂嗓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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