诸如nginx Apache这些web服务器致力于静态文件的的传输,一些数据需要计算才能获知,计算的程序都在web服务器背后,所以这时web服务器也扮演了反向代理服务器的角色。
既然web服务器和后台计算程序分作两个进程,进程之间的通信必然要遵从一个协议,这个协议就是通用网关协议。
CGI = Common Gateway Interface
CGI方式在对于每个HTTP请求,Web宿主服务程序都建立新的进程以调用服务器脚本,相应该请求,处理完后结束这个子进程。这就是fork-and-execute模式。所以用cgi方式的服务器有多少连接请求就会有多少cgi子进程,子进程反复加载是cgi性能低下的主要原因。当用户请求数量非常多时,会大量挤占系统的资源如内存,CPU时间等,造成效能低下。
既然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
此协议最早由Python语言发起并实现,Python程序员注意到,对于Web框架和Web宿主服务器程序间,有严重的耦合性,比如说,某些框架是针对Apache的mod_python设计的。类似AJP和Servlet的组合,它定义了在Web服务宿主程序和HTTP响应代理程序两个进程间的HTTP上下文传输协议和一个具体服务回调函数,在这个函数下可以多种多样的web开发框架,如同一个ajp之下的多个servlet的框架。
此协议最早由Python语言发起并实现,Python程序员注意到,对于Web框架和Web宿主服务器程序间,有严重的耦合性,比如说,某些框架是针对Apache的mod_python设计的。类似AJP和Servlet的组合,它定义了在Web服务宿主程序和HTTP响应代理程序两个进程间的HTTP上下文传输协议和一个具体服务回调函数,在这个函数下可以多种多样的web开发框架,如同一个ajp之下的多个servlet的框架。