- Apache源代码全景分析(第1卷):体系结构与核心模块
- 张中庆 梁雪平
- 2134字
- 2020-08-26 21:40:47
3.2 配置文件
3.2.1 配置文件类
Apache 服务器的配置是通过文本格式的配置文件来实现的,在文本文件中包含配置指令,正是通过这些指令实现对Apache运行的方方面面进行控制的。在Apache 2.0中涉及的配置文件包括以下三种。
❑ httpd.conf
httpd.conf是Apache中最重要的配置文件,通常位于$ServerRoot下的conf目录中。不过在一些特殊的发行版本中,可能并不是这个名字,比如在许多支持SSL的Apache二进制发行版本中都会将二进制文件命名为httdsd,与之对应,配置文件也相应改名为httdsd.conf。不管名称如何,文件内部的指令都是一样的。httpd.conf 是默认的配置文件,一般情况下不建议对其进行修改,通常的建议是重新拷贝一份,再对该拷贝进行修改。这种情况下,你可以在命令行中使用-f参数来指定新的非默认的配置文件,而不是使用默认的httpd.conf。
从Apache 1.3.13 起通过-f指令不仅可以指定配置文件,还可以指定配置目录,即如果配置文件是一个目录,Apache 会解析该目录及其子目录中的所有文件作为配置文件。一种可能的用途是,可以在这个目录中通过建立小的配置文件来设置虚拟主机,这样就可以简单地增加和删除虚拟主机,而不用修改其他任何文件,使类似的操作自动化容易了许多。
通常,当服务器启动的时候,该文件被读取处理一次,同时在每次重新启动的时候又会被处理一次,因此对配置文件的任何修改都要等待到服务器重启后才能生效。
❑ .htaccess
httpd.conf文件通常用于控制全局的配置信息,但有时Apache需要提供目录级别的控制,比如定制特定目录访问或列表显示等。尽管httpd.conf内部提供了相关的目录配置指令,但是,如果需要控制的目录数目较大,httpd.conf无疑会急剧膨胀。因此,Apache中提供了另外的一种目录级别的配置,即.htaccess。通常情况下,.htaccess 文件位于需要进行控制的目录之内,因此系统中可能存在多个.htaccess。每个.htaccesss文件都有能力为它所处的目录及所有的子目录设置授权、目录索引、过滤器及其余的各种相关指令。因为.htaccess文件总是包含在用户自己的共享目录文档中,因此用户完全可以建立、更新和修改自己的.htaccess文件,而不必直接修改httpd.conf文件,以保证httpd.conf的安全性。你要知道,每个人都去修改httpd.conf,其造成的问题,你可能甚至都无法预料。
不过,.htaccess是默认的目录配置文件名,你可以通过AccessFileName指定对其文件修改。比如如果你执行了AccessFileName .diraccess,则Apache将不再读取目录中的.htacccess,而是读取.diraccess。没有特殊的需要,我们尽量不要修改.htaccess文件的名称。
❑ access.conf和srm.conf
在Apache 1.3以前的版本中,除了httpd.conf和.htaccess之外,还有两个相关的配置文件,就是access.conf和srm.conf。access.conf用于配置服务器的访问权限,控制不同用户和计算机的访问限制。srm.conf是服务器的资源映射文件,告诉服务器各种文件的MIME类型,以及如何支持这些文件。这两个文件都是从NCSA服务器继承而来的,具体的文件可以通过httpd.conf中的AccessConfig和ResourceConfig指令进行指定。不过从Apache 1.3开始,这两个文件就已经不用了,因此在Apache 2.0中你看不到这两个文件,不过,如果一定要设置AccessConfig和ResourceConfig指令,那么可以将它们设置为“/dev/null”。
除了这三个设置文件之外,Apache 还使用 mime.types 文件用于标识不同文件对应的MIME类型,magic文件设置不同MIME类型文件的一些特殊标识,使得Apache 服务器在从文档后缀不能判断出文件的 MIME 类型时,能通过文件内容中的这些特殊标记来判断文档的MIME类型。其文件名由TypesConfig指定,默认为mime.types。
图3-1描述了各个配置文件在整个请求中的位置。
图3-1 Apache中的配置文件及对应的处理时机
从图3-1中我们可以看出,四个配置文件的处理时机是不一样的:当Apache启动或重新启动的时候,三个文件httpd.conf、access.conf及srm.conf都会被处理,而.htaccess只有在特定的HTTP请求到来的时候才有可能被处理。
四个配置文件在Apache中的位置和层次关系如图3-2所示。
图3-2 各个配置文件在整个Apache中的处理时机
3.2.2 配置文件处理时机
对于3.2.1节中所讨论的三种配置文件,它们的处理时机是不一样的,即使对httpd.conf而言,也会在不同的时机被处理,完整的处理示意如图3-2所示。
■ 在Apache中,我们将启动的命令行也会进行抽象,视为文件来处理,对于这种并不是真正文件的命令行,在Apache启动初始化的时候它们会被处理。
■ 当Apache启动初始化的时候,httpd.conf将第一次被读取,然后被处理。
■ 在 Apache 的主循环中,每次启动或重启后,Apache 都会重新读取配置文件httpd.conf。
■ 当处理特定请求的时候,如果允许使用.htaccess,接收到请求后,它将读取.htaccess中的配置信息,然后与httpd.conf中的配置信息进行合并,并生成最终的针对请求的配置信息。
图3-3演示了整个配置文件在Apache中所处的位置。
图3-3 配置文件在整个Apache中的位置
在最底层,管理员可以修改全局配置文件,如httpd.conf、srm.conf、access.conf,以及局部配置文件如ht1、ht2至ht5。另一方面,管理员在启动Apache的时候通过配置命令行参数也可以影响 Apache 的内部行为。不管是对配置文件还是命令行参数,Apache最终都一样对待。当 Apache 启动的时候,这些配置文件将被读取并被解析。Apache 的运行将依赖于这些配置信息,不过任何时候配置信息的修改都不会立即生效。由于只有服务器刚启动的时候才会读取配置信息,因此修改后的配置信息只有当服务器重新启动的时候才会生效。经过处理之后,内部配置数据结构将被生成,然后这些数据结构将被保存到配置库中。
对于每一个从浏览器发送过来的请求,请求处理器都会建议“请求配置生成器”生成与该请求相关的配置数据。大部分情况下,请求配置生成器都是通过读取请求资源所在路径下的 .htaccess文件生成请求配置数据,该数据最终与全局配置中相关的数据合并,从而形成最终的请求配置数据。请求处理器自身知道如何将一个URI映射为本地磁盘上的文件并决定请求者是否有权限对其进行访问。关于请求的内容我们在后面的部分会进行更加详细的讨论。