一般服务器程序分为web服务器和应用程序服务器。web服务器是用于处理HTML文件,让客户能够经过浏览器进行访问,主流的web服务器有Apache、IIS、Nginx、lighthttpd等。应用服务器处理业务逻辑,好比使用Python的Django、flask写的程序。一般来自客户端浏览器的请求被web服务器截获,若是是静态请求,则如Nginx会本身作处理,若是是动态请求,则会抛给后端应用服务器来处理。因而如何在web服务器与应用服务器之间进行通讯成了主要问题,这就引出了如下三种处理的接口:CGI、FastCGI、WSGI。python
通用网关接口(Comman Gateway Interface)描述了客户端和服务器程序之间传输数据的一种标准,可让一个客户端,从网页浏览器向执行在网络服务器上的应用程序请求数据。CGI独立于任何语言,CGI程序能够是任何脚本语言或彻底独立编程语言实现,只要这个语言能够在这个系统上运行。Unix shell、Python、Ruby、PHP、Perl、C/C++和VB均可以用来编写CGI程序。最初CGI是在1993年由美国国家超级电脑应用中心为NCSA HTTPd web服务器开发的。这个web服务器使用了Unix shell环境变量来保存从web服务器传递出去的参数,而后生成一个运行CGI的独立的进程。CGI的处理流程以下图所示:
nginx
CGI使外部程序与web服务器之间交互成为可能。CGI程序运行在独立的进程中,并对每一个web请求创建一个进程,这种方法很是容易实现,但效率不好,难以扩展。面对大量请求,进程的大量创建和消亡使操做系统性能大大降低,此外,因为地址空间没法共享,业限制了资源重用。web
快速通用网关接口(Fast Comman Gateway Interface)是通用网关接口(CGI)的改进,描述了客户端和服务器程序之间传输数据的一种标准。FastCGI致力于减小web服务器与CGI程序之间互动的开销,从而使服务器能够同时处理更多的web请求。与为买个请求建立一个新的进程不一样,FastCGI使用持续的进程来处理一连串的请求。这些进程由FastCGI进程管理器管理,而不是web服务器。
shell
当进来一个请求时,web服务器把环境变量和这个页面请求经过Unix domain socket(都位于同一物理服务器)或者一个IP socket(FastCGI部署在其余物理服务器)传递给FastCGI进程。
数据库
因为FastCGI程序不须要不断地产生新进程,能够大大下降服务器的压力而且产生较高的应用效率。它的速度效率至少要比CGI技术提升5倍以上。它还支持分布式部署,即FastCGI程序能够在web服务器之外的主机上运行。
CGI就是所谓的短生存期应用程序,FastCGI就是所谓的长生存期应用程序。FastCGI像是一个常驻(long-live)型的CGI,它能够一直执行着,不会每次都要花费时间去fork(这是CGI最为人诟病的fork-and-execute模式)。编程
web服务器网关接口(Python Web Server Gateway Interface)是为Python语言定制的web服务器和web应用程序或框架之间的一种简单通用的接口。自从WSGI被开发出来以后,许多其余语言中也出现了相似接口。WSGI是做为web服务器与web应用程序或应用框架之间的一种低级别的接口,以提高可移植web应用开发的共同点。WSGI是基于现存的CGI标准而设计的。
WSGI分为两个部分:一为"服务器"或"网关",另外一为"应用程序"或"应用框架"。在处理一个WSGI请求时,服务器会为应用程序提供环境资讯及一个回调函数(callback function)。当应用程序完成处理请求后,透过前述的回调函数,将结果回传给服务器。所谓的WSGI中间件同时实现了API的两方,所以能够在WSGI服务和WSGI应用之间起调解做用:从WSGI服务器的角度来讲,中间件扮演应用程序,而从应用程序角度来讲,中间件扮演服务器。"中间件"组件能够执行如下功能:flask
之前,如何选择合适的web应用程序框架成为困扰Python初学者的一个问题,这是由于,通常而言,web应用框架的选择将限制可用的web服务器的选择,反之亦然。那时的Python应用程序一般为CGI、FastCGI、mod_python中的一个设计,甚至是为特定web服务器的自定义的API接口而设计的。WSGI没有官方的实现,由于WSGI更像一个协议。只要遵循这些协议,WSGI应用(application)均可以在任何服务器(server)上运行,反之亦然。WSGI就是Python的CGI包装,相对于FastCGI是PHP的CGI包装。
WSGI将web组件分为三类:web服务器、web中间件、web应用程序,WSGI基本处理模式为:
后端
一、wsgi server/gateway
wsgi server能够理解为一个符合WSGI规范的web server,接收request请求,封装一系列环境变量,按照wsgi规范调用注册的wsgi app,最后将response返回给客户端。文字很难理解清楚wsgi server究竟是什么东西,以及作些什么事情,最直观的方式仍是看wsgi server的实现代码。以Python自带的wsgiref为例,wsgiref是按照wsgi规范实现的一个简单wsgi server。
浏览器
二、wsgi application
wsgi application就是一个普通的callback对象,当有请求到来时,wsgi server会调用这个wsgi app。这个对象接收两个参数,一般为environ,start_response。environ就是前面介绍的,能够理解为环境变量,跟一次请求相关的全部信息都保存在了这个环境变量中,包括服务器信息,客户端信息,请求信息。start_response是一个callback函数,wsgi application经过start_response,将response header/status返回给wsgi server。此外这个wsgi app会返回一个迭代器对象,这个迭代器对象就是response body。服务器
三、wsgi middleware
有些功能可能介于服务器程序和应用程序之间,例如,服务器拿到了客户端请求的URL,不一样的URL须要交由不一样的函数处理,这个功能叫URL路由,这个功能就能够放在两者中间实现,这个中间层就是middleware。middleware对服务器程序和应用都是透明的,也就是说,服务器程序觉得它就是应用程序,而应用程序觉得它就是服务器。这就告诉咱们,middleware须要把本身假装成一个服务器,接收应用程序,调用它,同时middleware还须要把本身假装成一个应用程序,传给服务器程序。其实不管是服务器程序,middleware仍是应用程序,都在服务端,为客户提供服务,之因此把它们抽象成不一样层,就是为了控制复杂度,使得每一次都不太复杂,各司其职。
uwsgi旨在为部署分布式集群的网络应用开发一套完整的解决方案。uwsgi主要面向web及其标准服务,已经成功的应用于多种不一样的语言。因为uwsgi的可扩展架构,它可以被无限制的扩展用来支持更多的平台和语言。目前可使用C,C++和Object-C来编写插件。项目名称中的wsgi是为了向同名的Python web标准表示感谢,由于wsgi为该项目开发了第一个插件。uwsgi是一个web服务器,它实现了wsgi协议、uwsgi协议、http等协议。uwsgi既不用wsgi协议也不用FastCGI协议,而是自创了一个uwsgi协议,uwsgi协议是一个uWSGI服务器自由的协议,它用于定义传输信息的类型,每个uwsgi packet前4字节为传输信息类型描述,它与WSGI相比是两样东西,听说该协议大约是fcgi协议的10倍快。uWSGI主要特色以下: