Flask应用部署
1. 介绍
前面介绍了<Linux下Nginx使用>, 但是Nginx是一个提供静态文件访问的web服务
首先我们介绍一下Web服务器, 应用服务器和应用框架的关系
客户端: 浏览器或者app
Web服务器: Web服务器是指驻留于因特网上某种类型计算机的程序。当客户端连到服务器上并请求文件时,服务器将处理该请求并将文件发送到该浏览器上,附带的信息会告诉浏览器如何查看该文件(即文件类型)。服务器使用HTTP(超文本传输协议)进行信息交流,这就是人们常把它们称为HTTP服务器的原因。
严格意义上Web服务器只负责处理HTTP协议,用于处理静态页面的内容。而动态内容需要通过WSGI接口交给应用服务器去处理。
Web服务器包括Nginx,Apache,IIS等。而优秀的web服务器在接收http请求时,还可以做负载均衡和反向代理等工作。
WSGI容器: 常见的WSGI容器有Gunicorn,uWSGI等。web框架和web服务器之间需要通信,这时候需要设计一套双方都遵守的借口。PEP3333指出,WSGI(Web Server Gateway Interface)是WEB服务器和web框架或web应用之间建立的一种简单通用的接口规范。有了wsgi这份接口规范,在web开发的过程中,能更加自由的选择服务器端和框架;在服务器端和框架的开发过程能够分离开来,不用过多的考虑双方具体的实现,使得服务器端和框架开发者能够专心自己领域的开发工作。而WSGI容器就是根据这套接口写出来的。WSGI容器的作用就是根据web服务器传递而来的参数构建一个让WSGI应用成功执行的环境,例如request,而且还得把WSGI应用上处理好的结果返回给web服务器。此外WSGI容器也叫应用服务器。
一般应用服务器都集成了web服务器,主要是为了调试方便,出于性能和稳定性考虑,并不能在生产环境中使用。
Web框架:作用主要是方便我们开发 web应用程序,HTTP请求的动态数据就是由 web框架层来提供的。常见的 web框架有Flask,Django,Tornado等,而Tornado不光是一个web框架,还实现了WSGI容器的功能。
本文中, 介绍了Nginx + Gunicorn + Flask的部署方法
2. Flask应用
下面的命令搭建了Flask环境
CentOS 7安装Flask # yum install epel-release # yum install python-pip # pip install virtualenv /* 当前应用为JingPro */ $ cd JingPro $ virtualenv venv New python executable in /opt/JingPro/venv/bin/python2 Also creating executable in /opt/JingPro/venv/bin/python Installing setuptools, pip, wheel...done. /* 进入虚拟环境 */ $ cd JingPro $ source venv/bin/activate (venv) [JingPro]$ /* 退出虚拟环境 */ $ deactivate /* 安装依赖, 包括: click, MarkupSafe, Jinja2, Werkzeug, itsdangerous, Flask */ $ pip install Flask /* 打包发布 */ $ pip freeze > requirements.txt /* 安装 */ $ pip install -r requirements.txt
下面一个基本Flask应用
from flask import Flask app = Flask(__name__) @app.route('/') def index(): return 'Hello World' if __name__ == '__main__': app.run()
3. Gunicorn使用
下面的命令安装并启动上面的Flask应用, 然后就可以通过浏览器来访问测试
(venv) $ pip install gunicorn (venv) $ gunicorn -b 0.0.0.0:80 wsgi:app
其中wsgi:app参数含义如下
wsgi: 引导用的python文件名称(不包括后缀/模块名)
app: Flask实例的名称
4. Nginx配置
基于上一篇文章中, 既要转发同时也要自己处理, 路由规则如下
location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location ^~ /forward/ { resolver 114.114.114.114; proxy_pass http://www.example.com:80/; }
Nginx通过该配置将转发之外的请求发送至本地的8000端口, 那么只要我们使用gunicorn监听本地的8000端口即可
(venv) $ gunicorn -b 127.0.0.1:8000 wsgi:app
最后我们只需要将Gunicorn作为服务运行即可.
创建文件/lib/systemd/system/gunicorn.service, 内容如下:
[Unit] Description="Python Web app" After=network.target [Service] PIDFile=/var/run/pid-gunicorn Environment=PATH=/opt/JingPro/venv/bin WorkingDirectory=/opt/JingPro/ ExecStart=/opt/JingPro/venv/bin/gunicorn -b 127.0.0.1:8000 wsgi:app ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s TERM $MAINPID [Install] WantedBy=multi-user.target
参考:
<Deploying Gunicorn>
<Flask+Gunicorn+Nginx部署>
<在Ubuntu上使用Nginx部署Flask应用>
<如何理解Nginx、uWSGI和Flask之间的关系>
<Python Web下的服务器结构-WSGI容器、Nginx、Flask之间的关系>