WSGI
全称:Web Server Gateway Interface 翻译过来就是Web服务器网关接口;WSGI是一个规范协议,定义了Web服务器如何与Python应用程序进行交互,使得使用Python写的Web应用程序可以和Web服务器对接起来。
在WSGI中定义了两个角色,Web服务器端称为server或者gateway,应用程序端称为application或者framework(因为WSGI的应用程序端的规范一般都是由具体的框架来实现的)。我们下面统一使用server和application这两个术语。
server端会先收到用户的请求,然后会根据规范的要求调用application端,如下图所示:
调用的结果会被封装成HTTP响应后再发送给客户端。
要使用WSGI,需要分别实现server角色和application角色。
Application端的实现一般是由Python的各种框架来实现的,比如Django, web.py等,一般开发者不需要关心WSGI的实现,框架会会提供接口让开发者获取HTTP请求的内容以及发送HTTP响应;
Server端的实现会比较复杂一点,这个主要是因为软件架构的原因。一般常用的Web服务器,如Apache和nginx,都不会内置WSGI的支持,而是通过扩展来完成。比如Apache服务器,会通过扩展模块mod_wsgi来支持WSGI。Apache和mod_wsgi之间通过程序内部接口传递信息,mod_wsgi会实现WSGI的server端、进程管理以及对application的调用。Nginx上一般是用proxy的方式,用nginx的协议将请求封装好,发送给应用服务器,比如uWSGI,应用服务器会实现WSGI的服务端、进程管理以及对application的调用。
uwsgi
它是一个二进制协议,可以携带任何类型的数据。一个uwsgi分组的头4个字节描述了这个分组包含的数据类型。
uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信;
uWSGI
uWSGI是一种web服务器,是实现了uwsgi和WSGI两种协议的Web服务器
WSGI,uwsgi, uWSGI: 实现过程图解
为什么有了uWSGI为什么还需要nginx?因为nginx具备优秀的静态内容处理能力,然后将动态内容转发给uWSGI服务器,这样可以达到很好的客户端响应。
要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。
- WSGI是一种通信协议。
- uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。
- 而uWSGI是实现了uwsgi和WSGI等协议的Web服务器
自下而上的解读
django
django作为python语言web开发框架,关心的是如何处理request和response,除此以外,django都不关心,具体怎么部署也不是django要关心的。
另外,django提供的是一个开发服务器,在开发的时候可以运行起来进行测试,但这使用的是python自带的simple HTTPServer,安全和效率上都不行。
用django框架开发出来的程序,我们叫做python web应用程序,application,单纯的应用程序还需要其他来实现web的应用,比如WSGI。
WSGI
正如前面所提,WSGI是一种协议,不是包也不是server,和tcp一样,属于一种协议,这种协议定义web server和web application如何通信,就相当于在server和application之间架起一座桥。
这个协议就是专门为python语言定义的,从2003年出来后,其他语言也出现类似接口。
uWSGI
有了django框架的python application,有了实现的WSGI协议,要让应用得以部署在服务器,这就需要web server,一般也作为应用服务器。
uWSGI是一个全功能的HTTP服务器,有关server的配置也很齐全。uWSGI server 把HTTP协议转化成python语言或其他语言支持的网络协议,比如把HTTP协议转化成WSGI协议,供python直接使用。
uwsgi
uwsgi是uWSGI的内部自有协议,非通信协议而是线路协议,使用二进制方式和其他应用程序进行通信,常用于uWSGI server和其他web server的数据通信,如nginx/apache等。
nginx
nginx作为web server,它也可以实现和uWSGI功能,但是nginx更为强大,比如nginx实现反向代理、负载均衡、转发请求等,这些是uWSGI不能实现的。