本文將介紹Flask的部署方案:Flask + Nginx + uWSGI,並使用docker進行容器化部署,部署的實例來源 Flask開發初探,操做系統爲ubuntu。html
Flask系列文章:前端
在開發時,咱們使用flask run命令啓動的開發服務器是werkzeug提供的,可是這種方式目的是爲了開發,不能很好的擴展,不適合生產部署。生產部署,咱們須要一個更強健,性能更高的WSGI服務器(關於WSGI,可參考WSGI究竟是什麼 ,經常使用的服務器有:uWSGI、Gunicorn等,本文以uWSGI舉例。python
像uWSGI這類WSGI服務器內置了Web服務器,因此咱們不須要web服務器也能夠與客戶端交換數據,處理請求和響應,可是內置的web服務器不夠強健,通常狀況下都會使用一個常規的web服務器運行在前端,爲WSGI服務器提供反向代理,web服務器選擇Nginx,Nginx會把外部的請求轉發給uWSGI處理,接收到響應後再返回給客戶端,這樣作的好處有:nginx
在使用uwsgi部署flask應用時,必定要記得將app.run()方法放在if __name__ == '__main__':
內部或者單獨文件內,這樣就能夠保證其不會被調用,從而不會啓動本地服務器。git
uwsgi是一個服務器,使用前必定要安裝:github
pip install uwsgi
配置文件:web
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
對所配置的參數進行說明:docker
更多參數詳情可見:uwsgi中文文檔shell
在命令行中啓動uwsgi服務器:flask
uwsgi --ini uwsgi.ini
在瀏覽器中輸入 http://127.0.0.1:8005
,能夠驗證服務啓動。
安裝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基本操做,首先,建立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']
注意:
ln -s /app/nginx.conf /etc/nginx/conf.d/ nginx && uwsgi --ini uwsgi.ini python3 serve.py
使用命令:
docker build -t image .
以上,就完成了一個鏡像打包,接下來就是docker容器的常規化操做。另外,推薦使用k8s對docker容器進行編排管理,這裏不作介紹。
代碼可參照:my github