本文将介绍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