WWW服务器讲解

HTTP 1.1 协议

当欧洲高等物理实验室开发出网页服务器时,当时是使用 HTTP 1.0 版通讯协议,市场上支持得最好的浏览器大概就是 Netscape Navigator及Communicator,Netscape 公司在产品成熟后紧接着推出 Gold 版开始收费贩卖,在 Gold 版中他们提出了线上编辑网页的概念(编好后要用 FTP 上传就是了),为了实现这个概念必须要发展新的 HTTP 通讯协议,当然没多久 Netscape 从市场消失,大家开始改用微软公司的 IE 以及 FrontPage,微软公司基于简单易用的考量, 积极参与新版本 HTTP 通讯协议的制定,这就是后来我们看到的 HTTP 1.1。

HTTP 1.1 版通讯协议的改版幅度相当大,例如:增加档案 zip 压缩功能,增加 MD5 编密传送功能......等等,其中对微软公司最重要的就是,他们提案的 PUT 和 DELETE 指令被接受了,PUT 指令用来新增网页、修改网页内容或变更文件名,DELETE 指令则用来删除网页或目录,透过这个机制就可以很容易用 HTTP 80 端口来直接更新网站内容,这就是微软产品 FrontPage Server Extension 的目标,目前除了 FrontPage 支持 PUT、DELETE 指令外,还有 W3C 开发的 Winie 也可以用来上传网页(支持 Linux 平台,Server 端则由 Apache mod_put 负责)。底下简要的说明 HTTP 1.1 版各个指令的用途:

指令 用途

OPTIONS 查询或设定 URI 旗号,透过这个机制服务器得以和浏览器协商传输资料时要不要压缩、要不要 Cache ......等等

GET 取得网页资料。必须使用绝对网址来要求资料,如果使用相对路径,则必须以 Host: 标头标示目的网址,这跟 1.0 版有很大的不同

HEAD 跟 GET 很像,但只会取得网页标头,不包含网页内文(除错用)

POST 取得网页资料前,先上传前一个网页的窗体资料,POST 和 GET 的差别在于上传资料的方式不同,使用 GET 可以在网址后方添加信息(?user=xxps&test=on......),但信息的量无法超过一行的限制,使用 POST 上传没有上限。POST 除了用来上传窗体资料(上传档案)外,还可以:

为 Server 上的资料来源建立批注

提供资料给窗体中的动态数据链路项目(DataField)

新增资料到数据库(通常是另一个网页或纯文字数据库)

在 FrontPage 上可以制作这种进阶窗体,在此不作详细说明

PUT 当 PUT 指定的网页不存在时,会自动新增网页,否则就是要取代旧网页或变更名称

DELETE 删除指定的网页或空目录

TRACE 用来做应用层的 loopback 追踪,可以配合 OPTIONS 指定 Max-Forwards 来决定追踪的深度,使用此指令将追踪出所经过的 Proxy(除错用)

CONNECT 是给 Proxy 服务器用来建立 SSL 信道的,当浏览器透过 Proxy 使用 HTTPS 连上网页时,需要在 Proxy 上建立 SSL 信道才能提供服务给 Client 端

了解 HTTP 响应状态码的涵义(RFC 2068),对于理解 Apache 服务器的行为和运作机制有很大的帮助,同时当网页出现状况无法正常显示时,浏览器也会秀出这些错误讯息,了解这些错误讯息您就可以判断出问题的成因,因此在本文特地收录了一般常见的各种状态码的表列,当作补充教材请学员细心阅读。

 

新版 Apache 的特色

RedHat 9.0 版随附的 Apache 服务器是 2.0 版,相较于过去推出的 1.3 版有非常大幅度的改变,2.0 版的 Apache 不但支持多重处理器系统、支持 ipv6,也重新改写了函式库。新版 Apache 内的模块全部使用新的函式库来编译,使得所有模块都能支持 DSO 动态加载。(DSO 不算是新东西,过去一直不是 Apache 预设的做法,在前版 Apache 上想要使用 DSO 必须自己重新编译 Apache)。除此之外,新版 Apache 也支持一种称为过滤器(Filter)的全新模块,过去使用的旧模块则被称为掌舵者(Handler)模块。

说到 filter 我想经常使用 Linux 指令的人一定不陌生,当一次使用多个 shell 指令时,我们会使用管道符号来串接指令,而在 Linux 上管道符号就被称为 filter 符号,这意味着,这些模块可以像 shell 指令一样串接在一起,例如:ls | grep a | less,透过多个程序接力运作最后可以得出比较复杂有弹性的结果。过去使用的 Handler 模块,在处理完程序网页的内容后,会直接将处理结果推送回浏览器端;而 Filter 模块则在处理完后,将处理结果送回给 Apache core module,以便交给其它 Filter 模块进行后续处理。

事实上这个新的转变在 Microsoft IIS 上已经行之多年,它能带来最大的好处,就是网页服务器将有能力去处理混用多种 script 语言所设计出来的复杂网页,这在过去被认为用途不大,但随着 Web Computing 的风行,这已经成为不得不然的趋势,事实上 Apache 这样的转变,将有助于吸纳原来 IIS 及 JAVA 服务器的使用者,因为使用 ASP 或 JSP 的网页在 Apache 上执行已经不再只是梦想。

除了这些重大的改变以外,2.0 版在组态设定上有一些改变,这个改变是好是坏就见仁见智了,笔者认为预设的组态对于中文世界的使用者特别是中小学来说是相当不友善的,必须要经过蛮多修改才能使用,与过去 1.3 版相比改变还真大!下面就来说明组态档中新旧版本不同的地方:

conf.d

新版的 Apache 将各种模块会用到的组态档集中摆放在 /etc/httpd/conf.d 资料中,例如:mod_perl、mod_ssl、mod_php......等,因此在组态档中有这一行:

Include conf.d/*.conf

如果您的 Apache 是从旧版升级上来的,记得把这一行加到原来的组态档中。

IP 与端口号绑定

旧版 Apache 是使用 BindAddress 和 Port 来指定服务器提供服务的位置,新版的 Apache 则是使用 Listen 来宣告要倾听的端口,使用 ServerName 指定端口的方式来宣告是由哪个 DN 来提供该服务,好处是一台 Web 将可以同时服务多个 Port,甚至可以利用端口的不同来设计虚拟站台(过去有所谓 IP base、name base 虚拟站台,现在又多了 Port base,有关虚拟站台在后面章节说明),例如:

1.3 版 2.0 版

BindAddress 192.168. 1.2

Port 12000

ServerName wam.spps.tp.edu.tw Listen 12000

ServerName wam.spps.tp.edu.tw:12000

Multi-Processing Modules(MPMs)

MPMs 是一群特殊的模块,和其它模块不同它们是无法动态加载的(DSO), 它们必须在安装 Apache 时就决定要用哪一个,目前 MPMs 有三种 ,分别是:prefork、worker 和 perchild。像过去 1.3 版那样在 Apache 激活时,即预先将要提供服务的 StartServers 一并 fork 好,这种做法就称为 prefork,其它两种作业模式 RedHat 8.0 尚未提供,必须等新的 rpm 出来后才能安装使用。

三个模块分别采用不同的内存管理方式,其中 perchild 使用一个进程来提供服务,prefork 使用子程序来提供服务,而 worker 则兼用两种方法,它们的差异在于:执行绪可共享内存,并使用内存与其它进程沟通;子程序则独立使用内存,且利用档案与其它子程序沟通。前者效能较高,后者比较安全稳定。

三个模块被设计用来应付不同的效能需求,小型实验网站使用 perchild,它会同时激活 5 个 Server,每个 Server 最多执行 10 个进程,因此可同时应付 50 条联机,假设有开启 KeepAlive 功能,则最多可同时服务 5000 个要求,相当于 IIS 中的 1000 人以下存取量(在 IIS 中也可以进行效能调整,两者相互对照比较容易理解 MPMs 机制),预设的 prefork 是提供给中量级网站使用,最多可同时接受 3000 条联机,服务 30000 个要求,重量级网站则使用 worker,最多可同时接受 22500 条联机,约可服务 20 万个要求。

直接受此改变影响的包含:StartServers、MinSpraeServers、MaxSpareServers、MaxClients、MaxRequestsPerChild、NumServers、StartThreads、MinSpareThreads、MaxSpareThreads、MaxThreadsPerChild....等 ,默认值如下:

Server-Pool Size Regulation

Dynamic Shared Object(DSO)

新版 Apache 已经全面采用 DSO,过去 DSO 是编译 Apache 的选项之一,由于一直未被各版本 Linux 支持,因此如果想要使用必须自行下载原始文件编译,Apache 模块全面改写应该与全面采用 DSO 有很密切的关连。如前所述,由于 Apache 模块改以过滤器的方式运作,因此有许多模块被合并、分割、移除或改名,模块之间串接的顺序也变得更为重要,因此 Apache 允许模块可以指定自己的顺序,过去于组态档中提供的 AddModule 和 ClearModuleList 已经被取消不再使用,LoadModule 指令的顺序也被忽略。安装 mod_perl、mod_ssl、mod_php......等 RPM,也不用再去新增 LoadModule 设定,因为它们会自动被加载。另外,过去用来侦测哪些模块被加载的 HAVE_XXX 宏命令,也不再使用了,因为现在的模块是动态加载的。 <!-- 正文end -->

个人网页目录

中小学架设 Apache 主要是为了提供师生个人网页空间,可惜新版 Apache 预设将此功能关闭,必须手动自行修改才能启用:

UserDir disable改为 UserDir public_html(或其它想使用的名称)

预设语言与字符集

新版Apache装好后预设会使用荷兰语系和西欧字符集,这样就造成网页看到乱码,过去旧版本使用哪种语系是由浏览器来决定,新版改为由 Apache 和浏览器来协商,因此就算设计网页时有指定 Big-5 字符集,但浏览器却接受 Apache 的指派,而不再理会网页内容本身的设定,这对我们会造成很大的困扰,因此安装完 Apache,一定要记得改底下这些选项:

DefaultLanguage tw

............................(中间省略)........................

LanguagePriority tw en da nl et fr de el it ja kr no pl pt pt-br ltz ca es sv

............................(中间省略)........................

AddDefaultCharset Big5

如果这些都改好后仍然出现乱码,请检查 IE 网际网络选项中的进阶设定,是否有开启 UTF-8 功能,目前发现某些情形下使用该功能会导致网页乱码,将它移除后就正常了。

常用组态设定

分类 组态名称 默认值 使用说明

基本设定 ServerRoot /etc/httpd Apache 主程序所在目录,这是不需要修改的。

Timeout 300 用来设定联机等待时间,包含:联机完成后,浏览器应于多少时间内送出 GET 指令、浏览器送出 POST 或 PUT 指令后,应于多少时间内送出网页或窗体资料、服务器响应网页资料后,浏览器应于多少时间内回复收到。这个设定是以秒作为单位。

KeepAlive off 是否允许同一联机送出多个要求,通常一个要求会起始一条联机,这样虽会耗用较多的系统资源,但是响应比较迅速,当联机数太多系统资源不足时,可以考虑使用此功能。

MaxKeepAliveRequests 100 设定每条联机最多可接受多少要求,设得越高重启联机的机率就越低,对改善 KeepAlive 的效能很有帮助。

KeepAliveTimeout 15 当一条联机服务完一个要求后,会等待一段时间以便接受下一个要求,如果逾时就关闭联机,这个设定值与前面介绍的 Timeout 意义完全不同,可千万别搞混了。

Listen 80 和旧版的 Port 不同,它允许一个服务器可以同时倾听多个通讯端口,当端口号被设定少于 1024 的情形下,可以允许一般使用者将 Apache 安装在个人家目录下,成为个人专属服务器,像这种站台地下化的情形,系管人员应该要留意追查。

User apache 预设激活帐号,事实上 Apache 激活时还是以 root 身分进行准备工作,直到接受服务时才改用此帐号。为了安全考量,公开的 WEB 服务不应使用 root 身分来提供服务。

Group apache 预设激活群组。

ServerAdmin 无 请务必修改为该服务器的实际负责人信箱。

ServerName 无 用来提供服务的网址及端口,当省略不设定时,预设会使用 hostname 及 80 port。

HostnameLookups off 要不要对联机的客户端进行 DNS 查询验证,这是为了避免骇客用假 IP 攻击主机,但进行 DNS 查询会降低服务器效能,特别是当网站非常受欢迎的情况下,问题将会很严重

DefaultLanguage nl 预设语系

LanguagePriority 略 协商语系时的优先级

AddDefaultCharset iso-8859 预设字符集

AddType 略 用来新增 MIME 格式,当 Apache 将档案传输给 Client 时,必须告知 Client 该档案属于何种格式,这样浏览器才能正确显示或播放该档案,常用的格式都已预先设好,因此除非要作特殊应用否则不需设定(有些站台故意隐藏正确的附加档名,来限制某些档案的下载)

AddHandler 略 定义 Apache Handler 模块所对应的附加文件名,当附加档名吻合时,会交由该模块处理。目前支持的 Handler 模块,主要有 cgi-script(perl)、imap-file(imagemap)、type-map(多语系)......等,这些设定都不需修改。(有些书教大家在 AddHandler cgi-script .cgi 的后面加上 .pl,这是多余的,因为按照 perl 的惯例 .pl 档案会被引入到 .cgi 中,本身并不会单独执行,因此这样设是多余的)

AddOutputFilter 略 属于新版 Apache 支持的 Filter 模块,应该使用 AddOutputFilter 而非 AddHandler,例如过去属于 Handler 模块的 SSI,现在已经变成 Filter 模块,因此设定由

AddHandler server-parsed .shtml

改成

AddOutputFilter INCLUDES .shtml

AddPathInfo on 这个选项用来让 Filter 和 core 模块在传送剖析过的网页数据时,能使用 PATH_INFO 环境变量来传递 basedir,以免相对路径无法对应正确

特异功能 Action 略 这个功能的设计相信是绝大多数网站经营者的福音,它允许为某种 MIME 类型或某个 Handler 设定前导执行程序,透过这个功能将可以为站台中的每个档案进行权限检查和过滤,以防堵不肖业者砍站的行径,以前使用者从后门偷档的情形也将受到遏止,设定方式如下:

Action media/type /cgi-script/location

Action handler-name /cgi-script/location

网页目录设定 DocumentRoot /var/www/html 根网站的主目录

UserDir public_html 个人网页的主目录,建议改成 www 比较容易被学生接受

DirectoryIndex index.html 设定首页的名称,为了配合 FrontPage 教学,请修改成 index.html index.htm default.htm default.html

AccessFileName .htaccess .htaccess 是用来做目录存取控制的,如果您修改了它的档名,不要忘记一并修改底下的设定:



Order allow,deny

allow from all

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值