1、什么是WSGI?

Web服务器网关接口(全称 Python Web Server Gateway Interface),指定了web服务器和Python web应用或web框架之间的标准接口,以提高web应用在一系列web服务器间的移植性。(类似于java语言的Servlet规范)。
可以简单理解为:
1.WSGI是一套接口标准协议/规范;
2.通信(作用)区间是Web服务器和Python Web应用程序之间;
3.目的是制定标准,以保证不同Web服务器可以和不同的Python程序之间相互通信

2、为什么需要WSGI?

请求时Web服务器需要和web应用程序进行通信,但是web服务器有很多种啊,Python web应用开发框架也对应多种啊,所以WSGI应运而生,定义了一套通信标准。试想一下,如果不统一标准的话,就会存在Web框架和Web服务器数据无法匹配的情况,那么开发就会受到限制,这显然不合理的。

3、WSGI的标准

1.web服务器在将请求转交给web应用程序之前,需要先将http报文转换为WSGI规定的格式。
2.WSGI规定,Web程序必须有一个可调用对象,且该可调用对象接收两个参数,返回一个可迭代对象:

  • environ:字典,包含请求的所有信息
  • start_response:在可调用对象中调用的函数,用来发起响应,参数包括状态码,headers等

4、WSGI请求过程

Web 编程就是对HTTP协议的应用,我们能使用 socket 自制 web 服务器,但每次都需要自己处理协议的内容很烦琐,所以可以把HTTP协议的东西外包给专门的HTTP服务器软件,而 python 就只是单纯的负责处理业务,再通过 WSGI 把两者关联起来。
image.png
如上图所示,常规流程如下:

1.浏览器到WSGI Server:浏览器发送的请求会先到WSGI Server;
2.environ:WSGI Server会将HTTP请求中的参数等信息封装到environ(一个字典)中;
3.WSGI Server到WSGI App:App就是我们自己编写的后台程序,每个URL会映射到对应的入口处理函数(或其他可调用对象),WSGI Server调用后台App时,会将environ和WSGI Server中自己的一个start_response函数注入到后台App中;
4.逻辑处理:后台函数(或其他可调用对象)需要接收environ和start_response,进行逻辑处理后返回一个可迭代对象,可迭代对象中的元素为HTTP正文;
5.WSGI App到WSGI Server:后台函数处理完后,会先调用start_response函数将HTTP状态码、报文头等信息(响应头)返回给WSGI Server,然后再将函数的返回值作为HTTP正文(响应body)返回给WSGI Server;
6.WSGI Server到浏览器:WSGI Server将从App中得到的所有信息封装为一个response返回给浏览器;

从上述一系列流程可看出,WSGI web服务器,本质上是一个TCP服务器,监听在特定的端口上。支持HTTP协议,能够解析HTTP请求报文,能够按HTTP协议将响应数据封装为报文并返回给浏览器。实现了WSGI协议,该协议约定了和应用程序之间的接口,即url到app之间的映射。WSGI应用程序,遵从WSGI协议,本身是一个可调用对象,调用start_response,返回响应头部,返回包含正文的可迭代对象。

5、uwsgi 和 uWSGI

uwsgi:与WSGI一样是一种通信协议,是uWSGI服务器的独占协议,用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型的描述,与WSGI协议是两种东西,据说该协议是fcgi协议的10倍快。使用C语言开发,会和底层接触的更好,配置也是比较方便。

uWSGI:是一个web服务器,实现了WSGI协议、uwsgi协议、http协议等。主要特点是:超快的性能、低内存占用、多app管理、详尽的日志功能(可以用来分析app的性能和瓶颈)、高度可定制(内存大小限制,服务一定次数后重启等)

5.1、开发部署

1.本地开发及调试过程中,利用WSGI搭建localhost服务器即可满足需要。然而,实际生产环境需要满足更高的要求和多样化应用场景,单一的WSGI显然无法满足。
image.png
当前二级结构,WSGI作为服务器,到了HTTP协议以及wsgi协议,Django应用作为application,实现了wsgi协议。当有客户端发来请求,WSGI服务接受请求,调用Django app得到相应,之后相应给浏览器。

5.2、生产部署

2.Django等web框架会自己附带一个wsgi服务器(这就是Django应用可以直接启动的原因),但是这只是在开发阶段用到的,在生产环境是不够用的,所以用到性能高的uwsgi。
image.png

  1. Web部署后的实际生产环境中,uWSGI作为中间件,它用到了uwsgi协议(与nginx通信),wsgi协议(调用Django app)。当浏览器发来请求,nginx先做处理(静态资源是nginx的强项),无法处理的请求交给中间件(uWSGI),最后的响应也是nginx回复给浏览器的。<br /> 多了一层反向代理,提高Web server性能(uWSGI处理静态资源不如NginxNginx会在收到一个完整的HTTP请求后再转发给wWSGI),Nginx可以做负载均衡(多个服务器时),保护了实际的web服务器(客户端是和nginx交互而不是uWSGI)