注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

老和山小和尚

敬天爱人

 
 
 

日志

 
 
 
 

web server处理动态网页的各种方法  

2008-10-10 17:24:29|  分类: 其他服务软件 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
web server处理动态网页的各种方法
 
更新日期:2008-10-14
 
Web server(本文主要考虑HTTP方面,不考虑FTP、NNTP、SMTP等服务功能)从功能上来上,最简单的模型如下:
1、维持并处理客户端过来的HTTP请求;
2、如果是请求的是动态页面,解析之,生成页面内容;
3、返回一个HTML页面给客户端。
由功能可以知道,web server对动态网页的处理方式包括两种:
一、1、2、3三个步骤一条龙服务(如Apache的通用内嵌处理模块,也有为个别动态语言服务的Tomcat、Mongrel);
二、前台web server把第2步转交给后台某个可执行程序进行处理,然后把后台的结果接过来,再返回给客户(如CGI一系列);
 
当然,现在的大网站都不是这么简单的过程,中间加了负载均衡和cache的过程,这就涉及到很多同构或者异构的web架构的东西,本文仅考虑简单的web 服务。

Apache
这是[1]中的一段话:“ Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩展,将Perl/Python等解释器编译到服务器中。 ”
把Apache作为一种分类放在这里,因为Apache是如此流行,从[2]中的统计可以看出,从1996年开始Apache就一直傲视群雄。以至于我看到现在很多开源web server(如nginx,lighthttpd)的配置和源代码中,与Apache是十分相似,可以说是直接借鉴了Apache的设计思想。所以Apache代表的是web server一种先进的发展方向。
当然,Apache臃肿的身躯越来越多受到它的继承者的竞争,但我相信Apache会在广大开源软件作者的努力下,继续前行。
 
对于动态语言,Apache既可以动态加载的模块(mod_perl、mod_php)来处理,也可以用CGI、FastCGI的形式处理,更多的配置信息在[3]中。
 
参考文献:


CGI(Common Gateway Interface)
“CGI通常翻译为共同网关接口,是HTTP服务器与机器上的其他程序进行通信的一个接口。这个“其他程序”可以使用任何计算机语言来编写,它通过CGI(一般会把HTTP请求的参数放到环境变量中)这个接口从HTTP服务器取得输入,然后把运行的结果又通过CGI这个接口交给HTTP服务器,而HTTP服务器把这个结果送给浏览器。
     CGI的出现让WEB从静态变为为动态,随着Web的越来越普及,很多的网站的都需要有动态的页面,以便与浏览者互交。CGI方式的缺点也越来越突出。因为HTTP要生成一个动态页面,系统就必须启动一个新的进程以运行CGI程序,不断地fork是一项很消耗时间和资源的工作。如果能够让HTTP服务器本身就支持一种语言,用这个语言来编写动态页面的话,这就至少不需要fork。因此就出现一种叫做动态网页设计语言的东西,如php,asp,jsp。这些不是真正的语言,他们都只是专门用于web的,脱离了web环境,他们就什么都干不了(php正在努力改变这种现状)。”[1]
事实上,从[2]、[3]来看,CGI的制定者都已经放弃CGI的形式作为动态网页的生成器,转而建议采用Fast-CGI 或者类似Apache API 的方式了。
参考文献:
SSI(Server Side Includes)
       "SSI(服务端包含)是一种早期的较为简单及粗糙的动态方式,能够实现的功能很少,基本上现在很少使用,但如果只是简单的处理,这也未尝不是一个好的方法。他是Http服务器本身所支持的"语言"。"[1] SSI的网页一般以后缀名shtml、stm或shtm结尾。基本语句的用法为:<!--#directive parameter=value parameter=value -->。
SSI可以把静态的txt或者html文件简单得包含在一起。从[2]中可以看出,SSI还可以实现一些简单的命令或者CGI程序,所以也算动态语言的一种,但功能很弱。
与SSI对应的,还有一种名叫CSI(Client Side Includes ),听起来名字很陌生,其实我们用得很多。CSI技术包括HTML网页中的框架,JavaScript,或者Ajax。当然它需要客户端的支持。
 
参考文献:

FastCGI
“FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。”[1]
FastCGI的工作原理是:“FastCGI使用一个持续的进程处理许多HTTP请求。可以用一个连接,然后在内部运用多路复用的技术同时处理多个请求,也可以用一对一的方式建立多个连接。而且同时可以存在很多进程,所以有很好的稳定性和可扩展性。环境信息和页面的请求通过TCP连接或unix套接字(本地进程)从web server送到FastCGI进程。处理完成后通过同样的连接,FastCGI把回复返回给web server。这个TCP连接在这个回复以后可能会关闭,但是web server和FastCGI进程还将继续待命。”[2]
FastCGI有如下优点:“稳定,安全,高性能,方便扩展”[2][3]。FastCGI也已经在众多平台上广泛实现,支持大多数的动态语言(不包含ASP)。但从[3]中描述中看来,FastCGI似乎命运多舛,受到很多类似模块内嵌解析器的排挤。不管如何,从[4]中性能比较来看,FastCGI至少还略胜一筹,不过由于数据的古老,不知道现在再进行比较,结果会变得如何?
这里推荐下apache下面的mod-fcgid,国人写的,性能比mod-fastcgi要好,debian源中已经把mod-fastcgi废弃了。
 
参考文献:

SCGI (Simple CGI)
从[1]中对Zed Shaw的对话中可以看出,SCGI应该算作Ruby项目的一个副产品。它采用了FastCGI的优点,但不通过环境变量的方式来传HTTP请求的值和参数,转而采用自己定义的简单的传值协议。我能想到的好处是配置简单,不需依靠外部变量,可能更加通用一些,与FastCGI相比,性能应该相差不大。
一个SCGI的请求和回复的例子如下:
Web server与SCGI建立连接,发送如下请求信息[2]:
 "70:"
           "CONTENT_LENGTH" <00> "27" <00>
           "SCGI" <00> "1" <00>
           "REQUEST_METHOD" <00> "POST" <00>
           "REQUEST_URI" <00> "/deepthought" <00>
       ","
       "What is the answer to life?"
 
SCGI回复:
"Status: 200 OK" <0d 0a>
       "Content-Type: text/plain" <0d 0a>
       "" <0d 0a>
       "42"
 
 
参考文献:
 
 
 

 
  评论这张
 
阅读(842)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018