時間 2016-07-23
1.簡介
docker:非常流行的容器技術(shù),本文是用其搭建ubuntu虛擬環(huán)境
nginx:高性能反向代理服務(wù)器
flask:微型web框架敢艰,可快速編寫web應(yīng)用
gunicorn: 異步處理框架
2.安裝docker
在https://www.docker.com/products/docker上有各平臺的docker安裝方法诬乞,本文不再贅述。
3.啟動ubuntu容器
啟動docker后執(zhí)行命令:
docker run -ti -p 80:80 -p 5000:5000 --name flask_nginx ubuntu:16.04 bash
其中80端口分配給nginx钠导,5000端口分配給flask應(yīng)用震嫉。
4.安裝nginx,python相關(guān)包
進入容器后執(zhí)行命令
apt-get update -y
apt-get install python3-pip python3-dev nginx vim -y
pip3 install gunicorn flask gevent
5.編寫flask測試應(yīng)用
創(chuàng)建目錄/var/www/demo牡属,創(chuàng)建文件myproject.py
mkdir /var/www/demo
cd /var/www/demo
vim myproject.py
創(chuàng)建flask應(yīng)用
# -*- coding:utf-8 -*-
from flask import Flask
import time
app = Flask(__name__)
@app.route('/')
def index():
time.sleep(0.01) # 模擬程序阻塞
return 'hello world!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
啟動應(yīng)用
python3 myproject.py
打開http://127.0.0.1:5000票堵,如果能看到 hello world!
,證明實例應(yīng)用已啟動逮栅。
6.使用gunicorn啟動flask應(yīng)用悴势,并將通訊綁定到myproject.sock上
按 Ctrl + c
停止flask應(yīng)用窗宇,創(chuàng)建文件wsgi.py
vim wsgi.py
# -*- coding:utf-8 -*-
from myproject import app
if __name__ == "__main__":
app.run()
執(zhí)行命令
gunicorn --workers 3 --bind unix:myproject.sock --daemon -m 007 --user www-data --worker-class gevent wsgi:app
--worker-class
進行工作模式,默認是sync特纤,會造成程序阻塞军俊,這里使用gevent。
--workers
指定啟動多少個進程捧存,根據(jù)機器cpu核數(shù)來定蝇完。
--bind
指定通訊綁定到哪個.sock文件上。
--daemon
指定后臺啟動矗蕊。
--user
指定用哪個用戶啟動這個進程短蜕,由于ubuntu采用apt-get安裝的nginx默認啟動用戶是www-data,所以這里使用www-data傻咖,以免nginx沒有權(quán)限訪問.sock文件朋魔。
可使用top
指令查看gunicorn程序啟動情況:
如圖所示,gunicorn啟動了3個工作進程和1個主進程卿操。從圖中也可以看出docker容器只啟動了必要的進程警检,對資源的占用非常小。
7.配置nginx配置文件害淤,啟動nginx
移除默認nginx配置文件扇雕,創(chuàng)建nginx配置文件myproject
rm -y /etc/nginx/sites-enabled/default
vim /etc/nginx/sites-available/myproject
server {
listen 80;
server_name server_domain_or_IP;
location / {
include proxy_params;
proxy_pass http://unix:/var/www/demo/myproject.sock;
}
}
鏈接到配置文件路徑
ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
啟動nginx
nginx
打開http://127.0.0.1,如果能看到 hello world!
窥摄,證明配置正確镶奉。
8.Dockerfile及docker image
如果上述文章沒有描述清楚,請在https://github.com/zhanghongnian/docker_nginx_gunicorn_flask下載Dockerfile崭放,自行build哨苛,
或者執(zhí)行中dockr pull zhnliving/nginx_flask
下載docker鏡像,并運行
后臺運行容器請執(zhí)行docker run -d -p 80:80 zhnliving/nginx_flask
進入容器內(nèi)部請執(zhí)行docker run -ti -p 80:80 zhnliving/nginx_flask bash
歡迎加qq:453039449币砂,一起學(xué)習(xí)建峭。
9.參考
9.1.如何在ubuntu16.04上使用nginx和gunicorn部署flask應(yīng)用
9.2.用gunicorn和gevent提高python-web框架的性能
9.3.使用gevent為IO繁忙型wsgi服務(wù)打個性能補丁