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之间的关系>

Flask应用部署的更多相关文章

  1. flask项目部署到阿里云 ubuntu16.04

    title: flask项目部署到阿里云 ubuntu16.04 date: 2018.3.6 项目地址: 我的博客 部署思路参考: Flask Web开发>的个人部署版本,包含学习笔记. 开始 ...

  2. Flask (七) 部署

    阿里云部署Flask项目   部署Flask项目和部署Django项目基本一致,我们也使用uwsgi+nginx   我们在部署Django项目基础上部署Flask项目   1, 将uwsgi.ini ...

  3. 高并发Flask服务部署

    高并发Flask服务部署 AI模型持久化 OOP: 利用面向对象思想,实现算法在内存上的实例化及持久化.即一次模型加载,多次请求调用. class ocr_infer_class(threading. ...

  4. Flask的部署

    当前对部署flask的一些学习: 1.全局安装nginx 1.1 nginx的配置文件怎么写? $ sudo rm /etc/nginx/sites-enabled/default $ sudo to ...

  5. 将树莓派变成一个web服务器(2):Nginx+Flask+uWSGI部署全过程

    1)安装Flask,uwsgi,nginx sudo apt-get update sudo apt-get install python-flask #Flask sudo apt-get inst ...

  6. Python flask网站部署总结

    先开一贴,有空来总结下前段时间的网站部署情况.此次部署采用Gunicorn + Nginx + supervisor的组合在VPS环境中部署flask网站应用. Ubuntu环境准备 准备python ...

  7. Flask之部署

    5.3 部署 当我们执行下面的hello.py时,使用的flask自带的服务器,完成了web服务的启动.在生产环境中,flask自带的服务器,无法满足性能要求,我们这里采用Gunicorn做wsgi容 ...

  8. Flask学习之旅--Flask项目部署

    一.写在前面 Flask 作为一个轻量级的 Web 框架,具有诸多优点,灵活方便,扩展性强,开发文档也很丰富.在开发调试的过程中,我们往往会使用 Flask 自带的 Web 服务器,但如果要投入到生产 ...

  9. flask项目部署到生产环境的方案

    背景 使用Python+flask编写的一个小项目,在本地开发完毕后,需要部署到测试服务器上,这时候犯难了,因为之前没部署过这块东西,所以各种百度,总算是部署成功了,也对这个项目进行了jenkins持 ...

随机推荐

  1. C++学习001-注释

    天了噜,感觉自己最近好堕落啊,  在等待项目任务书到来的时候,在来好好学习学习C++ 今天来学习一下C++的注释风格 编写环境 Qt 5.7 1. //注释 // ui->setupUi(thi ...

  2. Jmeter非GUI命令参数说明

    查看帮助 -h, --help print usage information and exit 查看版本 -v, --version print the version information an ...

  3. SQL - SELECT COUNT用法

     SQL Server数据库  COUNT() 函数返回匹配指定条件的行数.   语法   SQL COUNT(column_name) 语法   COUNT(column_name) 函数返回指定列 ...

  4. Node.js的require()的工作原理

    大多数人都知道Node.js中require()函数做什么的,但是有多少人知道它的工作原理呢?我们每天使用它加载库包和模块,但是它的内部行为原理很神秘. 我们追寻Node模块系统的核心: module ...

  5. flask - 1

    from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello, Worl ...

  6. C#的Response.BinaryWrite图片乱码问题

    今天学习Response对象,该对象的有很多的输出方式,其中有一个binaryWrite可以输出图片,但是在输出图片一开始出现了乱码,后来通过百度得到解决: 代码: FileStream stream ...

  7. 关于for循环的理解

    个人理解:for循环,顾名思义,就是在每种特定条件下,按照要求执行每个阶段,也指着在某种情况下的赋值,反反复复的根据 编程来输入.当在一些特定条件下,程序中的数值也会发生相应的改变,这就得看执行的口令 ...

  8. 实现AJAX跨域访问方式一

    1.添加pom依赖 <dependency> <groupId>com.thetransactioncompany</groupId> <artifactId ...

  9. IO调度

    互联网公司不关注真实的文件系统,他们关注VFS层,关注block层,关注IO的管控. queue->make_request_fn ( blk_queue_bio ),其中blk_queue_b ...

  10. 【题解】SDOI2018战略游戏

    被CNST的大小卡了好久.一定要开到18呀…… 首先,遇到这种带各种各样环的图先考虑是不是可以建立圆方树,在圆方树上求出答案.然后转化为圆方树之后,我们就将图转化到了树上.答案非常的明显:只要一个圆点 ...