Flask应用部署

1. 介绍

前面介绍了<Linux下Nginx使用>, 但是Nginx是一个提供静态文件访问的web服务

首先我们介绍一下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之间的关系>

posted @ 2017-08-10 16:58  北落不吉  阅读(674)  评论(0编辑  收藏  举报