`

浅谈 Python WSGI

 
阅读更多

参考WSGI的官方定义,引用原文

This document specifies a proposed standard interface between web servers and Python web applications or frameworks, to promote web application portability across a variety of web servers.

WSGI,即Python Web Server Gateway Interface(Python Web 服务器网关接口),何谓网关?其实就是完成不同协议之间的转换工作。说到这里,可能会冒出来一个问题:WSGI和CGI(公共网关接口)有什么区别和联系呢?

WSGI和CGI的区别和联系?

CGI(Common Gateway Interface)是Web应用程序和Web Server的底层通信协议,是Web开发过程中需要遵守的标准和规范,不同语言如PHP、Java、Python等完成的Web应用程序均依据此通信协议完成与Web Server的交互。但因为CGI的设计存在性能缺陷,因为每次Web Server接受请求的时候总要重新开启一个CGI进程,进程的初始化既费时间又耗资源,对于少量请求的情况,可以容忍此开销,但是若遇到了大量的请求,服务器的性能则会非常低下。为了解决CGI的性能缺陷问题,后来出现了 FastCGI 和 SCGI,它们能够有效地解决服务器性能问题,FastCGI不同于CGI的设计之处在于FastCGI要求CGI处理进程常驻内存中,有请求时处理,没有请求时等待,免去了进程初始化带来的开销。SCGI即Simple  CGI,相对FastCGI来说是一种更加简单的实现。根据以上分析,可见目前的Web底层通信机制已经被FastCGI和SCGI所取代。

WSGI也是为了解决Web应用程序和Web Server之间的交互而提出的一种规范,不过这种规范是以CGI为基础(因为CGI是底层通信协议),位于CGI的上一层更好地去解决应用程序和服务器之间的配合问题。在WSGI没有被提出之前,用户面对如此多的python web开发框架以及不同的服务器的时候总是非常沮丧,因为那时候并没有应用程序和服务器之间的交互规范,用户总是要做些额外的工作以保证应用程序和服务器相互协调正常工作。作为开发者可不希望如此重复且低效的工作,于是提出了WSGI规范,它不管用户采用了什么开发框架,也不管使用了什么服务器,只要双方均依据WSGI规范,那么双方就可以畅快地交互。如今大量的python web开发框架和服务器均包含了WSGI规范的实现,具体可参考链接:WSGIImplementations

现在我们就已最著名的Django框架,来摸索一下WSGI。WSGI作为规范涉及到了应用程序或框架与服务器两端,通常我们在用Django完成了一个app的时候,启动内置的devserver,不需要额外的工作就能够很好的工作,原因是Django作为框架本身已经实现了WSGI规范接口,而内置的devserver同样也是实现了WSGI规范接口,所以两者配合地非常融洽。

那么我们如果将app部署到生产环境不在使用devserver的时候,我们需要如何配置服务器呢?以Apache服务器为例:

  • Apache + mod_wsgi模块,此模块实现了服务器端的WSGI规范接口,所以和app同样可以配合工作;
  • 另一种使用Apache的方式是我们抛弃mod_wsgi,而是转用FastCGI、SCGI或AJP,根据上文我们知道FastCGI等只是底层的通信机制,而Apache并不负责实现WSGI规范接口,可以看出来服务器端缺少了点什么东西,没错!缺少的正是实现WSGI规范接口的组件,此时 flup 走入我们的视线,根据上文提到的WSGI实现链接,原来flup是实现WSGI规范的服务器,它正好可以配合Apache且弥补Apache没有WSGI规范接口的缺失,FastCGI等作为底层通信机制像胶水一样将Apache和flup黏在了一起。

上面就是我对WSGI的粗浅认识,如有不足请多多指正!

 

参考地址:http://jasonblog.sinaapp.com/2011/07/12/%E6%B5%85%E8%B0%88-python-wsgi/

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics