第2章

    Apache安装和使用

    Apache服务器拥有牢靠可信的美誉,已用于大多数Web服务中,大多数知名网站都采用了它。本章详细讲解了Apache的安装和使用,从编译与安装开始,到Apache的主文件配置、访问控制、虚拟主机、认证授权和访问控制等设置都做了详细的介绍,读者可以边学边做,这样学起来比较容易上手。本章参考了Apache官方手册部分内容。

    第1节 Apache1.3与Apache2.0

    开源Web服务器Apache版本现在已更新到2.0。作为多年来Web服务器的首选,Apache和Web同步发展,对现代网络的发展作出巨大贡献。早在1.X版本时,Apache已经足够稳定和强大,但仍然存在着一些功能上的不足。现在,一个解决了以前Apache版本的各种问题,适应今天各种Web主机的多样性需求的全新版本已经出现。新版本支持多种平台,通过APR(Apache Portable Runtime),Apache将各种功能的实现从具体的服务器环境抽象了出来,从而减少了为使Apache在不同平台上运行所需要进行的工作。现在Apache可以运行在几乎所有的UNIX/Linux平台,以及各种Windows平台,Netware和OS/2。

    新版本的编译和安装也简单了许多。Apache使用了标准GNU自动设置工具,对于Windows平台,它提供图形化的安装界面。在设置方面,新版本去掉了一些指示符号,不过大部分工作仍然是基于一个文件的配置文件。这对于习惯图形界面设置工具的用户一开始或许不适应。设置工具与核心的发布包是分离的,一些类似ApacheConf可以免费或以很低的价格获取,利用这些工具可以很方便的对Apache进行各种设置。从运行方面看,新版本比以前版本更强大,更具扩展性。一个多线程/多进程的混合模块使它可以充分利用各种规模的主机性能,这正是Apache1.3所缺乏的。新版本以插件的方式提供了对一些特殊平台和几个通用模块的支持。对IPv6的官方支持已经为互联网的升级做好了准备,对HTTP1.1的支持提高了代理服务器的性能。

    下表例示了Apache 1.3版本和2.0版本的主要区别:

    第2章Apache安装和使用 - 图1

    第2节 Apache2.0模块介绍

    1.核心的增强

    1)Unix线程

    在支持POSIX线程的Unix系统上,现在Apache能在混合多进程、多线程模式下运行,使许多(但不是全部的)配置的可扩缩性得到改善。

    2)新的编译系统

    重写了旧的编译系统,现在是基于autoconf和libtool的,使得Apache的配置系统与其他软件包更加相似。

    3)多协议支持

    Apache已经拥有了能够支持多协议的底层构造。mod_echo就是一个例子。

    4)对非Unix平台更好的支持

    Apache 2.0在诸如BeOS,OS/2和Windows等非Unix/Linux平台上有了更快的速度和稳定性。随着平台特定的multi-processing modules (MPMs)和Apache Portable Runtime (APR)的引入,Apache在这些平台上的指令由它们本地的API指令实现。避免了以往使用POSIX模拟层造成的bug和低性能。

    5)新的Apache API

    2.0中模块的API有了重大改变。很多1.3中模块排序、模块优先级的问题已经得到解决。2.0自动处理了很多这样的问题,模块排序现在用per-hook的方法进行,从而拥有了更强的灵活性。同时,增加了新的调用以提高模块的性能,而无需修改Apache服务器核心。

    6)IPv6支持

    在所有能够由Apache Portable Runtime库提供IPv6支持的系统上,Apache默认获得IPv6侦听套接字。另外,Listen、NameVirtualHost和VirtualHost指令支持IPv6的数字地址串。

    7)过滤

    Apache的模块现在可以写成过滤器的形式,当内容流经它到服务器或从服务器到达的时候进行处理。比如,可以用mod_include中的INCLUDES过滤器将CGI脚本的输出解析为服务器端包含指令。mod_ext_filter允许外部程序充当过滤器的角色,就像用CGI程序做处理器一样。

    8)多语种错误回馈

    返回给浏览器的错误信息现在已经用SSI文档实现了多语种化。管理员可以利用此功能进行定制以达到观感的一致。

    9)简化了的配置

    很多易混淆的配置项已经进行了简化。经常产生混淆的Port和BindAddress配置项已经取消了;用于绑定IP地址的只有Listen指令;ServerName指令中指定的服务器名和端口仅用于重定向和虚拟主机的识别。

    10)本地Windows NT Unicode支持

    Apache 2.0在Windows NT上的文件名全部使用utf-8编码。这个操作直接转换成底层的Unicode文件系统,由此为所有以Windows NT(包括Windows 2000和XP)为基础的安装提供了多语言支持。这一支持目前尚未涵盖Windows 95,98or ME系统,因为它们仍使用机器本地的代码页进行文件系统的操作。

    11)正则表达式库更新

    Apache 2.0包含了兼容Perl的正则表达式库(PCRE)。所有的正则表达式现在都使用了更为强大的Perl 5的语法。

    2.Apache2.0的增强模块

    1)mod_ssl

    Apache 2.0中的新模块。此模块是一个面向OpenSSL提供的SSL/TLS加密协议的一个接口。

    2)mod_dav

    Apache 2.0中的新模块。此模块继承了HTTP分布式发布和版本控制规范,用于发布和维护Web内容。

    3)mod_deflate

    Apache 2.0中的新模块。此模块允许支持此功能的浏览器请求页面内容在发送前进行压缩,以节省网络带宽。

    4)mod_auth_ldap

    Apache 2.0.41中的新模块。此模块允许使用LDAP数据库存储HTTP基本认证所需的信息。随之而来的另一个模块:mod_ldap,则提供了连接池和结果的缓冲。

    5)mod_auth_digest

    利用共享内存实现了对跨进程的session缓冲的额外支持。

    6)mod_charset_lite

    Apache 2.0中的新模块。这个试验模块允许针对字符集的转换和重新编码。

    7)mod_file_cache

    Apache 2.0中的新模块。这个模块包含了Apache 1.3中mod_mmap_static模块的功能,另外进一步增加了缓冲能力。

    8)mod_headers

    此模块在Apache 2.0中更具灵活性。现在,它可以更改mod_proxy使用的请求头信息,并可以有条件地设置回复头信息。

    9)mod_proxy

    经过重新编写的代理模块可以充分利用新的过滤器结构的优势,从而实现一个更为可靠的兼容HTTP/1.1的代理模块。另外,新的<Proxy>指令提供了更具可读性(而且更快)的代理站点控制;同时,不再支持重载<Directory "proxy:…">指令的方法。这个模块现在依照协议支持分为proxy_connec、tproxy_ftp和proxy_http三个部分。

    10)mod_negotiation

    新的ForceLanguagePriority指令可以确保在所有情况下客户端都收到单一的一个文档,以取代不可接受或多选择的回应。另外,negotiation和MultiViews算法已经进行了优化以提供更完美的结果,并提供了包括文档内容的新型类型表。

    11)mod_autoindex

    经自动索引后的目录列表现在可被配置为使用HTML表格而使格式更清晰,而且允许更为细化的排序控制,包括版本排序和通配符过滤目录列表。

    12)mod_include

    新的指令集允许修改默认的SSI元素的开始和结束标签,而且允许以主配置文件里的错误提示和时间格式的配置取代SSI文档中的相应部分。正则表达式(现在已基于Perl的正则表达式语法)的解析和分组结果可以用mod_include的变量$0..$9取得。

    13)mod_auth_dbm

    现在,可以使用AuthDBMType支持多种类似DBM的数据库。

    第3节 Apache的编译与安装

    Apache 2.0的安装配置环境与以前版本差别非常大。Apache 1.3使用了一个自定义的脚本来简化安装;而Apache2.0现在也像其他许多开源项目一样,利用libtool和autoconf来建立安装环境。假设我们目前所处的位置为/目录下。

    1.系统要求

    编译Apache需要满足以下要求:

    1)磁盘空间

    至少50MB以上的临时磁盘剩余空间。Apache安装完毕后大约需要10MB的空间,实际磁盘需求会因编译设置和是否安装第三方模块而有所不同。

    2)ANSI-C编译器及其支持环境

    必须装有ANSI-C编译器,推荐使用来自http://www.gnu.org的GNU C compiler (GCC)(4.1.1版)。假如没有GCC,那么要确保现有的编译器符合ANSI标准,并且PATH中必须包含指向基本编译工具比如make的路径。

    3)确保正确的时间

    因为HTTP协议的元素都会用到时间,所以有必要熟悉你的系统的时间同步机制。在基于Network Time Protocol (NTP)的系统中,一般是用ntpdate或xntpd来同步时间。

    4)Perl 5(可选)

    部分用Perl写的支持脚本,如apxs和dbmmanage,需要Perl 5解释器(5.003或以上版本就可以了),如果configure没找到这样的解释器也没关系,不会影响Apache 2.0的编译和安装,只是这些支持脚本不能用而已。如果系统中存在多个Perl解释器,比如有厂商提供的Perl4,还有你自己找来的Perl5,建议使用—with-perl选项来确保脚本./configure使用正确的版本。

    2.下载Apache

    如何获得Apache?你可以通过官方网站:http://www.apache.org/dist/httpd/及镜像站点:http://mirror.lupaworld.com/apache/httpd/下载。版本号带有alpha的是预测试版本,其运行可能正常也可能不正常;带有beta的是仍需要测试和纠错的比较可靠的版本。最好选择下载最新的Apache HTTP Server的发行版,并且是文件名中既没有alpha也没有beta的版本。本书使用Apache2.0系列中的Apache HTTP Server 2.0.59作为范例。

    下载完毕后,特别是从镜像站点下载的,建议你对下载来的tar包作PGP签名校验,这样做原因很简单,可以保证其完整,而且未被篡改。校验工作分两个步骤进行,第一步,必须从http://mirror.lupaworld.com/apache/httpd获得一个密钥(KEYS)(为确保此密钥文件本身未被篡改,推荐使用Apache较早发行版中的或者导入来自公共密钥服务器的密钥),用以下命令导入到你的个人密钥环中(根据你的PGP版本不同存在差异):

    第2章Apache安装和使用 - 图2

    或者

    第2章Apache安装和使用 - 图3

    第二步,从http://mirror.lupaworld.com/apache/httpd获得PGP签名以校验tar包。这个签名的文件名由其原tar包文件名后附加.asc组成。接着,可以使用如下命令来校验发行版(根据你的PGP版本不同存在差异):

    第2章Apache安装和使用 - 图4

    或者

    第2章Apache安装和使用 - 图5

    能够看到这样的信息:

    第2章Apache安装和使用 - 图6

    或者是“the relationship between the key and the signer of the key cannot be verified”的信息,其原因与你的密钥环中的信任关系有关,如果你信任这个密钥文件,那就没关系。

    3.解压安装包

    解压Apache Httpd的tar包非常简单,假如安装包放在/home目录下面。

    第2章Apache安装和使用 - 图7

    这样就在当前目录下建立了一个包含发行版源代码的目录,必须cd进入这个目录以继续服务器的编译。

    第2章Apache安装和使用 - 图8

    4.编译Apache

    首先通过./configure命令检验操作系统的环境是否支持apache源代码的编译过程,同时在参数中制定Apache的安装目录。

    第2章Apache安装和使用 - 图9

    执行这个命令就可以编译Apache了。

    第2章Apache安装和使用 - 图10

    对一个基本的配置的编译,实际需要的时间将根据你的硬件和选择的模块数量来决定。

    5.安装Apache

    下面开始安装Apache,执行:

    第2章Apache安装和使用 - 图11

    接着,通过修改/usr/local/apache/conf/下的配置文件,来配置Apache HTTP服务器。

    第2章Apache安装和使用 - 图12

    http://man.lupaworld.com/content/manage/ApacheManual/index.html有完整的配置指令参考。

    第4节 Apache的启动和运行

    1.Apache是如何启动的

    若配置文件中Listen的定义为默认的80端口(或其他1024以下的端口),则启动Apache将需要root权限以将它绑定在这个端口上。当服务器开始启动并完成了一些比如打开日志文件之类的操作,它将创建很多子进程来完成一些如侦听和响应客户端请求的工作。httpd主进程仍然以root用户的权限运行,而子进程以一个较低权限的用户运行。这将依照你所选择的多道处理模块进行控制。

    建议使用apachectl控制脚本来启动httpd执行文件。该脚本设置了在某些操作系统中正常运行httpd所必需的环境变量。apachectl会传递命令行的所有参数,因此大部分httpd的选项在apachectl中也适用。你可以直接修改apachectl脚本,改变头部的HTTPD变量使之指向httpd文件的正确位置,或者设置任意命令行参数,使之有效。

    如果正常启动,服务器将与终端分离并几乎同时出现平时的命令行提示符。这意味着服务器已经启动并开始运行。然后你就可以用浏览器去访问你的服务器来查看DocumentRoot目录下的测试文档及其页面链接里的其他文档的本地拷贝。

    2.随系统启动

    如果你想让Apache服务器在系统重启后自动运行,那就应该把httpd或者apachectl的调用加入到你的系统启动文件中。这就会以root权限启动Apache。当然,在此之前,必须保证你的服务器已经完成了安全和访问权限的设定。

    编辑文件rc.local:

    第2章Apache安装和使用 - 图13

    在配置文件里加入下列一行:

    第2章Apache安装和使用 - 图14

    保存退出即可。

    3.启动测试

    现在,可以执行这个命令立即启动你的Apache HTTP服务器:

    第2章Apache安装和使用 - 图15

    你可以用URL http://localhost/来访问你的第一个网页了,这个网页位于DocumentRoot目录下,通常是PREFIX/htdocs/。随后,可以输入如下命令停止服务器:

    第2章Apache安装和使用 - 图16

    第5节 了解httpd.conf文件

    Apache的配置文件是包含了若干指令的纯文本文件。主配置文件一般叫httpd.conf,其位置由编译时确定,也可以用命令行参数-f来改变。可以用Include指令附加其他配置文件。所有配置文件都可以使用所有指令。主配置文件的改变将在启动或重新启动后生效。

    自Apache1.3起加入了一个新功能,即,若配置文件是一个目录,Apache会解析该目录及其子目录中的所有文件作为配置文件。该功能的用途是,可以通过在这个目录中建立小的配置文件来设置虚拟主机,这样就可以简单地增加或者删除虚拟主机,而不需要修改其他任何文件,使得类似的操作简单许多。服务器还会读取一个包含MIME文件类型的文件,其文件名由TypesConfig指定,默认是mime.types。

    1.配置文件的语法

    Apache配置文件中每行包含一个指令,行末使用反斜杠“\”可以换行,但是反斜杠与下一行中间不能有任何其他字符(包括空格)。

    配置文件中的指令是不区分大小写的,但是指令的参数通常是区分大小写的。以“#”开头的行表示为注释。注解不能出现在指令的后边。指令前边的空行和空白字符会被忽略,因此可以采用缩进保持层次清晰。

    可以用apachectl configtest或者命令行参数-t检查配置文件中的错误,而不必启动Apache服务器。

    2.指令的作用域

    主配置文件中的指令作用范围是整个服务器。把指令嵌入到诸如<Directory>,>DirectoryMatch>,<Files>>,<FilesMatch>,<Location>,以及>LocationMatch>等段中,可以限制指令的作用域为文件系统中的某个位置或者URL,同时可以嵌套。

    Apache可以同时支持许多不同站点,称为Virtual Hosting。<VirtualHost>也会限制其中的指令的作用域,使之仅对特定站点有效。

    大多数指令可以包含在任意的段中,但是部分指令的作用域没有意义,比如控制进程建立的指令只是针对主服务器。

    3.指令介绍

    类似于其他Linux应用程序,Apache也有配置文件,在运行时间里可被系统管理员用来配置和控制。Apache使用名为httpd.conf的文件,此文件在安装Apache时存放在conf/目录里。让我们来看看这个文件的指令:

    1)ServerRoot

    ServerRoot指令设置了服务器存在的目录。通常它将包含conf/和logs/子目录。其他配置文件的相对路径即基于此目录。举例如下:

    第2章Apache安装和使用 - 图17

    2)DirectoryIndex

    很多情况下,URL中并没有指定固定的名字,而是给出了一个目录名。那么Apache服务器就自动返回这个目录下由Directory Index定义的文件,当然可以指定多个文件名,系统会在这个目录下顺序搜索。生成这个目录下的所有文件列表,提供用户选择。此时该目录的访问控制选项中的Index选项必须打开,使得服务器能够生成目录列表,否则Apache将拒绝访问。

    DirectoryIndex可以配置一个文档,也可以配置多个文档,多个文档用空格分开,如:

    第2章Apache安装和使用 - 图18

    3)AddDefaultCharset

    这个指令是设置服务器的字符编码设置,AddDefaultCharset Off这样的设置将会禁用此功能。AddDefaultCharset On将根据此指令的需要启用Apache内部的默认编码iso-8859-1。

    如果禁用这个功能,这样仅凭HTML文件头中META标签设置的语言来决定网页语言。很多网页出现乱码情况,都是由于编码设置不对引起的,对于Apache服务器来说,你也可以指定使用另外一个字符编码,比如简体中文。示例如下:

    第2章Apache安装和使用 - 图19

    4)PidFile

    当服务器启动时,服务器需要将其进程ID号存放在此文件中。

    5)ScoreBoardFile

    保存服务器内部的处理信息。

    6)Timeout

    接收和发送数据的超时设置,秒数。

    7)KeepAlive

    是否支持持久连接(而不是每个请求建一个连接),设off关闭此功能。持续作用扩展自HTTP/1.0和HTTP/1.1的长连接特性,提供了长效的HTTP会话,用以在同一个TCP连接中进行多次请求。在某些情况下,这样的方式会对包含大量图片的HTML文档造成的延时起到50%的加速作用。在Apache 1.2版本以后,可以设置KeepAlive On以启用持续作用。默认值:KeepAlive on。

    8)MaxKeepAliveRequests

    限制了当启用KeepAlive时,每个连接允许的请求数量。将此值设为“0”,则不限制请求的数目。建议设置一个比较大的值,以确保服务器性能。默认值:MaxKeepAliveRequests 100。示例如下:

    第2章Apache安装和使用 - 图20

    9)KeepAliveTimeout

    Apache在关闭连接前等待下一次请求的时间。一旦收到一个请求,超时值将会被设置为Timeout指令指定的值。如果是高负荷的服务器,把KeepAliveTimeout设置成一个比较大的值将导致一些性能方面的问题:超时值越大,与空闲客户端保持连接的服务器进程越多。默认值:KeepAliveTimeout 15

    10)MinSpareServers

    这个指令设定最小闲置子进程数量。闲置子进程是指目前没有处理要求的进程。示例如下:

    第2章Apache安装和使用 - 图21

    11)MaxSpareServers

    设定最大闲置子进程数量。

    12)StartServers

    设定启动时建立的子进程数量。示例如下:

    第2章Apache安装和使用 - 图22

    13)MaxClients

    是非常重要的指令,设定的是Apache可以同时处理的请求数,是对Apache性能影响最大的参数。默认值150是绝对不够的,若请求总数已达到这个值,那么后面的请求就要排队等候,直到某个请求处理完毕。这也是系统资源足够多而HTTP访问却很慢的主要原因。系统管理员可以根据硬件配置和负载情况来动态调整这个值。虽然理论上这个值越大,可以处理的请求就越多,但Apache默认的限制不能大于256。如果把这个值设为大于256,那么Apache将无法起动。可以通过ServerLimit指令,使得Apache可以加大MaxClients。

    14)MaxRequestsPerChild

    服务进程中允许的最大请求数目。

    15)Listen

    允许你将Apache绑定到指定的IP地址或端口,而不是默认端口。像下面这样指定侦听的IP地址,防止Apache抢占所有绑定的IP地址。

    第2章Apache安装和使用 - 图23

    第6节 使用Apache虚拟主机

    虚拟主机是指在一台机器上运行多个站点(比如:www.test1.com和www.test2.com)。若每个网络站点拥有不同的IP地址,那么虚拟主机可以是“基于IP”的;如果只有一个IP地址,也可以是“基于主机名”的。

    基于IP地址的虚拟主机方式,需要不同的主机名解析到不同的IP地址,提供虚拟主机服务的机器上同时设置有这些IP地址。因此在提供虚拟主机服务的机器上设立多个IP地址,比较浪费IP地址,因此这种方式越来越少使用。

    基于主机名的虚拟主机工作方式是,当客户程序向服务器发出请求时,用户想要访问的主机名通过请求头中的Host语句传递给服务器。比如:www.test1.com,www.test2.com都对应于同一个IP地址。这个方式,只要提供虚拟主机服务的机器上有一个IP地址就行,而且占用资源少,管理方便。

    1.虚拟主机配置

    配置指令:使用Apache的命令行参数-t-D DUMP_VHOSTS,可以帮助调试虚拟主机的配置,如:

    第2章Apache安装和使用 - 图24

    1)<VirtualHost>

    包含仅适用于指定主机名或IP地址的指令:<VirtualHost>和</VirtualHost>用于封装一组仅适用于特定虚拟主机的指令。任何在虚拟主机配置中可以使用的指令也同样可以在这里使用。当服务器接受了一个特定虚拟主机的文档请求时,它会使用封装在<VirtualHost>配置段中的指令。地址可以是:

    虚拟主机的IP地址。

    虚拟主机IP地址对应的完整域名。

    字符,仅与NameVirtualHost配合使用以匹配所有的IP地址。

    字符串default,与基于IP的虚拟主机联用以捕获所有没有匹配的IP地址。

    示例:

    第2章Apache安装和使用 - 图25

    IPv6的地址必须放入方括号中指定,否则作为可选项的端口号将无法确定。示例如下:

    第2章Apache安装和使用 - 图26

    每个虚拟主机所对应的IP地址、端口号或主机名不能相同。在第一种情况下,服务器所在物理机器必须配置为可以为多个地址接受IP包。(在机器没有多个网络硬件界面的情况下,如果你的操作系统支持,你可以使用ipconfig alias命令来达到这个目的)。

    在使用基于IP的虚拟主机时,default可以作为匹配任何IP地址的虚拟主机(前提是default没有匹配上其他列出的虚拟主机)。当没有进行default虚拟主机的设定时,在没有IP与请求匹配的情况下,将使用“主服务器”(包括所有在虚拟主机配置段之外的配置)的配置。(注意:任何匹配NameVirtualHost指令的IP地址既不会使用“main”服务器配置,也不会使用default虚拟主机的配置)。也可以指定一个端口来改变匹配的端口。如果没有指定,它将使用主服务器中最近的那个Listen语句指定的端口。或者指定:*来匹配那个地址上的所有端口。(当使用default时,建议使用本方法。)

    注意:<VirtualHost>的使用不会影响到Apache侦听的地址。你可以使用Listen来确保Apache侦听着正确的地址。

    2)NameVirtualHost

    NameVirtualHost指令是配置基于域名的虚拟主机所必需的指令之一。地址参数可以使用主机名,但建议使用IP地址。例如:

    第2章Apache安装和使用 - 图27

    使用NameVirtualHost指令,可以指定一个基于域名的虚拟主机将使用哪个IP地址来接受请求。当防火墙或是其他代理接受了请求并把它转到服务器所在的另外一个IP地址时,必须指定响应请求的机器物理界面上的IP地址。对于多个地址使用了多个基于域名的虚拟主机,应该为每个地址使用此指令。

    注意:“主服务器”和任何其他默认服务器都不会响应发送到NameVirtualHostIP地址的请求。(指定了NameVirtualHost但没有为这个地址指定任何虚拟主机的情况除外)。

    同时,可以为使用的基于域名的虚拟主机指定一个端口号。例如:

    第2章Apache安装和使用 - 图28

    IPv6地址必须封装在一对方括号内,如下例所示:

    第2章Apache安装和使用 - 图29

    为接受所有界面的请求,可以使用参数*

    第2章Apache安装和使用 - 图30

    <VirtualHost>指令的参数。

    请注意<VirtualHost>指令的参数必须与NameVirtualHost指令的参数完全一致。

    第2章Apache安装和使用 - 图31

    3)ServerName

    ServerName指令设置了服务器用于辨识自己的主机名和端口号。这主要用于创建转向URL。例如,一个放置Web服务器的主机域名为simple.test.com,但同时有一个DNS别名www.test.com。可以使用如下的指令:

    第2章Apache安装和使用 - 图32

    如果没有指定ServerName,服务器会尝试着对IP地址进行反向查询以得到主机名。如果在服务器名中没有指定端口号,服务器将使用接受请求的端口。为加强可靠性和可预测性,建议使用ServerName显示的指定一个主机名和端口号。

    若使用基于域名的虚拟主机,在<VirtualHost>配置段中的ServerName将指定为了匹配这个虚拟主机,在请求的Host头中必须出现的主机名。

    4)ServerAlias

    ServerAlias指令与基于域名的虚拟主机联用,设定虚拟主机的别名。

    示例如下:

    第2章Apache安装和使用 - 图33

    5)ServerPath

    ServerPath指令为主机设置了保守的(legacy)URL路径名,用于和基于域名的虚拟主机配合使用。

    2.虚拟主机的例子示范

    1)在一个IP地址上运行多个基于域名的Web站点

    服务器只有一个IP地址,而在DNS中有很多域名解析到这台机器。需要在这个机器上运行www.test1.com和www.test2.com两个站点。

    注意:在Apache服务器的配置中创建一个虚拟主机并不会自动在DNS中对主机名做相应更新。必须手工把域名解析到你的IP地址。否则别人是无法看到你的Web站点的。你也可以在hosts文件中添加相应条目进行测试,但这种方法仅适用于本机或那些有这些条目的机器来使用。为了测试成功,我们需要手动设定域名的解析。将www.test1.com和www.test2.com解析到本地IP地址127.0.0.1,操作如下:

    第2章Apache安装和使用 - 图34

    你也可通过编辑hosts文件来达到目的,操作如下:

    第2章Apache安装和使用 - 图35

    把以下二条记录写到hosts文件中:

    127.0.0.1 www.test1.com

    127.0.0.1 www.test2.com

    服务器配置

    第2章Apache安装和使用 - 图36

    由于*(星号)匹配所有的地址,所以主服务器不会接收任何的请求。因为www.test1.com首先出现在配置文件中,所以它拥有最高优先级,可以认为是默认或首要服务器。这意味着如果一个接受的请求不能与某个ServerName指令相匹配,它将会由第一个VirtualHost所响应。

    注意:可以用确定的IP地址来取代*。在这种情况下,VirtualHost的参数必须与NameVirtualHost的参数相符:

    第2章Apache安装和使用 - 图37

    不论如何,当IP地址无法确定的时候,使用是很方便的。例如,ISP给你配置的是动态IP地址,而你使用了某种动态域名解析系统时。因为匹配任何IP地址,所以在这样的情况下,不论IP地址如何变化,你都不需要另外进行配置。

    上述配置就是你在绝大多数情况下使用基于域名的虚拟主机时将要用到的。事实上,仅在一种情况下这样的配置不会让你满意:当你想为不同的IP地址或是端口提供不同的内容时。

    2)在不同的端口上运行不同的站点

    如果想让同一IP的不同端口响应多个域名。可以借助在“NameVirtualHost”标签中定义端口这样的方法来达到这个目的。如果想使用不带NameVirtualHost name:port的<VirtualHost name:port>或是直接用Listen指令,那么配置将无法生效。

    服务器配置

    第2章Apache安装和使用 - 图38

    3)建立基于IP的虚拟主机

    一台服务器有两个IP地址(112.112.112.111和112.112.112.112)分别对应域名www.test1.com和www.test2.com的服务配置如下:

    服务器配置

    第2章Apache安装和使用 - 图39

    如果存在主服务器(main server),那么对没有出现在任一个<VirtualHost>指令中的请求(比如,对localhost的请求)都会由主服务器来响应。

    4)混用基于端口和基于IP的虚拟主机

    如果服务器有两个IP地址(112.112.112.111和112.112.112.112)分别对应域名www.test1.com和www.test2.com。对每个域名,都要求在80端口和8080端口发布网站。可以这样配置:

    服务器配置

    第2章Apache安装和使用 - 图40

    5)混用基于域名和基于IP的虚拟主机

    如果你想在一些地址上配置基于域名的虚拟主机而在另外一些配置基于IP的虚拟主机。

    服务器配置

    第2章Apache安装和使用 - 图41

    6)使用default虚拟主机

    为所有端口配置default虚拟主机,这样配置,以获得任何指向没指定的IP地址和端口的请求。比如说:一个没被任何虚拟主机使用的地址/端口对。

    服务器配置

    第2章Apache安装和使用 - 图42

    使用这样一个应用通配符端口的默认虚拟主机可以有效地防止请求被主服务器接收。

    如果一个地址、端口对已经被一个基于域名的虚拟主机使用,那么默认虚拟主机决不会处理发向这个地址、端口的请求。如果一个请求的Host头中包含未知信息,或者干脆就没有,那么它会被第一个基于域名的虚拟主机(就是在配置文件中首先出现的使用了那个地址、端口对的虚拟主机)处理。

    可以用AliasMatch或RewriteRule来重写任何请求,使它指向一个简单信息页面(a single information page)(或脚本)。

    7)为不同的端口部署default虚拟主机

    与第一种一样,但我们想让服务器侦听很多端口而第二个default虚拟主机单独侦听80端口。

    服务器配置

    第2章Apache安装和使用 - 图43

    侦听80端口的默认虚拟主机(必须出现在所有使用通配符端口的虚拟主机之前)会捕获所有发向一个没有指定的IP地址的请求。主服务器将不会用于响应任何请求。

    8)为一个端口配置default虚拟主机

    如果我们只想在80端口上建立唯一的一个默认虚拟主机,我们应该这样配置:

    服务器配置

    第2章Apache安装和使用 - 图44

    发向一个未进行设定80端口地址的请求将会为这个虚拟主机响应;而发向未进行设定其他端口地址的请求为主服务器响应。

    9)将一个基于域名的虚拟主机移植为一个基于IP的虚拟主机

    如果一个具有www.example2.org域名的虚拟主机(就是基于域名配置示例中的第二个)得到了自己的IP地址。为了避免一些域名服务器或代理服务器在移植期间仍对这个域名做老的解析,我们可以采用一种过渡方法:同时提供新旧两个IP地址的解析。

    达到这个目的很简单。因为我们只要简单的把新地址(112.112.112.112)加入VirtualHost指令就行了。

    服务器配置

    第2章Apache安装和使用 - 图45

    现在这个虚拟主机就可以用新地址(基于IP的虚拟主机)和旧地址(基于域名的虚拟主机)同时进行访问了。

    第7节 认证、授权和访问控制

    如果网络站点上有敏感信息或只希望为一个小群体所访问,这里讲述的方法能确保使用户只能访问允许被访问的资源。

    1.准备工作

    本节中讨论的指令应该放入主服务器的配置文件(通常在<Directory>段)或者针对单个目录的配置文件(.htaccess files)中。

    如果需要使用.htaccess文件,那么必须设置服务器以允许在这些文件中使用认证指令,即,用AllowOverride指令指定哪些指令在针对单个目录的配置文件中有效。

    这里讨论认证,可以对AllowOverride这样设置:

    第2章Apache安装和使用 - 图46

    如果你希望把这些指令直接写入主服务器配置文件,当然就需要有对配置文件的写权限。你需要对服务器的目录结构有所了解,以确定某些文件的位置。

    2.启用认证

    先介绍用密码来保护服务器上的目录。首先需要建立一个密码文件。这个文件可以放在不能被网络访问的位置,以避免被下载。例如,如果/usr/local/apache/htdocs以外的空间不能被网络访问,那么可以考虑把密码文件放在/usr/local/apache/passwd目录中。

    Apache在其安装目录的bin子目录中提供了叫htpasswd的工具,以建立密码文件,可以这样使用:

    第2章Apache安装和使用 - 图47

    htpasswd会要你输入密码,并要求重新输入以确认:

    第2章Apache安装和使用 - 图48

    下来是对目录lamp进行保护,将以下内容写入httd.conf文件中。

    第2章Apache安装和使用 - 图49

    其中,AuthType指令选择了对用户实施认证的方法,最常用的是由mod_auth提供的Basic。Basic认证方法并不加密来自用户浏览器的密码,因此,不应该用于高度敏感的数据。Apache在最近的版本中还有另一种更安全的认证方法,即由mod_auth_digest提供的AuthType Digest。

    AuthName指令设置了使用认证的领域,它起两个作用,首先,此领域说明会出现在显示给用户的密码提问对话框中,其次帮助客户端程序确定应该输入哪个密码。所以,如果一个用户已经在“Restricted Files”领域通过了认证,则客户端就可以尝试使用“Restricted Files”的密码来访问同一个服务器的其他任何领域,从而使多个受限领域共享密码,以避免用户重复输入。当然,考虑到安全,如果服务器变了,客户端始终会要求重新输入密码。

    AuthUserFile指令设置了密码文件,也就是刚才我们已经用htpasswd建立的。如果用户过多,则认证速度会很慢,因为对每个请求都必须搜索这个纯文本文件,对此,Apache还支持把用户信息存入快速数据库,mod_auth_dbm模块提供了指令AuthDBMUserFile,并可以用dbmmanage程序建立和操作这些数据库。Apache模块数据库中还提供了其他许多认证选项。

    最后,Require指令设置了允许访问的用户。

    3.允许多人访问

    上述指令只允许一个叫user的用户访问这个目录,但是多数情况下,都需要允许多人访问,所以就要用到AuthGroupFile。

    首先,需要建立一个组文件以确定组中的用户。其格式很简单,可以用你喜欢的编辑器建立,例如:

    第2章Apache安装和使用 - 图50

    把以下内容,加入到groups中:

    第2章Apache安装和使用 - 图51

    它只是一个每组一行的用空格分隔的组成员列表。

    向已有的密码文件中增加一个用户,可以输入:

    第2章Apache安装和使用 - 图52

    程序的提示和上面的一样,但是,它会附加到已有的文件中,而不是建一个新的(参数-c可以强制建立新的密码文件)。

    现在,需要修改.htaccess文件如这样:

    第2章Apache安装和使用 - 图53

    如此,lampgroup组中的成员都在密码文件中有一个相应的记录,从而允许他们输入正确的密码以进入。

    除了建立组文件,还有另一种途径允许多人访问,即使用如下指令:

    第2章Apache安装和使用 - 图54

    4.测试举例

    现在我们举个实例,用Apache服务器实现用户验证。

    1)建立需要用户验证的目录

    我们在/usr/local/apache/htdocs/(apache的主页根目录)下建立一个aaa目录,现在我们要对aaa进行认证和授权访问。

    第2章Apache安装和使用 - 图55

    2)第2步:编辑httpd.conf主件

    使用vi打开主配置文件httpd.conf

    第2章Apache安装和使用 - 图56

    添加以下内容

    第2章Apache安装和使用 - 图57

    3)创建Apache的验证用户

    第2章Apache安装和使用 - 图58

    第一次创建用户要用到-c参数,第二次添加用户时,就不用-c参数。现在就创建了一个用户为user,而密码是在你执行了这个命令后,系统会提示你输入密码。如果想修改密码,可以如下操作:

    第2章Apache安装和使用 - 图59

    4)重启Apache服务

    重新启动Apache服务,然后访问http://127.0.0.1/aaa。如果顺利的话,应该能看到一个用户验证的弹出窗口,只要填入第3步创建的用户名和密码就行。

    5.访问控制

    1)访问控制的配置指定

    ●Order

    用于指定执行允许访问和拒绝访问规则的先后顺序。

    Order指令有两种形式:

    ◆Order Allow, Deny

    在执行拒绝访问规则之前先执行允许访问规则,默认情况下将会拒绝所有没有明确被允许的客户。

    ◆Order Deny, Allow

    在执行允许访问规则之前先执行拒绝访问规则,默认情况下将会允许所有没有明确被拒绝的客户。

    ●Deny

    定义拒绝访问列表。

    ●Allow

    定义允许访问列表。

    Deny和Allow。Deny和Allow指令的后面需要跟访问列表,访问列表可以使用如下的几种形式:

    ◆All:表示所有客户。

    ◆域名:表示域内的所有客户,如abc.net。

    ◆IP地址:可以指定完整的IP地址或部分IP地址。

    ◆网络/子网掩码:如192.168.1.0/255.255.255.255.0。

    ◆CIDR规范:如192.168.1.0/24。

    2)举例说明

    第2章Apache安装和使用 - 图60

    意为接受所有的人访问Apache服务器,但不允许来自www.abc.com的任何访问。

    第2章Apache安装和使用 - 图61

    意为不接受所有人访问,但允许abc.com.cn网站的来访。