Nginx + WSGI Server(uWSGI、Gunicorn) + Flask APP

343 篇文章 9 订阅

参考文献:https://zhuanlan.zhihu.com/p/68676316?utm_source=wechat_session&utm_medium=social&utm_oi=847704103630028800
https://www.zhihu.com/question/342967945
https://www.zhihu.com/question/297267614

Introduction

我们在使用Flask进行Web开发的过程中,开发环境下一般用Web框架自带的Web Server进行调试等开发工作,但是如果要将整个Web项目部署到生产环境下,往往会采用如下方案:
Nginx + WSGI Server(uWSGI、Gunicorn) + Flask APP

这篇文章将会讨论,为什么我们要用Nginx和WSGI Server来进行Flask App的部署。


什么是WSGI

WSGI是 Web Server Gateway Interface 的缩写。

它是 Python应用程序(application)或框架(如 Django)和 Web服务器之间的一种接口,已经被广泛接受,这个接口定义了web server如何转发请求到Python写的应用中。就像Java 的servlet API,这样只要实现接口的web server都可以调用遵守此接口的任何Python应用。

它是一种协议,一种规范,其是在 PEP 333提出的,并在 PEP 3333 进行补充(主要是为了支持 Python3.x)。这个协议旨在解决众多 web 框架和web server软件的兼容问题。有了WSGI,你不用再因为你使用的web 框架而去选择特定的 web server软件。

常见的web应用框架有:Django,Flask等

常用的web服务器软件有:uWSGI,Gunicorn等,它们是实现了WSGI的一个中间件。

为什么要用WSGI

web框架(即app)在生产中一般不用于直接接收http请求(在调试阶段,往往可以使用框架自带的一些web server来使用,但是性能较差,不稳定)。

web 服务器 和 web 框架,分工不同,职责不同(web 服务器专注于接收并解析请求以调用的方式将请求的内容传给web框架),缺一不可,可以说它们是两个组件,共同协作才能实现web网页的访问,既然是两个组件,那总要定义一些约定俗成的通讯协议,而这就是WSGI,所以必须有WSGI。

Gunicorn、uWSGI是实现了WSGI接口的,一个完整的http server,可以直接用来部署Python Web,相比于web框架自带的server,它们的性能更强(多进程),功能更丰富(动态调整worker)。

优点主要有:

  1. 帮我 scale worker, 进程挂了帮我重启
  2. 用 python 的框架 flask/django/webpy 配置起来都差不多
  3. 还有信号机制。可以支持多种配置
  4. 其他

在管理 worker 上,使用了 pre-fork 模型,即一个 master 进程管理多个 worker 进程,所有请求和响应均由 Worker 处理。Master 进程是一个简单的 loop, 监听 worker 不同进程信号并且作出响应。比如接受到 TTIN 提升 worker 数量,TTOU 降低运行 Worker 数量。如果 worker 挂了,发出 CHLD, 则重启失败的 worker, 同步的 Worker 一次处理一个请求。


为什么要用Nginx

Nginx是专业的高性能HTTP和反向代理web服务器,在我们这里,使用nginx作为反向代理服务器,通过nginx接收传来的请求,分发给WSGI server,亦把WSGI server传回的响应发送给客户端。
在这里插入图片描述

因为uWSGI和Gunicorn是实现了WSGI接口的,一个完整的http server,所以可以直接用来部署Python Web的,那为什么还需要Nginx呢?
因为Nginx擅长高并发,处理静态文件,gzip压缩等,这些功能是uWSGI等不具备的,如果你的网站访问量不大,可以只用uWSGI,完全不需要用Nginx。(由uwsgi和gunicorn提供一个http server,这样nginx就只需要做转发就好了,这样WSGI Server就是一个加强版的http server,把http转换为wsgi,http这头是nginx,wsgi那头是wsgi app。)

所以现在流行的使用方法是Nginx+uWSGI ,如上图所示。Nginx主要用到反向代理功能,来完成Proxy,静态文件服务等,动态请求转给uWSGI调用Python来完成。
Nginx与uWSGI通过uwsgi(全部小写)协议来完成(uwsgi是一个二进制协议,允许uWSGI与Nginx等应用服务器交互)。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值