本文將介紹Flask的部署方案:Flask + Nginx + uWSGI,並使用docker進行容器化部署,部署的實例來源 Flask開發初探,操作系統為ubuntu。
Flask系列文章:
部署方案
在開發時,我們使用flask run命令啟動的開發服務器是werkzeug提供的,但是這種方式目的是為了開發,不能很好的擴展,不適合生產部署。生產部署,我們需要一個更強健,性能更高的WSGI服務器(關於WSGI,可參考WSGI到底是什么 ,常用的服務器有:uWSGI、Gunicorn等,本文以uWSGI舉例。
像uWSGI這類WSGI服務器內置了Web服務器,所以我們不需要web服務器也可以與客戶端交換數據,處理請求和響應,但是內置的web服務器不夠強健,一般情況下都會使用一個常規的web服務器運行在前端,為WSGI服務器提供反向代理,web服務器選擇Nginx,Nginx會把外部的請求轉發給uWSGI處理,接收到響應后再返回給客戶端,這樣做的好處有:
- 提高靜態文件的效率,因為Nginx處理靜態文件的速度非常快
- 提升系統安全性,避免直接暴露WSGI服務器
- 提升程序處理能力,通過設置反向代理,配置負載均衡可以實現。
uWSGI配置
在使用uwsgi部署flask應用時,一定要記得將app.run()方法放在if __name__ == '__main__':
內部或者單獨文件內,這樣就可以保證其不會被調用,從而不會啟動本地服務器。
uwsgi是一個服務器,使用前一定要安裝:
pip install uwsgi
配置文件:
socket=/tmp/app.sock
chmod-socket=666
pidfile=/etc/nginx/uwsgi.pid
chdir=/home/**/mygithub/learn_flask/app
master=true
wsgi-file=serve.py
http=127.0.0.1:8005
callable=app
processes=8
threads=4
lazy-apps=true
對所配置的參數進行說明:
- callable:Flask項目的實例名稱
- module:可調用對象的名稱
- processes:開啟多少個子進程處理請求。
- threads:每個進程的線程數
更多參數詳情可見:uwsgi中文文檔
在命令行中啟動uwsgi服務器:
uwsgi --ini uwsgi.ini
在瀏覽器中輸入 http://127.0.0.1:8005
,可以驗證服務啟動。
nginx配置
安裝nginx:
apt-get install nginx
啟動nginx:
service nginx start
重啟
service nginx restart
nginx配置:
server{
listen 8080;
server_name localhost;
access_log /var/log/nginx/app_access.log;
error_log /var/log/nginx/app_error.log;
location / {
include uwsgi_params;
uwsgi_pass unix:/tmp/app.sock
}
}
nginx配置文件nginx.conf通過include引用了conf.d和site_enabled這兩個文件夾中的配置文件,所以我們可將配置文件放在這兩個路徑任意一處。
重啟nginx和uwsgi,在瀏覽器中輸入 http://127.0.0.1:8088
,可以驗證服務啟動。
這樣,就完成基礎的nginx+uwsgi完成了Flask的部署。
容器化部署
接下來,介紹使用docker進行容器化部署。
docker配置
建議了解docker基本操作,首先,創建Dockerfile:
FROM ubuntu:16.04
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
RUN apt update && apt install -y iputils-ping python3 python3-pip python3-tk libffi-dev libssl-dev
RUN apt install -y nginx && pip3 install uwsgi
ADD ['./', "/app"]
ADD ['./build', "/app"]
WORKDIR /app
RUN pip3 install -r requirements.txt
RUN chmod + x start_script.sh
CMD ['/start_script.sh']
注意:
- 該鏡像的基礎鏡像為ubuntu:16.04,可自行docker pull
- 編寫服務啟動腳本start_script.sh
ln -s /app/nginx.conf /etc/nginx/conf.d/
nginx && uwsgi --ini uwsgi.ini
python3 serve.py
使用命令:
docker build -t image .
以上,就打包完成了鏡像 (imagename),接下來執行docker run -d --name test imagename
啟動容器,執行docker ps -a
可以看到剛才啟動的容器,執行docker logs -f
可查看日志。
另外,推薦使用k8s對docker容器進行編排管理,具體使用后續博客介紹。
代碼可參照:my github