诸如nginx apache这些web服务器致力于静态文件的的传输,一些数据需要计算才能获知,计算的程序都在web服务器背后,所以这时web服务器也扮演了反向代理服务器的角色。
既然web服务器和后台计算程序分作两个进程,进程之间的通信必然要遵从一个协议,这个协议就是通用网关协议。
cgi = common gateway interface
cgi方式在对于每个http请求,web宿主服务程序都建立新的进程以调用服务器脚本,相应该请求,处理完后结束这个子进程。这就是fork-and-execute模式。所以用cgi方式的服务器有多少连接请求就会有多少cgi子进程,子进程反复加载是cgi性能低下的主要原因。当用户请求数量非常多时,会大量挤占系统的资源如内存,cpu时间等,造成效能低下。
fcgi = fast cgi
它其实是cgi在具体实现中的的一个变种。fcgi在规范上跟cgi并没有不同,通过减少cgi代理程序和web宿主服务程序的通信开销。fcgi建立一个独立的fcgi服务程序进程,和web宿主服务程序进程通信,fcgi服务进程被一旦启动后,自己分配资源、创建线程响应http请求、并决定自身生命周期,从而大大降低了系统为了创建进程而做出的资源开销。现代流行的web服务器程序,如php、asp.net,基本都是fcgi的实现。他还是支持分布式的运算,即fastcgi程序可以在网站服务器以外的主机上执行并且接受来自其他网站服务器来的请求。
fastcgi比gi的特点就是后面的计算程序从web服务进程中独立出来,可以常驻内存,可以分布式部署。
scgi = simple cgi
它是fcgi在精简数据协议和响应过程后的产物。其设计目的是为了适应越来越多基于ajax或rest的http请求,而做出更快更简洁的应答。并且scgi约定,当服务器返回对一个http协议请求响应后,立刻关闭该http连接。所以不难看出,scgi更加适合于普遍意义上soa所提倡的“请求-忘记”这种通信模式。
wsgi = web server gateway interface
当web server收到一个请求后,可以通过socket把环境变量和一个callback回调函数传给后端web应用,web应用在完成页面组装后通过callback把内容返回给web server。这样做的优点有很多:
异步化,通过callback将web请求的工作拆解开,可以很方便的在一个线程空间里同时处理多个web请求。方便进行各种负载均衡和请求转发,不会造成后端web应用阻塞。
此协议是python语言的专利,它定义了一组在web服务宿主程序和http响应代理程序之间通信的普遍适用的接口。它的产生是因为python程序员注意到,对于web框架和web宿主服务器程序间,有严重的耦合性,比如说,某些框架是针对apache的mod_python设计的。于是,wsgi就定义了一套非常低级别的接口。常见的python web框架都实现了这个协议:如 cherrypy, django, web.py, web2py, turbogears, tornado, pylons, bluebream, google app engine[dubious – discuss], trac, flask, pyramid,等等.
以上就介绍了cgi fastcgi wsgi,包括了fastcgi方面的内容,希望对php教程有兴趣的朋友有所帮助。
