LAMP架构之:httpd.conf配置文件解析

         各位小伙伴,有一段时间没写web架构方面的内容了,今天聊一聊WEB架构中apache的配置文件httpd.conf.这里的配置文件是基于apache2.2的版本,之所以没用2.4的版本,是因为现在系统自

带的都是2.2的版本,rpm包安装起来也方便,如果你也是rpm包安装,也能保证咱俩的配置是一样的,而且默认的rpm包安装所有的配置都会在一个文件中,这个相比分割开来要容易说一点。但是我还是会提一下2.4相比2.2中有几个必须要知道的变化,至于其他的内容基本都是一样的。。

         下面提炼出了2.2中所有可用的选项,将逐一解析并测试:

Global配置段:

#ServerTokens OS   

上面这个选项是设置服务器响应头中,server字段的返回信息,这些信息还会在浏览器访问报错的时候显示出来,默认参数为OS,下面分别看一个例子:

浏览器输出:

LAMP架构之:httpd.conf配置文件解析_ lamp

看到没,横线下面的一行,可见web服务器使用的是apache软件且版本号为2.2.15,系统是centos。由此可见信息量是非常的大,很容易造成一些安全隐患。

 

再看一下响应头中的信息:

LAMP架构之:httpd.conf配置文件解析_ lamp_02

看到没,所用软件的版本和系统信息。

 

鉴于上面的情况,可见如此的设置是相当的不安全,因此当我们在考虑httpd安全的时候,这就是一个需要修改的地方。

 

从官方的文档中可知,在指令的值有如下:

Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full

还敢给出了几个例子:
ServerTokens Prod[uctOnly]

服务器会发送(比如) Server: Apache

ServerTokens Major

服务器会发送(比如) Server: Apache/2

ServerTokens Minor

服务器会发送(比如) Server: Apache/2.0

ServerTokens Min[imal]

服务器会发送(比如) Server: Apache/2.0.41

ServerTokens OS

服务器会发送(比如) Server: Apache/2.0.41 (Unix)

ServerTokens Full (或未指定)

服务器会发送(比如) Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2

 

从上面的信息可见,最安全的是Prod[untOnly],因此在考虑安全的时候就设置为该参数。但是要注意的是,在修改配置文件的时候你只能设置为Prod,而不是Prod[untOnly],否则你的信息还会多一点。请自行测试,看看效果。

 

#ServerRoot "/etc/httpd"

该指令设置整个httpd配置文件的根目录所在,httpd服务会默认从该指令的设置来寻找httpd.conf配置文件等其他配置文件以及模块文件等。

 

PidFile run/httpd.pid

该指令设置apachepid文件,这里要注意的是,这里使用了相对路径,那到底文件在哪呢?因此要知道这里的相对路径是相对于ServerRoot指令设置根目录而言的。

 

Timeout 60

该指令设置apache建立连接时的超时时间。。官方给出的解释如下:

TimeOut指令用于设置Apache等待以下三种事件的时间长度:

接受一个GET请求耗费的总时间。

POSTPUT请求时,接受两个TCP包之间的时间。

应答时TCP包传输中两个ACK包之间的时间。

httpd.conf配置文件中说是在接受请求前和发送响应前的超时时间。。

 

KeepAlive Off

该选项控制的是TCP连接的持久性,是否开启TCP的持久连接。持久连接可以让一次成功的tcp三次握手建立的链接通道在一段时间内保持状态,后续的请求将不在需要经过tcp的三次握手重新建立通道,而可以直接使用其传输数据。但是持久连接也不宜过长,过长会导致其它客户端的请求不能建立连接,因为对服务器来说连接数还是有限制的,这要看你服务器的资源。

MaxKeepAliveRequests 100

该选项设置持久连接通道最大可以处理的请求书,一旦超过这个请求数将立即关闭该通道重新建立连接。如果设置为0则表示没有任何限制,但通常不建议。

KeepAliveTimeout 15

该选项设置的时候持久连接的超时时间,当两次请求之间超过这个时间限制,就关闭持久连接通道。

 

 

<IfModule prefork.c>

StartServers       8      //服务启动时默认启动的子进程数。

MinSpareServers    5   //服务最小空闲的子进程数,当空闲进程输低于5个会启动新的进程

MaxSpareServers   20    //服务最大空闲的子进程数,当空闲进程大于20时,会杀掉多余的空闲进程。

ServerLimit      256      //这个设置是限制了服务器在活动期间MaxClients的最大值,MaxClients的设置不能超过这里的设置

MaxClients       256   //设置允许启动的最大服务子进程数,也就是最大并发连接数

MaxRequestsPerChild  4000   //一个子进程允许最大处理多少个请求,超过这里的请求数将立即关闭该子进程。。

</IfModule>

上面这段内容和下面worker.c的内容是apache中相当重要的内容,这两端内容设置的都是apache自身的处理引擎的设置。从apache2.2开始,还支持了event机制的引擎。这些内容配置控制了引擎的工作方式。其次这里我还要说的是IfModule的使用,通常使用该形式的内容都是静态模块的使用方式,所谓静态模块都是被直接编译进apache中的,而动态模块都是通过LoadModule指令来添加的。但是即使是动态的模块,你也可以使用IfModuleL以静态的形式来配置,不过事先还是要使用LoadModule来导入模块。

 

好,到这里,可能你有好几个疑问,下面就尝试着来探讨你心中的疑问:

1.为什么说子进程?

读了上面的信息,你应该能发觉解释每条指令的时候都是说的子进程,这是为什么?因为apacheprefork模式是预派生的进程模式,既然是预派生,那么肯定是事先要生成好进程,但是进程又会被关闭,那是什么来预派生?因此这里就涉及到了父进程和子进程的概念。Httpd服务启动后除了子进程外,还有一个独立的父进程,父进程不处理任何的请求,只负责监听子进程的状态,从而适当的关闭子进程,产生子进程。父进程的用户都是root用户,而子进程的用户是你在配置文件中通过User来设置的用户。下面看一下本人启动的进程信息:

root      1339  0.0  1.4 175696  3644 ?        Ss   11:49   0:00 /usr/sbin/httpd

apache    1341  0.0  1.2 175828  3012 ?        S    11:49   0:00 /usr/sbin/httpd

apache    1342  0.0  1.2 175828  3012 ?        S    11:49   0:00 /usr/sbin/httpd

apache    1343  0.0  1.2 175828  3012 ?        S    11:49   0:00 /usr/sbin/httpd

apache    1344  0.0  1.2 175828  3012 ?        S    11:49   0:00 /usr/sbin/httpd

apache    1345  0.0  1.2 175828  3012 ?        S    11:49   0:00 /usr/sbin/httpd

apache    1346  0.0  1.2 175828  3012 ?        S    11:49   0:00 /usr/sbin/httpd

apache    1347  0.0  1.2 175828  3012 ?        S    11:49   0:00 /usr/sbin/httpd

apache    1348  0.0  1.2 175828  3012 ?        S    11:49   0:00 /usr/sbin/httpd

看到没?除了8个子进程,还有一个父进程,属主是root用户。

 

2.到底最大并发连接数是什么?

谈到最大并发连接数是个很敏感的话题,因为当请求数,进程数,并发数这些东东聚到一起的时候就很容搞不清楚什么是什么。好,分析一下。

从客户端来说,客户端发起的是一个一个的请求,那么对与客户端来说可以说一个请求就会是一个连接,就会是一个连接数。但是对于服务器端就不是了,这要看服务器端是用什么机制来处理客户端的请求的。对于web而言,服务器的处理机制有基于进程的,基于线程的,基于事件机制的等,这是常用的几个。以这里的prefork而言,是基于进程的,那么当客户端的一个请求过来之后,服务器端是用一个进程去跟客户端的一个请求建立连接(tcp三次握手),此时对于服务器端而言一个进程就是一个连接,同一时间最大开启多少个进程就是最大并发连接数。到这里你是否懂了?所以看最大并发连接数要看服务端基于的机制,当然这是理论值。实际情况要看你的服务器个方面资源的配合。例如这里的MaxClients256,有人会说好少啊,这怎么行?但是你要知道这是默认值,官方肯定是要满足大部分的需求。你可以根据你的需求进行调整,但是进程相比线程是特别耗资源的,配置不当当大并发的时候可能你系统的内存就崩溃了。从上面的信息也可以看到还没怎么配置,一个httpd进程什么都还没弄已经占了3M的常驻内存空间。所以怎么协调你自己看这办。。

 

 

3.MaxRequestsPerChildMaxKeepAliveRequests的对比理解

这个地方可能又有人有疑问了,这两个指令到底怎么理解?keepalive说是处理这么多的请求数就关闭,而PerChild又说处理这么多的请求书就关闭,那不是有冲突吗?好,这里要说明一下。Maxkeepaliverequests是针对链接通道而言的,一个持久的连接通道最大处理这么多的请求数,超过将关闭。而maxrequestsperchild则是针对进程而言的,httpd的一个子进程允许最大处理这么多的请求数将被父进程回收重新打开新的子进程。那也就是说在持久连接超过请求数后,只是关闭了这个连接通道,对子进程来说只是关闭了一个子进程,而该子进程在生存期内还可以与客户端的其它请求建立连接。。好,这个问题就说到这里。。。

 

 

<IfModule worker.c>

StartServers         4      //服务进程的进程数,这里包括了父进程和子进程,父进程只有一个。

MaxClients         300    //服务开启的最大进子程数

MinSpareThreads     25    //服务最小空闲的线程数

MaxSpareThreads     75   //服务最大空闲的线程数

ThreadsPerChild     25    //每个子进程持续的线程数,也就是保证每个子进程最少的线程数,这里包括活动的和非活动的。注意要和空闲区分开

MaxRequestsPerChild  0   //每个子进程处理的最大请求书,0表示无限制

</IfModule>

以上段的配置就是apache的线程引擎的配置,鉴于在prefork中解释的内容,这里只提一下并发数的情况,这里的并发数就不是看子进程了,而是线程数。这里每个子进程的常驻线程是25,在高并发的时候可以不断的增加,但是空闲时,每个子进程都会保持25个在线线程。有上面的信息可见并发数应该是maxclients*threadperchild的值,就以默认的来讲以及支持并发7500了。想比prefork可以说提高了n倍。只要服务器资源够用,能顶的住压力,那么并发可以无限制的扩大,但是一般不会让其无限制扩大。可以通过ServerLimitThreadLimit来限制MaxClientsThreadsPerChild的值。

 

进程与线程的总结:

1.进程相比而言消耗系统的资源,而线程的开销要小的多

2.进程和线程的上下文切换都会造成抖动,但是进程模式不影响其他进程,而线程模式由于共享进程资源,很可能造成其他线程不稳定

3.进程模式一个进程出现问题,不会对其他进程造成影响,而线程模式,一个线程崩溃导致进程崩溃,会导致该进程控制下所有的线程全部崩溃。

4.进程相比线程来说要稳定的多的多,但是线程支持的并发是进程不可比拟的(统一资源下)

 

这里略说一下event,基于事件的机制,现在nginx默认就是使用epoll的事件机制,事件机制更夸张,一个线程通过控制n个信号令来处理n个请求。啊哦。。

 

Listen 80

//该指令设置web服务监听的端口号,也可以设置监听的套接字。如果值设端口好,表示监听在任何ip地址上

 

LoadModule auth_basic_module modules/mod_auth_basic.so

LoadModule auth_digest_module modules/mod_auth_digest.so

上面的指令是用来设置动态加载模块,这里要注意的是加载模块的写法以及模块在系统中的位置,这个就不多说了。。

 

Include conf.d/*.conf

该指令用来设置包括配置文件外的设置,可以用来扩展配置文件。这里所包括的配置文件都将被httpd进程所解析

 

ExtendedStatus On

该选项控制的是server-status的功能,打开服务的扩展信息功能。有时候想通过httpd自身的server-status扩展信息功能来查看当前的httpd状态信息,就需要开启该选项。但是从服务的运行效率来讲,是不建议开启的。至于server-status怎么配,在下面在讲。。。

 

User apache

Group apache

上面两行内容就是设置apache子进程运行的用户和组信息。。。

 

到这里为止,httpd的全局段的配置就结束了。。。全局的配置对后面所有的内容都生效。。。

 

MAIN配置:

         接下来的内容将是MAIN的配置,即httpd的主配置段内容。其实主配置段内容就是一个特别的虚拟主机的配置,里面的任何内容都可以放到虚拟主机中,但当中的很多内容又对虚拟主机生效。但是一旦配置了虚拟机主机,MAIN里面的ServerName配置的虚拟主机就失效了。

 

ServerAdmin root@localhost

该选项设置的是管理员的邮箱地址,随便设,这是在服务器返回给客户端的错误信息中所包含的邮箱地址,方便客户端与你取得联系。通常会在定义的错误页面中定义到该邮件地址的超链接,看一个例子:
LAMP架构之:httpd.conf配置文件解析_linux_03

看到上面有一个webmaster的超链接没,那个点开就会打开一个发送邮件的窗口,此时的收件人就是你ServerAdmin这里设置的收件人。这个错误也没是apache自带的错误页面,在/var/www/error/下面。这是通过httpd.conf里面的ErrorDocument来定义错误代码到这个页面的,至于怎么设置,请往下看。。。

 

ServerName 0.0.0.0:80

该选项设置的是虚拟主机名,但是它是相对于MAIN配置段而言的。。是默认的虚拟主机,可以设置成ip就用ip访问,设置成域名就用域名访问。。

 

UseCanonicalName Off

该指令我就不解释了,我觉得手册中解释的挺好,直接拉过来给你看看:

在很多情况下,Apache必须构造一个自引用URL(即一个指回相同服务器的URL)。使用 UseCanonicalName On 会将ServerName这个域名用于所有自引用URLSERVER_NAMECGI中的SERVER_PORT

 

设置为 UseCanonicalName Off 时,如果客户端提供了主机名和端口(否则将如上所述使用标准域名)Apache将会使用这些信息来构建自引用URL。这些值与用于实现基于域名的虚拟主机的值相同,并且对于同样的客户端可用。CGI变量SERVER_NAMESERVER_PORT也会由客户端提供的值来构建。

 

用这样的方式成功解决问题的例子如下:在一个局域网内,您想让连接主机的用户使用诸如www这样的短域名进行访问。您会注意到,如果用户键入了类似http://www/splat这样的短域名和目录的URL,并且没有最后的斜线,Apache会将他们重定向到http://www.domain.com/splat/。如果您在这个目录上启用了身份验证,这会导致用户必须进行两次验证:一次针对www而另外一次针对www.domain.com(参见关于此主题的FAQ获得更多信息)。但如果UseCanonicalName设为 Off Apache就会重定向到http://www/splat/

 

第三个可选项是 UseCanonicalName DNS ,用于为大量基于IP的虚拟主机支持那些古董级的不提供"Host:"头的浏览器使用。使用这个选项时,Apache将对客户端连入的服务器的IP地址进行反向DNS查询,以构建自引用URL

 

这里值说一句,通常情况下,都是将其设为off,这也是apache的默认设置,如果你有特别的需求可以根据情况设置为其他的参数。

 

 

DocumentRoot "/var/www/html"

//该选项是设置网站的根目录,默认情况下访问的站点内容,都是该目录下的内容。。。

 

<Directory  />

    Options FollowSymLinks

    AllowOverride None

</Directory>

上面的内容是设置目录“/”的权限,这里的“/”就是系统的文件系统的根目录。这里其实是apache的一个预设,因为即使你使用正则表达式也不能匹配这个符号,为了防止安全隐患所以做了一个预设,在根目录中允许从任何地址进行访问,但是Options只有FollowSymLinks。而官网的建议是Deny from all。默认是Allow from all。这里的功能有点隐晦,自行测试吧。通常保持默认即可。。

 

这里要是说明一下的是<Directory>…</Directory>这种形式,这种形式用来设置具体某个目录的访问权限,使用该方法,你可以任意设置你想设置的目录的权限。。

 

 

<Directory "/var/www/html">

 

    Options Indexes FollowSymLinks

 

    AllowOverride None

 

    Order allow,deny

    Allow from all

 

</Directory>

 

上面内容的设置也是一样,设置目录/var/www/html这个目录的权限,这也是网站默认的根目录。

 

在这里要重点说一下三个知识点:Options AllowOverride 以及order allow,deny的问题。

Options

该指令设置的是目录具有的功能特性。在apache2.2中有以下几个功能特性选项:
None Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews All,下面将一个一个解释,在这里先说明下,如果你看过官方手册,你会发现上面少了一个IncludesNoexec,上面的内容是在httpd.conf中说明,至于配置文件中踢掉的特性,这里就不在说了。

None:设置该选项,表示关闭目录的任何功能特性

Indexes:该特性是开启目录的索引功能,所为索引就是浏览器访问时会显示一些列的文件列表,这个功能我想大家都会,就不解释了。

Includes:这个特性是开启服务器端包含功能,主要用在SSI文档的处理(shtml),如果你看到开发的代码中有shtml这样的文档,那你就要注意了是否需要开启Includes特性。

FollowSymLinks:允许该目录中使用链接文件,链接到网站外部目录中的文件

SymLinksifOwnerMath:允许网站使用链接文件,但是链接所指向的文件必须与此链接文件的属主相匹配,才允许访问

ExecCGI:允许该目录执行CGI的脚本

MultiViews:启用服务器端的多内容视图协商的功能。所为协商功能,就是在客户端访问时,没有写出完全的文件名称,但是服务器会根据客户端的访问请求进行自行的协商功能,选项最符合客户端需求的文件予以响应。下面看一个例子:

假设设置如下:

LAMP架构之:httpd.conf配置文件解析_ centos6.5_04

 

浏览器访问测试:

LAMP架构之:httpd.conf配置文件解析_linux_05

若上面所示,其实要访问的文件是index.html,但是写出了index,此时报404的错误。下面再看MultiViews的访问效果:

LAMP架构之:httpd.conf配置文件解析_linux_06

 

浏览器访问:
LAMP架构之:httpd.conf配置文件解析_ centos6.5_07

 

看到没,这下就能访问了,这就是协商的特性。。

All:如果没有设置任何的功能特性,那么默认情况下就是All,但是使用了All,不包括MultiViews。至于实际效果,请自行测试。。

 

特殊用法:+/-

         关于这个用法有点特殊,这要是当对同一个目录设置多个Options时,到底那些特性生效。先解释下+/-,+表示该特性是一定包含,-表示该特性一定是禁止。下面通过举个例子说明一下到底是什么意思

例子1

<Directory  /var/www>

Options Indexes FollowSymLinks

</Directory>

<Directory  /var/www/html>

Options Includes

</Directory>

 

在这里例子中,没有使用任何的+/-,因此默认情况下对于多个Options是不合并的,而且最精确的设置优先。在对/var/www目录设置时,其实是包含了下面的子目录html,但是又对html子目录单独设置了,在加上不合并的特性,此时子目录html只有Includes的特性。

例子2:

<Directory  /var/www>

Options Indexes FollowSymLinks

</Directory>

<Directory  /var/www/html>

Options +Includes -Indexes

</Directory>

 

在上面的这个例子里面,有了+,那么多个Options就要合并,但是-表示明确禁止该特性,因此html子目录最后的特性就是 Includes FollowSymLinks

 

通过上面两个例子的类比,应该可以知道+/-的含义了。。

 

 

AllowOverride: 确定允许存在于.htaccess文件中的指令类型,是否允许覆盖定义的访问权限

         该指令后面也可以跟好几种指令类型,但是有的并不常用,这里只介绍几个常用的

         None:表示不允许使用.htaccess文件来设置目录的权限,即使你在目录下定义了.htaccesshttpd进程并不会去扫描它

         All:这是默认的设置,如果什么都没有设置,默认情况下表示允许使用.htaccess文件,而且允许使用所有的指令类型

         AuthConfig:该指令类型表示允许使用用户名密码的方式来设置目录的访问认证,这是比较常用的.格式为:
                   AuthName:     //设置认证的相关描述信息,随便写

                   AuthType:   basic   //设置认证的类型,这里有两种类型basic,digist,通常都会使用basic

                   AuthUserFile   //指定用户密码信息文件

                   AuthGroupFile   //知道用户组文件

                   require user username/valid-users    //设置哪些用户具有权限 user username用来指定具体的用户,而valid-users表示AuthUserFile中所有用户都具有权限。如果是组怎么办呢?group groupname

         FileInfo:该指令表示允许使用控制文档相关的指令。这里面有一个很重要的就是rewrite规则,这个在生产服务器中基本都是会使用的,所以如果你不设置为all,至少要设置为FileInfo

 

注意:上面的指令既可以单独的写在.htaccess文件中,也可以直接写在httpd.conf配置文件中。至于其具体的用法和效果,这里不做测试了,将会在apache必知必会中予以测试和体验。。

 

这里还想点出一个知识点就是Satisfy的使用,在上面的内容中没有写出来,默认情况下没有就是Satisfy All 表示客户端访问是先经过order设置的ip认证,然后在进行用户名认证。但是有时你可能会遇到这样的情况,比如对于外部用户你需要用户名和密码认证,但是对于内部用户则不需要用户名密码认证,而是能直接访问,怎么办呢?这个时候就需要Satisfy的设置了,看一个例子:

   AllowOverride All

    AuthName "auth realm"

    AuthType basic

    AuthUserFile /etc/httpd/htpasswd.user

    Require valid-user

    Allow from 10.0.10

Satisfy any

 

从上面的信息看出,设置了某个目录的认证,但是最后两句话你可能没见过。Allow from ip Satisfy any 就设置了来自10.0.10网段的ip地址不需要进行用户名密码的认证即可访问。因此你可以知道Satisfy any 就是取消上面对应的客户端的认证需要,这里的测试也会在apache必知必会中体现

 

 

Order:该指令用来限制客户端的访问

         Order是顺序的意思,常见的是两种写法: Order allow ,deny 或者Order deny,allow

          接下来就是allow from clinets或者deny from clients,这里的clients写法很多,可以是ip地址,可以是ip段,可以是具体域名,可以是域名后缀等,自行查看。

 

这里要强调的是,allow,deny最后的结果到底怎么判断,根据官方手册和测试经验得出判断方法:后定义的为默认规则且优先检查。例如:order allow ,deny deny为默认规则,先检查deny规则,如果禁止则明确禁止,再检查allow,如果明确允许则允许,如果都不匹配,则执行默认规则deny

解析一个例子:
Order allow,deny

Allow from 10.0.10.254

Deny from 10.0.10.254

Allow from 10.0.10.11

 

看上面的例子,orderallowdeny,这里的最终结果是只允许从10.0.10.11来访问,其他地址的全部拒绝。你可能不能理解,从你的第一感觉来看,allow排在deny的前面,先进行allow匹配,如果你是从10.0.10.254来访问,你感觉应该可以访问啊第一个就匹配放行了,可以如果你测试你就会发现被禁止了 403的错误。再看一个例子:

Order deny,allow

    Deny from 10.0.10.254

    Allow from 10.0.10.254

Allow from 10.0.10.11

这里也是一样,你可能会觉得从order的顺序来看,应该禁止10.0.10.254的访问,是测试时你会发现被允许了。所以综合这两个例子可以看出确实是上面总结的情况:后定义的为默认规则且优先检查 .

其实如果你按照官方手册的来排也没错,但是有点绕,可能会进程确定错误。但是按照这个总结的绝对没错,而且结果是一样的。

 

注意:这里要提一下的是,在apache2.4中,已经不再是order allow deny这种形式了,而是变成了Require这种形式。例如:

Require all granted

Require all denied

Require ip 10.0.10.11

Require host www.lxm.com等,具体的测试在必知必会中在介绍,这里你要先知道这么个情况。。。

 

 

 

<IfModule mod_userdir.c>

    UserDir disabled

 

    UserDir public_html

 

</IfModule>

 

<Directory /home/*/public_html>

    AllowOverride FileInfo AuthConfig Limit

    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec

    <Limit GET POST OPTIONS>

        Order allow,deny

        Allow from all

    </Limit>

    <LimitExcept GET POST OPTIONS>

        Order deny,allow

        Deny from all

    </LimitExcept>

</Directory>

 

上面的这段内容,是跟apache设置个人站点有关的。有时候搭建web站点可能是给不同的个人来使用的,这个时候就要用到上面个人站点的设置了。至于怎么配置,这里先不说,在apache必知必会中会给出具体配置方法,但是这里要说明一点的就是Limit的使用,看上面的例子就可以知道,这是用来针对http协议头部中的http方法来过滤的。

 

 

DirectoryIndex index.html index.html.var

该指令设置的目录索引文件,当客户访问站点时,会在匹配的目录中按照这里的次序以此超找对应的文件响应给客户,直到找到为止,如果都不符合,则报错。

 

AccessFileName .htaccess

该指令设置的是分布式配置文件名,这里设置的文件名,在每个目录中都会被查找,前提是使用AllowOverride开放了每个目录的分布式文件的使用,这里的文件名可以随便写,当考虑安全的时候,完全可以修改掉,只要后续的配置保持一致即可。

 

<Files ~ "^\.ht">

    Order allow,deny

    Deny from all

    Satisfy All

</Files>

上面这段内容是设置以.ht开头的文件的访问权限,从这里可以知道<Files..></Files>的用法,其是用来匹配某个文件的

 

TypesConfig /etc/mime.types

该指令设置的是mime的类型,该文件中的mime类型都将被支持。至于什么是mime自行百度,这个东西基本上不用管。

 

DefaultType text/plain

该指令设置mime的默认类型,当服务器无法确定某个文档的mime类型时,就会向客户端返回这里的默认mime类型。

 

 

<IfModule mod_mime_magic.c>

    MIMEMagicFile conf/magic

</IfModule>

这段内容也是设置跟mime有关的东东了,基本不用管

 

HostnameLookups Off

该指令设置是否启用DNS的反向查找,通常在互联网上,除了邮件服务器会启动DNS的反向超找,其他的基本不会启用,因此这里选择关闭,也是优化httpd的一个知识点

 

EnableMMAP on

该指令设置的是内存映射的功能,将内层直接映射到kernel buffer,默认情况下是开启的,这是一种优化机制,将内存映射到kernel buffer,这样大大提高了底层数据的传输效率,加快了响应速度

 

EnableSendfile on

该指令设置的是kernel sendfile的功能,这个需要os的支持,目前RHEL6以后基本都支持。这也是一种优化的功能,默认也是on

 

注:上面两个功能都跟web架构的调优有关,关于这些内容,将专门弄一个web架构分析整理出来。这里有点忘了,哈哈哈。。

 

ErrorLog logs/error_log

该指令设置的是错误日志的记录文件

 

LogLevel warn

该指令设置的是日志的级别,关于日志有那些级别,百度吧。

 

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

LogFormat "%h %l %u %t \"%r\" %>s %b" common

LogFormat "%{Referer}i -> %U" referer

LogFormat "%{User-agent}i" agent

上面的内容,以LogFormat开头的都是设置访问日志的记录格式,记录格式你可以设置多个,对于不同的站点调用需要的记录格式即可,后面的combined common等这些就是日志记录格式的名称,供后面调用

 

CustomLog logs/access_log common

该指令设置的就是访问日志文件以及日志文件的日志记录格式

 

 

ServerSignature On

该指令设置服务器生成页面的页脚,通常是在错误页面中,增加一些必要的信息,默认为on,设置为off,则不会生成页面的页脚信息。包括前面的邮件地址的就必须开启这个功能。

 

 

Alias /icons/ "/var/www/icons/"

该指令是用来设置访问的url别名,其实就是映射url到特定的目录,使用该方式可以将不是站点默认目录的内容给包含进来供客户端访问

 

<IfModule mod_dav_fs.c>

    DAVLockDB /var/lib/dav/lockdb

</IfModule>

该模块设置是设置webdav的功能,关于webdav的设置将会在apache必知必会中讨论一下。

 

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

该指令设置CGI脚本的url映射

 

 Redirect permanent /foo http://www.example.com/bar

该指令设置url的重定向功能

 

IndexOptions FancyIndexing VersionSort NameWidth=* HTMLTable Charset=UTF-8

该指令设置的是索引的选项,就是web访问时以一个列表的形式展示目录下的内容,这里的设置就是页面怎么布局或者页面特性的展示

 

AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip

 

AddIconByType (TXT,/icons/text.gif) text/*

AddIconByType (IMG,/icons/p_w_picpath2.gif) p_w_picpath/*

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

上面一段内容的设置是告诉服务器针对什么样格式的文本以上面样的图片标识,这通常用在fancyIndex上,这里的图片你可以自行设置

 

DefaultIcon /icons/unknown.gif

该指令是设置默认的图片,当上面的AddIcon都不匹配时,就调用这里的设置

 

AddDescription "GZIP compressed document" .gz

AddDescription "tar archive" .tar

AddDescription "GZIP compressed tar archive" .tgz

上面这段内容一看就是针对不同格式结尾的文件进行描述

 

 

ReadmeName README.html

该指令设置README文档,这里设置的文件会插入index list中的尾部,你可以在该文件中写入你想告诉客户端的内容,客户端可以下载该文件进行查看

 

HeaderName HEADER.html

该指令设置的文件将会插入到index list的头部

 

DefaultLanguage nl

该指令设置页面的默认语言,通常是被注释掉的,非特殊情况下不要使用

 

AddLanguage ca .ca

AddLanguage sv .sv

AddLanguage zh-CN .zh-cn

AddLanguage zh-TW .zh-tw

上面的指令设置的是增加web站点支持的语言类型

 

LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW

设置的是语言优先级,当客户端没有设置语言偏好的时候,就以这里设置的语言优先级来选择匹配。。

 

ForceLanguagePriority Prefer Fallback

关于这个解释,看手册了,巴拉巴拉,基本没动过。。

 

 

AddDefaultCharset UTF-8

该选项设置的是页面的默认字符编码

 

AddEncoding x-compress .Z

AddEncoding x-gzip .gz .tgz

上面的指令是设置压缩的格式

 

AddType application/x-tar .tgz

AddType application/x-compress .Z

AddType application/x-gzip .gz .tgz

AddType application/x-x509-ca-cert .crt

AddType application/x-pkcs7-crl    .crl

AddType指令通常是用来设置后缀名和内容请求内型的映射关系,通常在typesconfig指定的文件中,如果不存在,就可以使用该指令添加。关于这个指令一个典型的例子就是跟php整合的时候。

 

 

AddHandler cgi-script .cgi

AddHandler send-as-is asis

AddHandler type-map var

该指令设置的是将文件扩展名与特定的处理器之间建立映射,以第一个为例,所有以.cgi结尾的文件都将被认为是可执行的cgi脚本。

 

ErrorDocument 500 "The server made a boo boo."

ErrorDocument 404 /missing.html

ErrorDocument 404 "/cgi-bin/missing_handler.pl"

ErrorDocument 402 http://www.example.com/subscription_info.html

这里的ErrorDocument指令设置的是错误代码的重定向。

这里要说明一下的就是文件的路径到底是以什么为标准的?经过测试发现,文件的路径只能是以DocumentRoot/var/www下默认的子目录为准

 

 

BrowserMatch "Mozilla/2" nokeepalive

BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0

BrowserMatch "RealPlayer 4\.0" force-response-1.0

BrowserMatch "Java/1\.0" force-response-1.0

BrowserMatch "JDK/1\.0" force-response-1.0

BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully

BrowserMatch "MS FrontPage" redirect-carefully

BrowserMatch "^WebDrive" redirect-carefully

上面的内容是基于User-Agent来匹配不同的浏览器,设置一些环境变量

 

 

 

<Location /server-status>

    SetHandler server-status

    Order deny,allow

    Deny from all

   Allow from .example.com

</Location>

<Location /server-info>

    SetHandler server-info

    Order deny,allow

    Deny from all

    Allow from .example.com

</Location>

 

关于上面两段内容的设置,要说明的是<Location …></Location>的形式,Location是用来设置匹配url的,用来针对url的访问控制。

Server-status:设置的是wen站点访问的统计信息

Server-info:设置的是httpd程序本身的设置信息,包括httpd.conf的当前设置,模块信息等

看两个直观的截图:

 

LAMP架构之:httpd.conf配置文件解析_ centos6.5_08

 

 

LAMP架构之:httpd.conf配置文件解析_ centos6.5_09

 

<IfModule mod_proxy.c>

ProxyRequests On

<Proxy *>

    Order deny,allow

    Deny from all

    Allow from .example.com

</Proxy>

 

ProxyVia On

 

<IfModule mod_disk_cache.c>

   CacheEnable disk /

   CacheRoot "/var/cache/mod_proxy"

</IfModule>

 

</IfModule>

 

上面的内容设置的是httpd proxy功能,其次还设置了一个磁盘缓存的功能。Httpd默认自身就可以充当缓存服务器,可以使用内层缓存,也可以使用磁盘缓存。关于proxy功能通常用的比较少,一般会配合tomcat进行使用。

 

NameVirtualHost *:80

该指令表示开启基于域名的虚拟主机,这也是用的最多的一种形式,要想开启基于域名的虚拟主机,必须打开这一项,但是要注意的是在apache2.4中,此项已经被废弃了,虚拟主机可以随便设置

<VirtualHost *:80>

    ServerAdmin webmaster@dummy-host.example.com

    DocumentRoot /www/docs/dummy-host.example.com

    ServerName dummy-host.example.com

    ErrorLog logs/dummy-host.example.com-error_log

    CustomLog logs/dummy-host.example.com-access_log common

</VirtualHost>

        

上面的内容就是用来设置一个虚拟主机的样例,基本上在main中的内容都可以写在虚拟主机中,但是一旦启用了虚拟主机,main中的DocumentRoot就失效了。不管你是用ip访问还是域名访问,你所访问的都将是虚拟主机的内容。

        

到此,关于httpd.conf配置文件就聊到这里,更多内容,请看下回分解……..

 

结束!!!

 

    笨蛋的技术------不怕你不会!!!