- 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)用了碌冶。