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

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

創(chuàng)建項目

mkdir server

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

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

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

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

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

source venv/bin/activate

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

deactivate

安裝 flask 框架

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

pip install flask

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

from flask import Flask
app = Flask(__name__)

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

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

啟動腳本

python myapp.py

此時,使用瀏覽器訪問 http://127.0.0.1:5000 就能看見網(wǎng)頁顯示的 hello world !

使用 gunicorn 部署 python web

剛才打開的是 flask 自帶的服務(wù)器,完成了 web 服務(wù)的啟動。但是 flask 自帶的服務(wù)器一般是用來調(diào)試使用的,性能不佳。這里我們使用 gunicorn 作為 wsgi 的容器,用來部署 python。

安裝 gunicorn
pip install gunicorn

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

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

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

以后每次 pip 安裝了新的庫的時候,都需 freeze 一次,保證更新

接下來我們就是用 gunicorn 來啟動 flask

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

此時我們使用8000端口進(jìn)行訪問,-w 表示開啟了多少個 worker, -b 表示訪問地址。myapp 就是 myapp.py 的文件名,mypp.py 相當(dāng)于一個庫文件被 gunicorn 調(diào)用。app 則是 myapp.py 里創(chuàng)建的 app,這樣 gunicorn 才可以定位 flask 應(yīng)用。
想結(jié)束 gunicorn 可以通過執(zhí)行 pkill gunicorn,有時還要找到 pid 才能 kill 掉。這樣的操作過于繁瑣,所以我們使用另一個神器 supervisor, 用來專門管理系統(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啟動命令
directory=/var/www/server                                                ; 項目的文件夾路徑
startsecs=0                                                                             ; 啟動時間
stopwaitsecs=0                                                                          ; 終止等待時間
autostart=false                                                                         ; 是否自動啟動
autorestart=false                                                                       ; 是否自動重啟
stdout_logfile=/var/www/server/log/gunicorn.log                           ; log 日志
stderr_logfile=var/www/server/log/gunicorn.err  

其中的 log 目錄是用來記錄日志的,我們需要先創(chuàng)建一個 log 目錄,否則會碰見未找到目錄的錯誤

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

部署 Nginx

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

安裝 nginx

sudo apt-get install nginx

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

sudo /etc/init.d/nginx restart // 重啟
sudo /etc/init.d/nginx start 開啟
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 {
  #偵聽80端口
    listen 80;
#定義使用www.xx.com訪問
    server_name www.app.com; // 或則是地址(http://118.89.235.150/)
    client_max_body_size 10M;
 
   #設(shè)定本虛擬主機(jī)的訪問日志
    access_log logs/app.log main;
 
  #默認(rèn)請求
    location / {
        #請求轉(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)頁面轉(zhuǎn)發(fā)
    location ~.*(html)$ {
        root /home/zhoujianghai/temp/data/app/app_static_pages/;
    }
}

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

參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,606評論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,582評論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,540評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,028評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,801評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,223評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,294評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,442評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,976評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,800評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,996評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,543評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,233評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,926評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,702評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,991評論 2 374

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