1#
大 中
小 发表于 2008-2-29 10:23 只看该作者
第3章 搭建Web服务器
3.1 Apache服务器概述
Apache,是一种开放源码的HTTP服务器,可以在大多数计算机操作系统中运行,由于其具有良好的跨平台性和安全性,被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩展,Perl/PHP等解释器可被编译到服务器中。
Apache起初由Illinois大学Urbana-Champaign的国家高级计算程序中心开发。此后,Apache被开放源代码团体的成员不断地发展和加强。Apache服务器拥有牢靠可信的美誉,已用在超过半数的因特网站中——特别是几乎所有最热门和访问量最大的网站。
开始,Apache只是Netscape网页服务器(现在是Sun ONE)之外的开放源代码选择。渐渐地,它开始在功能和速度等方面超越其他的基于UNIX的HTTP服务器。1996年4月以来,Apache一直是Internet上最流行的HTTP服务器,1999年5月它在57%的网页服务器上运行;2005年7月这个比例上升到了69%。
作者宣称因为这个名字好记才在最初选择它,但是流传最广的解释是(也是最显而易见的)这个名字来自这么一个事实:当Apache在1995年初开发的时候,它是由当时最流行的HTTP服务器NCSA HTTPd 1.3的代码修改而成的,因此是“一个修补的(a patchy)”服务器。然而在服务器官方网站的FAQ中是这么解释的:Apache这个名字是为了纪念名为Apache(印地语)的美洲印第安人土著的一支,众所周知他们拥有高超的作战策略和无穷的耐性。
Apache支持许多特性,大部分通过编译的模块实现。这些特性从服务器端的编程语言支持到身份认证方案。一些通用的语言接口支持Perl、Python、Tcl和PHP。流行的认证模块包括mod_access,mod_auth和mod_digest。其他的例子有SSL和TLS支持(mod_ssl)、proxy模块,很有用的URL重写(由mod_rewrite实现),定制日志文件(mod_log_config),以及过滤支持(mod_include和mod_ext_filter)。Apache日志可以通过网页浏览器使用免费的脚本AWStats或Visitors来进行分析。
Apache的2.x版本核心在Apache 1.x版本之上作出了重要的加强。这包括线程、更好地支持非UNIX平台(例如Windows)、新的Apache API及IPv6支持。
《PC Magazine》在2004年8月评出了近30年以来的10款最佳软件产品。他们其中或者是有过最辉煌的历史,或者是最具创意。其对Apache的评价是,第三名,Apache(阿帕奇,1995年推出),Apache目前已经演变成了“LAMP”,即Linux、Apache、MySQL和PHP的联合体。这是一个开放源代码软件项目,已经对微软的“.NET”战略构成严重威胁。尤其是Apache网络服务器,让用户充分体验到开发源码软件的稳定性、可靠性和可定制性。
Apple.com评价Apache时说:“Apache是服务器软件始终不断进化的产物,它免费但又是无价之宝。Apache是在资源开放运动中出现的绝对珍品,因为不属于个人专利而是对公共免费。一旦拥有这些源码,程序员能够自由完成所想——能在其他程序员接替工作时被赋予同样的权限来改变和修改自己的源代码。”
尽管不断有新的漏洞被发现,但由于其OpenSource的特点,漏洞总能被很快修补。因此总的来说,其安全性还是相当高的。
3.2 安装Apache服务器
首先,进入Apache源代码包存储目录:
[root@localhost root]# cd /usr/local/src
解开源代码包:
[root@localhost src]# tar xzvf httpd-2.0.59.tar.gz
进入解开的源代码树目录:
[root@localhost src]# cd httpd-2.0.59
进行configure编译前配置如下:
[root@localhost httpd-2.0.59]./configure \
"--prefix=/usr/local/apache2" \
"--mandir=/usr/share/man" \
"--enable-modules=most" \
"--enable-mods-shared=most"
编译Apache:
[root@localhost httpd-2.0.59]# make
安装Apache:
[root@localhost httpd-2.0.59]# make install
至此,Apache已经安装完毕。下面总结一下Apache的主要目录。
(1)程序及核心目录:/usr/local/apache2。
(2)默认网站根目录:/usr/local/apache2/htdocs。
(3)配置文件位置:/usr/local/apache2/conf/httpd.conf。
3.3 配置Apache服务器
Apache服务器的设置文件位于/usr/local/apache/conf/目录下,传统上使用3个配置文件httpd.conf、access.conf和srm.conf来配置Apache服务器的行为。
httpd.conf提供了最基本的服务器配置,是对守护程序httpd如何运行的技术描述;srm.conf是服务器的资源映射文件,告诉服务器各种文件的MIME类型,以及如何支持这些文件;access.conf用于配置服务器的访问权限,控制不同用户和计算机的访问限制。这三个配置文件控制着服务器的各个方面的特性,因此为了正常运行服务器便需要设置好这三个文件。
除了这三个配置文件之外,Apache还使用mime.types文件用于标志不同文件。对应的MIME类型,magic文件设置不同MIME类型文件的一些特殊标志,使得Apache服务器从文档后缀不能判断出文件的MIME类型时,能通过文件内容中的这些特殊标记来判断文档的MIME类型。
引用:bash-2.02$ ls -l /usr/local/apache/conf
total 100
-rw-r--r-- 1 root wheel 348 Apr 16 16:01 access.conf
-rw-r--r-- 1 root wheel 348 Feb 13 13:33 access.conf.default
-rw-r--r-- 1 root wheel 30331 May 26 08:55 httpd.conf
-rw-r--r-- 1 root wheel 29953 Feb 13 13:33 httpd.conf.default
-rw-r--r-- 1 root wheel 12441 Apr 19 15:42 magic
-rw-r--r-- 1 root wheel 12441 Feb 13 13:33 magic.default
-rw-r--r-- 1 root wheel 7334 Feb 13 13:33 mime.types
-rw-r--r-- 1 root wheel 383 May 13 17:01 srm.conf
-rw-r--r-- 1 root wheel 357 Feb 13 13:33 srm.conf.default
事实上当前版本的Apache将原来httpd.conf、srm.conf与access.conf中的所有配置参数均放在了一个配置文件httpd.conf中,只是为了与以前的版本兼容的原因(使用这三个设置文件的方式来源于NCSA-httpd),才使用三个配置文件。而提供的access.conf和srm.conf文件中没有具体的设置。
由于在新版本的Apache中,所有的设置都被放在了httpd.conf中,因此只需要调整这个文件中的设置。以下使用默认提供的httpd.conf为例,解释Apache服务器的各个设置选项。然而不必因为它提供设置的参数太多而烦恼,基本上这些参数都很明确,也可以不加改动运行Apache服务器。但如果需要调整Apache服务器的性能,以及增加对某种特性的支持,就需要了解这些设置参数的含义。
关于Apache服务器的性能,在Internet上存在很大的争议,基本上使用Apache的人几乎都不怀疑它的优秀性能。Apache也支撑了很多著名的高负载的网站,但是在商业机构的评测中,Apache往往得分不高。很多人指出,在这些评测中,商业Web服务器及其操作系统往往由其专业公司的工程师进行过性能调整,而Free的操作系统和Web服务器往往就使用其默认配置或仅仅做很小的更改。需要指出的是,除了操作系统的性能调整之外,Apache服务器本身的默认配置绝不是最优化和最高效的,而是要适应几乎所有种类操作系统、所有种类硬件下的设置,多平台的软件不可能为特定平台和特定硬件提供最优化的默认配置。因此要使用Apache的时候,性能调整是必不可少的。
在商业评测中忽略了另一个事实,评测时往往对不同种类的功能进行比较,如使用Apache的标准CGI的性能与ISAPI、NSAPI等服务器端API比较。事实上,Apache服务器与此可以比较的功能为modperl、FastCGI,与ASP类似的功能为PHP等,只不过由于Apache的开放模式,这些功能是由独立的开发组作为独立的模块来实现的。但是在评测中,测试人员没有加入相应的模块评测其性能。
3.3.1 HTTP守护进程的运行参数
httpd.conf中首先定义了一些httpd守护进程运行时需要的参数,来决定其运行方式和运行环境。
1.ServerType standalone ServerType定义服务器的启动方式,默认值为独立方式standalone,httpd服务器将由其本身启动,并驻留在主机中监视连接请求。在Linux下将在启动文件/etc/rc.d/rc.local/init.d/apache中自动启动Web服务器,这种方式是推荐设置。
启动Apache服务器的另一种方式是inet方式,使用超级服务器inetd监视连接请求并启动服务器。当需要使用inetd启动方式时,便需要更改为这个设置,并屏蔽/etc/rc.d/rc.local/init.d/ apache文件,以及更改/etc/inetd.conf并重起inetd,那么Apache就能从inetd中启动了。
两种方式的区别是:独立方式是由服务器自身管理自己的启动进程,这样在启动时能立即启动服务器的多个副本,每个副本都驻留在内存中,一有连接请求不需要生成子进程就可以立即进行处理,对于客户浏览器的请求反应更快,性能较高;而inetd方式要由inetd发现有连接请求后才去启动http服务器,由于inetd要监听太多的端口,因此反应较慢、效率较低,但节约了没有连接请求时Web服务器占用的资源。因此inetd方式只用于偶尔被访问并且不要求访问速度的服务器上。事实上inetd方式不适合http的突发和多连接的特性,因为一个页面可能包含多个图像,而每个图像都会引起一个连接请求,即使访问人数较少,但瞬间的连接请求并不少,这就受到inetd性能的限制,甚至会影响由inetd启动的其他服务器程序。
2.ServerRoot "/usr/local" ServerRoot用于指定守护进程httpd的运行目录,httpd在启动之后将自动将进程的当前目录改变为这个目录,因此如果设置文件中指定的文件或目录是相对路径,那么真实路径就位于ServerRoot定义的路径之下。
由于httpd会经常进行并发的文件操作,就需要使用加锁的方式来保证文件操作不冲突。由于NFS文件系统在文件加锁方面能力有限,因此这个目录应该是本地磁盘文件系统,而不应该使用NFS文件系统。
3.#LockFile /var/run/httpd.lock LockFile参数指定了httpd守护进程的加锁文件,一般不需要设置这个参数,Apache服务器将自动在ServerRoot下面的路径中进行操作。但如果ServerRoot为NFS文件系统,便需要使用这个参数指定本地文件系统中的路径。
4.PidFile /var/run/httpd.pid PidFile指定的文件将记录httpd守护进程的进程号,由于httpd能自动复制其自身,因此系统中有多个httpd进程,但只有一个进程为最初启动的进程,它为其他进程的父进程,对这个进程发送信号将影响所有的httpd进程。PidFILE定义的文件中就记录httpd父进程的进程号。
5.ScoreBoardFile /var/run/httpd.scoreboard httpd使用ScoreBoardFile来维护进程的内部数据,因此通常不需要改变这个参数,除非管理员想在一台计算机上运行几个Apache服务器,这时每个Apache服务器都需要独立的设置文件httpd.conf,并使用不同的ScoreBoardFile。
6.#ResourceConfig conf/srm.conf和#AccessConfig conf/access.conf 参数ResourceConfig和AccessConfig用于和使用srm.conf和access.conf设置文件的老版本Apache兼容。如果没有兼容的需要,可以将对应的设置文件指定为/dev/null,这将表示不存在其他设置文件,而仅使用httpd.conf一个文件来保存所有的设置选项。
7.Timeout 300Timeout定义客户程序和服务器连接的超时间隔,超过这个时间间隔(秒)后服务器将断开与客户机的连接。
8.KeepAlive On 在HTTP 1.0中,一次连接只能做传输一次HTTP请求,而KeepAlive参数用于支持HTTP 1.1版本的一次连接、多次传输功能,这样就可以在一次连接中传递多个HTTP请求。虽然只有较新的浏览器才支持这个功能,但还是打开使用这个选项。
9.MaxKeepAliveRequests 100 MaxKeepAliveRequests为一次连接可以进行的HTTP请求的最大请求次数。将其值设为“0”将支持在一次连接内进行无限次的传输请求。事实上没有客户程序在一次连接中请求太多的页面,通常达不到这个上限就完成连接了。
10.KeepAliveTimeout 15 KeepAliveTimeout测试一次连接中的多次请求传输之间的时间,如果服务器已经完成了一次请求,但一直没有接收到客户程序的下一次请求,在间隔超过了这个参数设置的值之后,服务器就断开连接。
11.MinSpareServers 5MaxSpareServers 10在使用子进程处理HTTP请求的Web服务器上,由于要首先生成子进程才能处理客户的请求,因此反应时间就有一点延迟。但是,Apache服务器使用了一个特殊技术来摆脱这个问题,这就是预先生成多个空余的子进程驻留在系统中,一旦有请求出现,就立即使用这些空余的子进程进行处理,这样就不存在生成子进程造成的延迟了。在运行中随着客户请求的增多,启动的子进程会随之增多,但这些服务器副本在处理完一次HTTP请求之后并不立即退出,而是停留在计算机中等待下次请求。但是空余的子进程副本不能光增加不减少,太多的空余子进程没有处理任务,也占用服务器的处理能力,因此也要限制空余副本的数量,使其保持一个合适的数量,使得既能及时回应客户请求,又能减少不必要的进程数量。
因此就可以使用参数MinSpareServers来设置最少的空余子进程数量,以及使用参数MaxSpareServers来限制最多的空闲子进程数量,多余的服务器进程副本就会退出。根据服务器的实际情况来进行设置,如果服务器性能较高,并且也被频繁访问,就应该增大这两个参数的设置。对于高负载的专业网站,这两个值应该大致相同,并且等同于系统支持的最多服务器副本数量,这样也减少不必要的副本退出。
12.StartServers 5StartServers参数就是用来设置httpd启动时启动的子进程副本数量,这个参数与上面定义的MinSpareServers和MaxSpareServers参数相关,都是用于启动空闲子进程以提高服务器的反应速度的。这个参数应该设置为前两个值之间的一个数值,小于MinSpareServers或大于MaxSpareServers都没有意义。
13.MaxClients 150在另一方面,服务器的能力毕竟是有限的,不可能同时处理无限多的连接请求,因此参数MaxClients就用于规定服务器支持的最多并发访问的客户数,如果这个值设置得过大,系统在繁忙时不得不在过多的进程之间进行切换来为太多的客户进行服务,这样对每个客户的反应就会减慢,并降低了整体的效率。如果这个值设置的较小,那么系统繁忙时就会拒绝一些客户的连接请求。当服务器性能较高时,就可以适当增加这个值的设置。对于专业网站,应该使用提高服务器效率的策略,因此这个参数不能超过硬件本身的限制,如果频繁出现拒绝访问现象,就说明需要升级服务器硬件了。对于非专业网站,不太在意对客户浏览器的反应速度,或者认为反应速度较慢也比拒绝连接好,也可以略微超过硬件条件来设置这个参数。
MaxClients参数限制了MinSpareServers和MaxSpareServers的设置,它们不应该大于这个参数的设置。
14.MaxRequestsPerChild 30使用子进程的方式提供服务的Web服务,常用的方式是一个子进程为一次连接服务,这样造成的问题就是每次连接都需要生成、退出子进程的系统操作,使得这些额外的处理过程占据了计算机的大量处理能力。因此,最好的方式是一个子进程可以为多次连接请求服务,这样就不需要这些生成、退出进程的系统消耗。Apache就采用了这样的方式,一次连接结束后,子进程并不退出,而是停留在系统中等待下一次服务请求,这样就极大地提高了性能。
但由于在处理过程中子进程要不断地申请和释放内存,次数多了就会造成一些内存垃圾,影响系统的稳定性,并且影响系统资源的有效利用。因此在一个副本处理过一定次数的请求之后,就可以让这个子进程副本退出,再从原始的httpd进程中重新复制一个干净的副本,这样就能提高系统的稳定性。这样,每个子进程处理服务请求次数由MaxRequestPerChild定义。默认的设置值为30,这个值对于具备高稳定性特点的Linux系统来讲是过于保守的设置,可以设置为1000甚至更高,设置为0则支持每个副本进行无限次的服务处理。
Listen参数可以指定服务器除了监视标准的80端口之外,还监视其他端口的HTTP请求。由于Linux系统可以同时拥有多个IP地址,因此也可以指定服务器只听取对某个BindAddress< /B>的IP地址的HTTP请求。如果没有配置这一项,则服务器会回应对所有IP的请求。
即使使用了BindAddress参数,使得服务器只回应对一个IP地址的请求,但是通过使用扩展的Listen参数,仍然可以让HTTP守护进程回应对其他IP地址的请求。此时Listen参数的用法与上面的第二个例子相同。这种比较复杂的用法主要用于设置虚拟主机。此后可以用VirtualHost参数定义对不同IP的虚拟主机,然而这种用法是较早的HTTP 1.0标准中设置虚拟主机的方法,每针对一个虚拟主机就需要一个IP地址,实际上用处并不大。在HTTP 1.1中,增加了对单IP地址多域名的虚拟主机的支持,使得虚拟主机的设置具备更大的意义。
3.3.2 Apache服务器的模块化
Linux下的默认Apache服务器支持的模块如下:
引用:LoadModule mime_magic_module libexec/apache/mod_mime_magic.so
LoadModule info_module libexec/apache/mod_info.so
LoadModule speling_module libexec/apache/mod_speling.so
LoadModule proxy_module libexec/apache/libproxy.so
LoadModule rewrite_module libexec/apache/mod_rewrite.so
LoadModule anon_auth_module libexec/apache/mod_auth_anon.so
LoadModule db_auth_module libexec/apache/mod_auth_db.so
LoadModule digest_module libexec/apache/mod_digest.so
LoadModule cern_meta_module libexec/apache/mod_cern_meta.so
LoadModule expires_module libexec/apache/mod_expires.so
LoadModule headers_module libexec/apache/mod_headers.so
LoadModule usertrack_module libexec/apache/mod_usertrack.so
LoadModule unique_id_module libexec/apache/mod_unique_id.so
ClearModuleList
AddModule mod_env.c
AddModule mod_log_config.c
AddModule mod_mime_magic.c
AddModule mod_mime.c
AddModule mod_negotiation.c
AddModule mod_status.c
AddModule mod_info.c
AddModule mod_include.c
AddModule mod_autoindex.c
AddModule mod_dir.c
AddModule mod_cgi.c
AddModule mod_asis.c
AddModule mod_imap.c
AddModule mod_actions.c
AddModule mod_speling.c
AddModule mod_userdir.c
AddModule mod_proxy.c
AddModule mod_alias.c
AddModule mod_rewrite.c
AddModule mod_access.c
AddModule mod_auth.c
AddModule mod_auth_anon.c
AddModule mod_auth_db.c
AddModule mod_digest.c
AddModule mod_cern_meta.c
AddModule mod_expires.c
AddModule mod_headers.c
AddModule mod_usertrack.c
AddModule mod_unique_id.c
AddModule mod_so.c
AddModule mod_setenvif.c
Apache服务器的一个重要特性就是其模块化的结构,这不但表现为其能在编译时通过新的模块加入新的功能,还表现为其模块可以动态加载入http服务程序中,而不必载入不需要的模块。使用Apache的动态加载模块只需要设置好Load Module和AddModule参数就可以了,这种特性就是Apache的DSO(Dynamic Shared Object)特性,然而要想充分使用DSO特性仍然不是一件简单的事情,不适当地改动这里的设置就可能造成服务器不能正常启动。因此如果不是要增加或减少服务器提供的功能,就不要改动这里的设置。
上面这些列表就显示了Linux下的默认Apache服务器支持的模块,事实上很多模块是没有必要的,不必要模块不会被载入内存。模块可以静态连接到Apache服务器内部,也可以动态加载,将Apache的特性都编译成动态可加载模块是该Port的做法,而不是Apache的默认做法,这样就以牺牲很小的性能的同时,带来极大的灵活性。
因而动态可加载的能力还是对性能有轻微的影响,因此可以重新编译Apache,将自己所需要的功能编译进Apache服务器内部,可以让系统显得更为干净,效率也有轻微的提高。通常仅仅为了这一个目的就重新编译Apache是没有必要的,如果需要增加其他特性而重新编译Apache,不妨在增加其他模块的同时将所有的模块都静态连接入Apache服务器。有的使用者更喜欢动态加载模块,那么也不妨全部都使用动态加载模块。
这些模块都被放置到/usr/local/apache/libexec/目录下,每个模块对应Apache服务器的一个特性。详细解释每个模块的功能需要相当多的篇幅,其中比较重要的特性将在后面相应的地方中进行解释,而具体每个模块的功能及用法就需要查看Apache的文档。
Apache服务器可以通过特殊的HTTP请求,来报告自身的运行状态,打开ExtendedStatus参数可以让服务器报告更全面的运行状态信息。
3.3.3 虚拟主机的设置
Apache服务器需要各种设置定义自己使用各种参数以提供Web服务。对于使用虚拟主机的情况,除了在虚拟主机的定义项中覆盖的设置之外(有的设置必须重新定义),下面的设置也是虚拟主机的默认设置。
1.Port 80
Port定义了Standalone模式下httpd守护进程使用的端口,标准端口是80。这个选项只对于以独立方式启动的服务器才有效,对于以inetd方式启动的服务器则在inetd.conf中定义使用哪个端口。
在UNIX下使用80端口需要root权限,一些管理员为了安全的原因,认为httpd服务器不可能没有安全漏洞,因而更愿意使用普通用户的权限来启动服务器,这样就不能使用80端口及其他小于1024的端口,而必须使用大于1024的端口来启动httpd,一般情况下8000或8080也是常用的端口。而Apache httpd服务器本身可以在以root权限打开80端口后再改变为普通用户身份进行运行,这样就减少了危险性,因而就不需要考虑这个安全问题。但是如果普通用户也想安装配置自己的Web服务器,那么就不得不使用大于1024的端口。
2.User nobody和Group nogroupUser和Group配置是Apache的安全保证,Apache在打开端口之后,就将其本身设置为这两个选项设置的用户和组权限进行运行,这样降低了服务器的危险性。这个选项也只用于Standalone模式、inetd模式在inetd.conf中指定运行Apache的用户。由于服务器必须执行改变身份的setuid()操作,因此初始进程应该具备root权限,如果是使用非root用户来启动Aapche,这个配置就不会发挥作用。
默认设置为nobody和nogroup,这个用户和组在系统中不拥有文件,保证了服务器本身和由它启动的CGI进程没有权限更改文件系统。在某些情况下,如为了运行CGI与UNIX交互,也需要让服务器来访问服务器上的文件,如果仍然使用nobody和nogroup,那么系统中将会出现属于nobody的文件,这对于系统安全是不利的,因为其他程序也会以nobody和nogroup的权限执行某些操作,有可能访问这些nobody拥有的文件,造成安全问题。一般情况下,要为Web服务设定一个特定的用户和组,同时在这里更改用户和组设置。
3.ServerAdmin you@your.address配置文件中应该改变的也许只有ServerAdmin,这一项用于配置Web服务器的管理员的E-mail地址,将在HTTP服务出现错误的条件下返回给浏览器,以便让Web使用者和管理员联系,报告错误。习惯上使用服务器上的webmaster作为Web服务器的管理员,通过邮件服务器的别名机制,将发送到webmaster的电子邮件发送给真正的Web管理员。
4.#ServerName new.host.name默认情况下,并不需要指定ServerName参数,服务器将自动通过名字解析过程来获得自己的名字,但如果服务器的名字解析有问题(通常为反向解析不正确),或者没有正式的DNS名字,也可以在这里指定IP地址。当ServerName设置不正确的时候,服务器不能正常启动。
通常一个Web服务器可以具有多个名字,客户浏览器可以使用所有这些名字或IP地址来访问这台服务器,但在没有定义虚拟主机的情况下,服务器总是以自己的正式名字回应浏览器。ServerName定义了Web服务器自己承认的正式名字,如一台服务器名字(在DNS中定义了A类型)为exmaple.org.cn,同时为了方便记忆还定义了一个别名(CNAME记录)www.exmaple. org.cn,那么Apache自动解析得到的名字就为example.org.cn,这样不管客户浏览器使用哪个名字发送请求,服务器总是告诉客户程序自己为example.org.cn。虽然一般不会造成什么问题,但是考虑到某一天服务器可能迁移到其他计算机上,而只想通过更改DNS中的www别名配置就完成迁移任务,所以不想让客户在其书签中使用Linux记录下这个服务器的地址,就必须使用ServerName来重新指定服务器的正式名字。
5.DocumentRoot "/www/"DocumentRoot定义服务器对外发布的超文本文档存放的路径,客户程序请求的URL就被映射为这个目录下的网页文件。这个目录下的子目录,以及使用符号连接指出的文件和目录都能被浏览器访问,只是要在URL上使用同样的相对目录名。
注意,符号连接虽然逻辑上位于根文档目录之下,但实际上可以位于计算机上的任意目录中,因此可以使客户程序能访问那些根文档目录之外的目录,这在增加了灵活性的同时减少了安全性。Apache在目录的访问控制中提供了FollowSymLinks选项来打开或关闭支持符号连接的特性。
6.Options FollowSymLinks AllowOverride None
Apache服务器可以针对目录进行文档的访问控制,然而访问控制可以通过两种方式来实现,一个是在设置文件httpd.conf(或access.conf)中针对每个目录进行设置,另一个方法是在每个目录下设置访问控制文件,通常访问控制文件名字为.htaccess。虽然使用这两个方式都能用于控制浏览器的访问,但是使用配置文件的方法要求每次改动后重新启动httpd守护进程,比较不灵活。因此,使用配置文件的方法主要用于配置服务器系统的整体安全控制策略,而使用每个目录下的.htaccess文件设置具体目录的访问控制。
Directory语句是用来定义目录的访问限制的,这里可以看出它的标准语法,为一个目录定义访问限制。本例的这个设置是针对系统的根目录进行的,设置了允许符号连接的选项FollowSymLinks,以及使用AllowOverride None表示不允许这个目录下的访问控制文件来改变这里进行的配置,这也意味着不用查看这个目录下的相应访问控制文件。
由于Apache对一个目录的访问控制设置是能够被下一级目录继承的,因此对根目录的设置将影响到它的下级目录。注意由于AllowOverride None的设置,使得Apache服务器不需要查看根目录下的访问控制文件,也不需要查看以下各级目录下的访问控制文件,直至httpd.conf(或access.conf)中为某个目录指定了允许Alloworride,即允许查看访问控制文件。由于Apache对目录访问控制是采用继承方式,如果从根目录就允许查看访问控制文件,那么Apache就必须一级一级地查看访问控制文件,对系统性能会造成影响。而默认关闭了根目录的这个特性,就使得Apache从httpd.conf中具体指定的目录向下搜寻,减少了搜寻的级数,增加了系统性能。因此对于系统根目录设置AllowOverride None不但对于系统安全有帮助,也有益于系统性能。
7.Options Indexes FollowSymLinks AllowOverride None
Order allow,deny
Allow from all
这里定义的是系统对外发布文档的目录的访问设置,设置不同的 AllowOverride选项,以定义配置文件中的目录设置和用户目录下的安全控制文件的关系,而Options选项用于定义该目录的特性。
配置文件和每个目录下的访问控制文件都可以设置访问限制,设置文件是由管理员设置的,而每个目录下的访问控制文件是由目录的属主设置的,因此管理员可以规定目录的属主是否能覆盖系统在设置文件中的设置,这就需要使用AllowOverride参数进行设置,通常可以设置的值如下。
(1)AllowOverride的设置:对每个目录访问控制文件作用的影响。
(2)All默认值:使访问控制文件可以覆盖系统配置。
(3)None:服务器忽略访问控制文件的设置。
(4)Options:允许访问控制文件中可以使用Options参数定义目录的选项。
(5)FileInfo:允许访问控制文件中可以使用AddType等参数设置。
(6)AuthConfig:允许访问控制文件使用AuthName、AuthType等针对每个用户的认证机制,这使目录属主能使用口令和用户名来保护目录Limit,允许对访问目录的客户机的IP地址和名字进行限制。
每个目录具备一定属性,可以使用Options控制这个目录下的一些访问特性设置,以下为常用的特性选项。
(1)Options设置:服务器特性设置。
(2)All:所有的目录特性都有效,这是默认状态。
(3)None:所有的目录特性都无效。
(4)FollowSymLinks:允许使用符号连接,这将使浏览器有可能访问文档根目录(DocumentRoot)之外的文档。
(5)SymLinksIfOwnerMatch:只有符号连接的目的与符号连接本身为同一用户所拥有时,才允许访问,这个设置将增加一些安全性。
(6)ExecCGI:允许这个目录下可以执行CGI程序。
(7)Indexes:允许浏览器可以生成这个目录下所有文件的索引,使得在这个目录下没有index.html(或其他索引文件)时,能向浏览器发送这个目录下的文件列表。
此外,本例中还使用了Order、Allow、Deny等参数,这是Limit语句中用来根据浏览器的域名和IP地址来控制访问的一种方式。其中Order定义处理Allow和Deny的顺序,而Allow、Deny则针对名字或IP进行访问控制设置,本例使用allowfrom all,表示允许所有的客户机访问这个目录,而不进行任何限制。
8.UserDir public_html 当在一台Linux上运行Apache服务器时,这台计算机上的所有用户都可以有自己的网页路径,如http://example.org.cn/~user,使用波浪符号加上用户名就可以映射到用户自己的网页目录上。映射目录为用户个人主目录下的一个子目录,其名字就用UseDir参数进行定义,默认为public_html。如果不想为正式的用户提供网页服务,使用DISABLED作UserDir的参数即可。
9.# AllowOverride FileInfo AuthConfig Limit # Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
# Order allow,deny
# Allow from all
# Order deny,allow
# Deny from all
这里可以看到Directory的另一个用法,即可以通过简单的模式匹配方法,针对分布在不同目录下的子目录定义访问控制权限。这样设置就需要Apache服务器对每个路径进行额外的处理,因此就会降低服务器的性能,所以默认情况并没有打开这种访问限制。
这里可以看到另外一个语句Limit,Limit语句就是用来针对具体的请求方法来设定访问控制的,其中可以使用GET、POST等各种服务器支持的请求方法做Limit的参数,来设定对不同请求方法的访问限制。一般可以打开对GET、POST、HEAD三种请求方法,而屏蔽其他的请求方法,以增加安全性。Limit语句中,可以用Order、Allow、Deny,Allow和Deny中可以使用匹配的方法针对域名和IP进行限制,只是对于域名是从后向前匹配,对于IP地址则从前向后匹配。
10.DirectoryIndex index.html 很多情况下,URL中并没有指定文档的名字,而只是给出了一个目录名。那么Apache服务器就自动返回这个目录下由DirectoryIndex定义的文件,当然可以指定多个文件名字,系统会在这个目录下顺序搜索。当所有由DirectoryIndex指定的文件都不存在时,Apache服务器可以根据系统设置,生成这个目录下的所有文件列表,提供用户选择。此时该目录的访问控制选项中的Indexes选项(Options Indexes)必须打开,以使得服务器能够生成目录列表,否则Apache将拒绝访问。
11.AccessFileName .htaccess AccessFileName定义每个目录下的访问控制文件的文件名,默认为.htaccess,可以通过更改这个文件,来改变不同目录的访问控制限制。
12.Order allow,deny Deny from all
除了可以针对目录进行访问控制之外,还可以根据文件来设置访问控制,这就是File语句的任务。使用File 语句,不管文件处于哪个目录,只要名字匹配,就必须接受相应的访问控制。这个语句对于系统安全比较重要,例如上例将屏蔽所有的使用者不能访问.htaccess文件,这样就避免.htaccess中的关键安全信息不至于被客户获取。
13.#CacheNegotiatedDocs 默认情况下如果代理服务器和Apache服务器协商是否缓存其网页,Apache给予否定的回答,不希望自己的网页被代理服务器缓存。然而这样就不能有效地利用代理服务器的优势,因此可以设置CacheNegotiatieDocs选项,使得代理服务器可以对网页进行缓存。然而即使不设置这个选项,有的代理服务器(或通过调整设置)也能对网页进行缓存。
14.UseCanonicalName On 打开这个UseCanonicalName是Web服务器的标准做法,因为客户发送的大部分请求都是对本服务器的引用,这样服务器就能使用ServerName和Port选项的设置内容构建完整的URL,并回应客户,使浏览器能得到规范的URL。如果将这个参数设置为Off,那么Apache将使用从客户请求中获得服务器的名字和端口值(支持HTTP 1.1的客户的请求中将会有这些信息)重新构建URL。
15.TypesConfig /usr/local/apache/etc/mime.types TypeConfig用于设置保存有不同的MIME类型数据的文件名,在Linux下默认设置为/usr/local/apache/etc/mime.types。
16.DefaultType text/plain 如果Web服务器不能决定一个文档的默认类型,这通常表示文档使用了非标准的后缀,那么服务器就使用DefaultType定义的MIME类型将文档发送给客户浏览器。这里的设置为text/plain,这样设置的问题是,如果服务器不能判断出文档的MIME,那么大部分情况下这个文档为一个二进制文档,但使用text/plain格式发送回去,浏览器将在内部打开它而不会提示保存。因此建议将这个设置更改为application/octet-stream,这样浏览器将提示用户进行保存。
17.MIMEMagicFile /usr/local/apache/etc/magic 除了从文件的后缀出发来判断文件的MIME类型之外,Apache还可以进一步分析文件的一些特征,来判断文件的真实MIME类型。这个功能是由mod_mime_magic模块实现的,它需要一个记录各种MIME类型特征的文件,以进行分析判断。上面的设置是一个条件语句,如果载入了这个模块,就必须指定相应的标志文件magic的位置。
通常连接时,服务器仅仅可以得到客户机的IP地址,如果要想获得客户机的主机名,以进行日志记录和提供给CGI程序使用,就需要使用这个HostnameLookups选项,将其设置为On,打开DNS反查功能。但是这将使服务器对每次客户请求都进行DNS查询,增加了系统开销,使得反应变慢,因此默认设置为使用“Off”关闭此选项。关闭选项之后,服务器就不会获得客户机的主机名,而只能使用IP地址来记录客户。
18.ErrorLog /var/log/httpd-error.log LogLevel warn
引用:LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent} "" combined
LogFormat "%h %l %u %t "%r" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
#CustomLog /var/log/httpd-access.log common
#CustomLog /var/log/httpd-referer.log referer
#CustomLog /var/log/httpd-agent.log agent
CustomLog /var/log/httpd-access.log combined
这里定义了系统日志的形式,对于服务器错误记录,由ErrorLog、LogLevel来定义不同的错误日志文件及其记录内容。
对于系统的访问日志,默认使用CustomLog参数定义日志的位置,默认使用 combined参数指定将所有的访问日志放在一个文件中,然而也可以将不同种类的访问日志放在不同的日志记录文件中,这是通过在CustomLog中指定不同的记录类型来完成的。common表示普通的对单页面请求访问记录;referer表示每个页面的引用记录,可以看出一个页面中包含的请求数;agent表示对客户机的类型记录,显然可以将现有的combined定义的设置行注释掉,并使用common、referer和agent作为CustomLog的参数,来为不同种类的日志分别指定日志记录文件。
LogFormat是用于定义不同类型的日志进行记录时使用的格式,这里使用了以“%”开头的宏定义,以记录不同的内容。
如果这些参数指定的文件使用的是相对路径,那么就是相对于ServerRoot的路径。
19.ServerSignature On 一些情况下,例如当客户请求的网页并不存在时,服务器将产生错误文档,默认情况下由于打开了ServerSignature选项,错误文档的最后一行将包含服务器的名字、Apache的版本等信息。有的管理员更倾向于不对外显示这些信息,就可以将这个参数设置为“Off”,或者设置为E-mail,最后一行将替换为对ServerAdmin的E-mail提示。
20.Alias /icons/ "/www/icons/" Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
Alias参数用于将URL与服务器文件系统中的真实位置进行直接映射,一般的文档将在DocumentRoot中进行查询,然而使用Alias定义的路径将直接映射到相应目录下,而不再到DocumentRoot下面进行查询。因此Alias可以用来映射一些公用文件的路径,例如保存了各种常用图标的icons路径。这样使得除了使用符号连接之外,文档根目录(DocumentRoot)外的目录也可以通过使用了Alias映射,提供给浏览器访问。
定义好映射的路径之后,应该需要使用Directory语句设置访问限制。
21.ScriptAlias /cgi-bin/ "/www/cgi-bin/" AllowOverride None
Options None
Order allow,deny
Allow from all
ScriptAlias也是用于URL路径的映射,但与Alias不同的是,ScriptAlias是用于映射CGI程序的路径,这个路径下的文件都被定义为CGI程序,通过执行它们来获得结果,而非由服务器直接返回其内容。默认情况下CGI程序使用cgi-bin目录作为虚拟路径。
22.# Redirect old-URI new-URL Redirect参数是用来重写URL的,当浏览器访问服务器上一个已经不存在的资源的时候,服务器返回给浏览器新的URL,告诉浏览器从该URL中获取资源。这主要用于原来存在于服务器上的文档,改变了位置之后,而又希望能使用原URL访问到,以保持与以前的URL兼容。
23.IndexOptions FancyIndexing AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
AddIconByType (TXT,/icons/text.gif) text/*
AddIconByType (IMG,/icons/image2.gif) image/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*
AddIcon /icons/binary.gif .bin .exe
AddIcon /icons/binhex.gif .hqx
AddIcon /icons/tar.gif .tar
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
AddIcon /icons/a.gif .ps .ai .eps
AddIcon /icons/layout.gif .html .shtml .htm .pdf
AddIcon /icons/text.gif .txt
AddIcon /icons/c.gif .c
AddIcon /icons/p.gif .pl .py
AddIcon /icons/f.gif .for
AddIcon /icons/dvi.gif .dvi
AddIcon /icons/uuencoded.gif .uu
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
AddIcon /icons/tex.gif .tex
AddIcon /icons/bomb.gif core
AddIcon /icons/back.gif ..
AddIcon /icons/hand.right.gif README
AddIcon /icons/folder.gif ^^DIRECTORY^^
AddIcon /icons/blank.gif ^^BLANKICON^^
DefaultIcon /icons/unknown.gif
#AddDescription "GZIP compressed document" .gz
#AddDescription "tar archive" .tar
#AddDescription "GZIP compressed tar archive" .tgz
ReadmeName README
HeaderName HEADER
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
当一个HTTP请求的URL为一个目录的时候,服务器返回这个目录中的索引文件。但如果一个目录中不存在默认的索引文件,并且该服务器又许可显示目录文件列表的时候,就会显示出这个目录中的文件列表,为了使得这个文件列表能具有可理解性,而不仅仅是一个简单的列表,就需要前面的这些设置参数。
本章总结
本章介绍了Apache服务器的发展和特点,详细讲解了Apache服务器的安装过程及配置文件。Apache服务是世界上最流行的Web服务器端软件之一,掌握Apache服务器的安装和配置对以后深入学习是非常必要的。
附件: 您所在的用户组无法下载或查看附件
技术不分高低,只分了解先后!PHPChina是个互助友爱的大家庭,谁都可以参与!
|