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. Git 使用 粗糙记录

    版本控制应该是每一个开发人员应该会的东西,奈何,学校没有学习,随着写代码的时间的加长,越来月觉得版本控制的必要性了. 记得在实习的公司,同一痛的都是SVN. 至于GIt和SVN的区别,直接看连接 ht ...

  2. HDU 4565 So Easy!(数学+矩阵快速幂)(2013 ACM-ICPC长沙赛区全国邀请赛)

    Problem Description A sequence Sn is defined as:Where a, b, n, m are positive integers.┌x┐is the cei ...

  3. Week8 Teamework from Z.XML-Z.XML游戏功能说明

    我们小组的游戏终于新鲜出炉了,好开心~ 快来看看有什么功能吧. 游戏目标::=打倒最多的敌人,获得积分,放松心情,获取快乐. 游戏菜单::= 关于+设置+帮助+积分榜+开始游戏吧 (截图还在路上..) ...

  4. hadoop 2.6.0 伪分布式部署安装遇到的问题

    之前读到了一篇关于配置安装hadoop的博文(地址:http://www.powerxing.com/install-hadoop/)能正确安装和运行,但是在网页进行Jobtracker监控时,输入l ...

  5. zuoyebiji

  6. JSP中的Cookie

    如何创建Cookie 先引包: import="javax.servlet.http.Cookie" JSP是使用如下的语法格式来创建cookie的: Cookie cookie_ ...

  7. C++的一些小操作、常用库及函数(持续更新)

    1. 强制保留n位小数(位数不足则强制补零) 头文件: #include <iomanip> 在输出前: cout<<setprecision(n); 也有不用头文件的方式,在 ...

  8. BZOJ4651/UOJ220 [Noi2016]网格

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  9. 容器(vector)、数组、new创建的动态数组,你到底用哪一个(执行效率分析)

    1.问题的提出 在没有了解vector之前,动态数组一般都是又new创建的.在了解vector后发现vector竟是那样方便好用,但方便的同时却是以牺牲执行效率为代价的.网上对vector和array ...

  10. POJ3623 Best Cow Line, Gold 【后缀数组】

    最好的牛线,金 时间限制: 5000MS   内存限制: 65536K 提交总数: 5917   接受: 2048 描述 FJ即将把他的ñ(1≤ ñ ≤30,000)头牛竞争一年一度的"年度 ...