网站地图    收藏   

主页 > 系统 > apache教程 >

Apache中的配置指令概述|-Apache教程

来源:自学PHP网    时间:2014-10-14 00:34 作者: 阅读:

[导读] , //本文是《Apache源代码全景分析》第二卷《体系结构和核心模块》中的第八章《配置文件管理》的草稿部分中,主要描述Apache中的指令概念,在后续的章节中我们将继续深入Apache中的配...

//本文是《apache代码全景分析》第二卷《体系结构和核心模块》中的第八章《配置文件管理》的草稿部分中,主要描述Apache中的指令概念,在后续的章节中我们将继续深入Apache中的配置文件的处理细节,包括Apache如何读取命令行参数,如何读取配置文件,如何执行配置文件中的指令以及如何存储指令等等。

//本文可以任意转载和阅读,但是不允许出现在任何盈利性质的出版物和印刷品中,任何部分抄袭或者全局抄袭都将保留法律诉讼的权力。
//转摘请保留上面的文字,并著名出处:http://blog.csdn.net/tingya

 

 配置文件管理

 

Apache作为一个强大的非常灵活的Web服务器,配置文件功不可没,通过修改和调整配置文件,用户可以将Apache的功能发挥到极限。事实上,大部分的Apache管理员的工作就是调整Apache的配置文件,调整指令的参数。但是Apache的配置文件也是庞大的,指令的数目就够令人望而生畏,而且还在不断的扩充之中。尽管目前有很多的Apache的管理宝典之类的书指导用户如何使用这些指令,但是大部分的系统管理员对配置文件的机制已经指令的内部运行并不能很好的理解。它们并不了解指令是如何对Apache产生效果的,因此指令的使用也仅仅是人云亦云,简单模范而已。

 

古人云:知其然而知其所以然。或者说“授之以鱼,不如授之以渔”。本章我们将详细的对Apache的配置文件进行了深入的剖析,同时我们将追踪配置指令的作用流程,从而明白配置文件是如何产生效果的,部分的内容我们可能需要放到下一章结合模块部分描述。

 

 

4.1 Apache配置系统

 

4.1.1配置系统概述

在第七章我们描述worker MPM的时候曾经提到过系统中每个进程所能产生的线程数目并不是任意的,而是通过指令ThreadsPerChild指定的,同时系统中所能产生的进程数目也不是无限的,这由指令ServerLimit指令指定,比如

 

ThreadsPerChild     25

 

ServerLimit          16

 

上面的指令指定每个进程所能产生的线程数目为25个,而进程的最大产生数目为16

 

那么这些指令应该保存在哪儿?Apache是什么时候读取这些指定的?它是怎么读取的?读取之后这些指令保存在哪儿,怎么保存的?这些指令最终是如何影响Apache的行为的呢?这些都是Apache配置系统需要解决的问题.

 

从整体上描述Apache配置系统,它应该包含三个主要部分:

 

1)、配置文件。通常情况下,配置系统会指定一些固定的文件作为配置文件,比如目前最主要的配置文件就是httpd.conf

 

2)、配置指令。配置系统必须能够决定各个指令的含义,这样配置系统才能够正确的对其进行解释和处理。配置正确的指令或者是默认的值,或者由管理员进行修改;而解释配置指令则由Apache的核心以及各个模块来处理。

 

3)

 

本章我们先重点描述前两个部分,在模块章节中我们描述第三部分。

 

4.2 配置文件

 

Apache服务器的配置是通过文本格式的配置文件来实现的,在文本文件中包含逐条的配置指令,正是通过这些逐条的指令从而实现对Apache运行的方方面面进行控制。在Apache2.0中涉及到的配置文件包括下面的两种:

 

httpd.conf

 

httpd.confApache中最重要的配置文件,通常位于$ServerRoot下的conf目录中。不过在一些特殊的发行版本中,可能并不是这个名字,比如在许多支持SSLApache二进制发行版本中都会将二进制文件命名为httdsd,与之对应,配置文件也相应的改名为httdsd.conf。不管名称如何,文件内部的指令都是一样的。Httpd.conf是默认的配置文件,一般情况下不建议对其进行修改,因此通常的建议是你重新拷贝一份,对该拷贝进行修改,因此这种情况下,你可以在指令行中使用-f参数来指定新的非默认的配置文件。

 

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的话,造成的问题,你可能甚至都无法预料。

 

access.confsrm.conf[1]

 

Apache1.3以前的版本中,除了httpd.conf.htaccess之外,还有两个相关的配置文件,就是access.confsrm.confaccess.conf用于配置服务器的访问权限,控制不同用户和计算机的访问限制,srm.conf是服务器的资源映射文件,告诉服务器各种文件的MIME类型,以及如何支持这些文件。这两个文件都是从NCSA服务器继承而来的,具体的文件可以通过httpd.conf中的AccessConfigResourceConfig指令进行指定。不过从Apache1.3开始,这两个文件就已经废弃不用了,因此在Apache2.0中你看不到这两个文件,不过如果你非要设置AccessConfigResourceConfig指令,那么你可以将它们设置为“/dev/null”

 

除了这三个设置文件之外,Apache还使用mime.types文件用于标识不同文件 。其文件名由TypesConfig指定,缺省时是mime.types。对应的MIME类型, magic文件设置不同MIME类型文件的一些特殊标识,使得Apache 服务器从文档后缀不能判断出文件的MIME 类型时,能通过文件内容中的这些特殊标记来判断文档的MIME类型。

 

4.1描述了各个配置文件在整个请求中的的位置。

 

ASP/ target=_blank class=infotextkey>aspectratio="t" v:ext="edit" />

 

4.1 配置文件处理

 

从上图中我们可以看出四个配置文件的处理时机是不一样的:在Apache启动或者重新启动的时候三个文件httpd.confaccess.conf以及srm.conf都会被处理,而.htaccess只有在特定的HTTP请求到来的时候才有可能被处理。

 

 

4.2 配置文件在整个Apache中的位置

 

4.3 指令相关概念

 

4.3.1指令概述

由于Apache只定义了一些配置的框架和配置段规则,因此Apache配置文件的结构通常很容易理解。每个可用的指令以及指令的参数并不是由Apache核心决定的,而是由模块完全决定并实现和控制。因此,一般情况下,Apache配置文件的结构可以使用如下的语法片段进行描述:

 

configuration                    ::=   directive*

 

directive                              ::=   section-directive | simple-directive

 

section-directive                  ::=   section-open configuration section-close

 

section-close                       ::=   “<”directive-name directive-argument*”>”

 

simle-directive                    ::=   directive-name directive-argument*

 

directive-name                    ::=   “directory” | “documentroot”|…

 

directive-argument              ::=   

 

换句话说,一个Apache配置文件可能是一个空文件,或者是包含了一个或者多个配置的指令,每个指令包含指令名称以及指令所需要的参数。指令的名称唯一的标识该指令本身,指令参数差异性则很大,参数类型,参数的个数都不尽相同,下面的是一个指令片断:

 

……

 

ServerRoot “C:/Program Files/Apache Group/Apache2”

 

TimeOut 30

 

<Directory “C:/Program Files/Apache Group/Apache2/manual”>

 

      Options Indexs

 

      <Files *.html>

 

           SetHandler type-map

 

      </Files>

 

</Directory>

 

……

 

从上面的片断可以看出,指令只是用于控制Apache的简单的命令而已,Apache从配置文件中读取这些指令,然后执行相应的操作从而实现执行这些指令。通过使用指令,Apache管理员可以控制整个Web服务器的行为。由于Apache中提供了种类繁多的指令,这些指令使得的Apache是一个高度可配置的Web服务器。

 

Apache的指令可以分为两种:简单指令以及配置段指令。配置段指令都是被包含在”<…>”中的指令,比如<Directory>…</Directory>。配置段指令总是会包含其余的指令。

 

尽管从上面的语法我们可以看到Apache的指令的语法非常的复杂,但实际上却非常的简单。在Apache进行指令处理的时候,Apache将逐行的读取这些配置指令,如果某行不是空行(即不匹配正则表达式”^[/t]*$”),同时也不是一个注释行(不匹配正则表达式”^[/t]*#.*$”),那么Apache将该行的第一个单词视为指令字,后面的其余的单词全部算作参数。如果某个行以”/”结尾,则下一行视上一行的继续。

 

因此,Apache配置指令的规则可以概括如下:

 

对于配置文件中的指令,其规则如下:

 

 使用UNIX路径法则:在所有的路径中使用“/”代替DOS下的“/”作为路径的分隔符。

 

 所有的注释行以“#”开始,同时注释行必须在一行结束,如果一行注释容不下,下一行必须继续以“#”开始。

 

 配置文件对大小写不敏感。但建议对非关键字均小写,而关键字则使用匈牙利方法,比如ServerRootTypesConfig等等。

 

 每行只能配置一个参数,配置的基本格式为:

 

       参数    参数值

 

 如果指令过长,不能够在一行中完整地放置,此时需要分割成为多行,各个行之间用 / 进行组合。如果使用 / 字符,那么在反斜杠和行的末尾不能存在任何内容和字符,包括空格或者水平制表符。

 

 系统将忽略配置文件中多余的空白字符。

 

4.3.2指令参数

4.3.2.1参数类型

从原则上讲指令的参数可以是任何的字符串,只要指令处理函数能够理解即可。不过对于一些常用的指令参数,Apache中有一些默认的规定。一般,指令名称后面可以跟一个或多个用空格分开的参数。如果参数中有空格,则必须用双引号括起来, 用方括号括起来的是可选的参数。如果一个参数可以取多个值,则各个可能的值用"|"分开。 应该原样输入的文字使用缺省的字体,而可变的必须按实际情况加以替换的会加强显示。 使用可变参数个数的指令以"..."结尾,以示最后一个参数可以重复。

 

指令的参数类型非常多,以下列出很常用的部分:

 

(1) URL

 

一个完整的包括类型、主机名和可选的路径名的统一资源引用名,如 http://www.example.com/path/to/file.html

 

(2) URL-path

 

url中类型和主机名之后的部分,如/path/to/file.html. url-path是表示资源在网络空间而不是在文件系统中的位置。

 

(3) file-path

 

即文件在本地文件系统中相对于根目录的路径,如 /usr/local/apache/htdocs/path/to/file.html. 除非指定了其他的值,不以斜杠开头的file-path将被视为对ServerRoot的相对路径。

 

(4) directory-path

 

即目录在本地文件系统中相对于根目录的路径,如 /usr/local/apache/htdocs/path/to/.

 

(5) filename

 

即不带路径信息的文件名,如file.html.

 

(6) regex

 

正则表达式,是对文本匹配模式的描述。指令的定义中会说明应该使用什么regex.

 

(7) extension

 

一般是指filename中最后一个"."号后面的部分。 但是,Apache可以辨认多个文件后缀,如果filename含有多个"." 则第一个"."后面由每个"."分隔开的部分都是此文件的后缀。 比如filenamefile.html.en有两个后缀:.html.en. Apache指令中指定extension时,可以有也可以没有前导的".",而且不区分大小写。

 

(8) MIME-type

 

一种用一个主格式类型和一个副格式类型并用斜杠分隔的描述文件格式的方法,如 text/htmlimg/jpeg等等。

 

(9) env-variable

 

这是Apache配置进程中定义的环境变量的名称。 注意,它不一定与操作系统中的环境变量相同。比如:

 

SetEnvIf Referer "^http://www.example.com/" local_referal

 

SetEnvIf Referer "^$" local_referal

 

<Directory /web/images>

 

   Order Deny,Allow

 

   Deny from all

 

   Allow from env=local_referal

 

</Directory>

 

上面的代码就使用了环境变量local_referal,使用的时候必须通过env=xxxx进行指定。

 

4.3.2.2参数默认值

如果该指令有默认值(即,如果你没有在配置中明确指定, 那么Apache网站服务器会设置一个特定的值,并认为它是你设置的),会在此处说明。 如果没有,则会指明是"None"。注意,此处的默认值并不一定与服务器发行版中默认的httpd.conf中该指令的取值相同。

 

4.3.2.3配置段指令

4.3.3指令上下文

4.3.3.1上下文介绍

配置文件中的各个指令的作用范围是不一样的,可以分为全局指令局部指令以及条件指令。默认情况下,配置文件中的指令是作用于整个服务器的,比如上面的示例中的ServerRootTimeOut指令,它们的作用范围则是针对整个服务器而言,但并不是所有的指令都这样,有些指令只是针对某个特定的目录,文件或者URL地址,通常情况下,那么我们将这类指令称之为局部指令,这类指令总是嵌在相关的配置指令段中,比如<Directory>, <DirectoryMatch>, <Files>, <FilesMatch>, <Location>, 以及 <LocationMatch>,比如上面的示例片断中<Directory “C:/Program Files/Apache Group/Apache2/manual”>…</Directory>中的指令仅仅对目录C:/Program Files/Apache Group/Apache2/manual中的文件产生作用。

 

另外还有一些指令并不是针对某个目录的,而是在特定的条件下才会产生效果的,我们将它们称之为条件指令。

 

类似于<Director>的这类指令我们称之为容器指令或者称之为配置段指令。比如<IfDefine><IfModule>以及<IfVersion>等等。

 

局部指令和条件指令都是以<…>…</…>之间,我们将这两种指令称之为配置段指令。

 

一个指令它所能影响的范围以及它产生效果的条件,我们称之为指令的上下文,在用户使用任何一个核心指令之前,了解指令能够使用的上下文环境是一件非常重要的工作,换句话说,你必须能够知道指令的作用上下文或者指令的范围。

 

4.3.3.2主服务器上下文(Server Config)

如果指令的上下文是主服务器,那么它能够作用的范围将是配置文件中容器配置段之外的所有的范围,即可以出现在httpd.confsrm.conf以及access.conf,但却不能出现在<VirtualHost>或者<Directory>配置指令片断中。该指令也不能出现在.htaccess文件中。

 

4.3.3.3局部上下文(Local Config

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论