一、httpd2.2的组成:

    /etc/httpd:服务器的根目录

        conf/httpd.conf,conf.d/*:配置文件

        conf/magic:MIME的配置文件

        logs:日志文件的存放路径,符号链接/var/log/httpd

        modules:动态模块文件的存放路径,符号链接/usr/lib64/httpd/modules

        run:httpd主进程pid的存放路径,符号链接/usr/run/httpd


    httpd的主配置文件:/etc/httpd/conf/httpd.conf

        在此配置文件中,所有的配置项均被称为指令(Directive)

            指令的格式:Directive Value

    

    在主配置文件中,所有的指令都被分组到三个配置段中:        

        ### Section 1: Global Environment

        ### Section 2: 'Main' server configuration

        ### Section 3: Virtual Hosts


二、常用的配置指令:

    Section 1: Global Environment:全局配置段

    1.Listen Directive

        定义服务器监听的有效套接字

        格式:Listen [IPADDR:]port [protocol]

            注意:

                1.在各配置文件中,Listen指令可以出现多次,用于定义不同的监听套接字

                2.Listen指令不能省略,否则服务器无法启动

                3.如果省略IP地址,将会监听当前服务器所有被正确配置并生效的IP地址

                4.在httpd2.2中,如果更改Listen中IP地址信息,则必须重启httpd进程才能生效,仅仅reload不能生效


    2.KeepAlive Directive

        开启或关闭HTTP协议的长链接功能

        格式:KeepAlive On|Off


        KeepAliveTimeout Directive    

        服务器在一个长链接上能够达到的子回话请求的最大时间间隔;默认的时间单位为秒

        格式:KeepAliveTimeout number


        MaxKeepAliveRequests Directive

        一个长链接上所能够接受的最大的用户请求数量,默认是100个

        格式:MaxKeepAliveRequests number

        

        以上三条指令是与长链接相关的指令,长链接的断开条件:

            时间限制、请求数量限制


        使用Telnet测试长链接: 

            设置KeepAlive On ,重载httpd服务,默认 KeepAliveTimeout的值为15

            blob.png


    3.MPM相关指令:

        MPM:多道处理模块;

        httpd-2.2的MPM不支持DSO机制,且event为测试模式              

    /usr/sbin/httpd

    /usr/sbin/httpd.event

    /usr/sbin/httpd.worker


        通过修改/etc/sysconfig/httpd文件来完成MPM功能切换;

    HTTPD=/usr/sbin/httpd.worker

        每次更换MPM模块,都需要重启httpd服务后才能生效,/etc/sysconfig/httpd是服务启动脚本/etc/init.d/httpd的配置文件;

            查看httpd或httpd.worker程序的模块列表:

        httpd -M

        httpd.worker -M


            查看httpd或httpd.worker程序的静态编译模块列表

                httpd -l

                httpd.worker -l

        

        与prefoik模块相关的配置指令:     

            <IfModule prefork.c>

            StartServers       8

                //在服务主进程启动之后,预先fork多少子进程

            MinSpareServers    5

                //最少预留的空闲子进程的数量

            MaxSpareServers   20

                //最多预留的空闲子进程的数量

            ServerLimit      256

                //为MaxClient指令定义上限

            MaxClients       256

                //最多的客户端并发访问量

            MaxRequestsPerChild  4000

                //每个子进程能够处理的客户端请求的最大值

            </IfModule>


        与worker模块相关的配置指令           

            <IfModule worker.c>

            StartServers         4

                //在服务主进程启动之后,预先fork多少个子进程;

            MaxClients         300

                //最多的客户端并发访问量

            MinSpareThreads     25

                //最少预留的空闲线程的数量

            MaxSpareThreads     75

                //最多预留的空闲线程的数量

            ThreadsPerChild     25

                //每个子进程可以管理的线程数量

            MaxRequestsPerChild  0

                //每个子进程可以处理的客户端请求的最大值

            </IfModule>

    

    4.DSO机制:

        链接动态模块并将其添加至活动模块列表

        格式:LoadModule module filename

        例:

            LoadModule auth_basic_module modules/mod_auth_basic.so

        modules是相对于ServerRoot指令定义的根目录的路径而言的


    5.Include Directive

        可以包括除了主配置文件之外的其他服务配置文件;支持Globbing

        格式:Include file-path | directory-path | wildcard

        示例:

            Inlude conf.d/*.conf


    6.User Directive

        指定启动子进程的用户ID和组ID

        格式:User User-Id

            Group Group-Id


    Section 2: 'Main' server configuration,定义了默认的web站点的基本属性

    7.ServerAdmin Directive

        定义了发送错误信息的邮箱地址;

        格式:ServerAdmin email-address|URL


        ServerName Directive

        服务器做自我标识时使用的主机名和端口号的组合;

        格式:ServerName [scheme://]domain-name|ip-address[:port]


        DocumentRoot Directive

        为web站点的资源提供路径映射;

        格式:DocumentRoot directory-path

        示例:

            DocumentRoot "/var/www/html"


    8.站点资源访问控制资源指令

        1)基于文件系统的访问控制指令   

            a.基于指定目录的访问控制指令         

                <Directory "/PATH/TO/SOME_DIR">

         Options Directive

         AllowOverride Directive

         Order Directive

         Allow Directive

         Deny Directive

             </Directory>


            b.基于特定文件的访问控制指令            

                <File "FILENAME">

    Directive Value

                </File>


            c.基于模式匹配的方式进行访问控制的指令             

                <FilesMatch regex>

    Directive Value

                </FilesMatch>


                <DirectoryMatch regex>

    Directive Value

                </DirectoryMatch>


        2)基于URL的访问控制指令

            a.基于URL进行访问控制:

                <Location URL-path|URL>

    Directive Value

                </Location>


    b.基于URL的模式匹配的方式进行访问控制:

                <LocationMatch regex>

    Directive Value

                </LocationMatch>

        

        3)指令具体内容

            ①Options Directive

                指定的目录中激活web访问控制相关特性;

                格式:Options [+|-]option [[+|-]option] ...

                取值可以是:None, All, Indexes, Includes, FollowSymLinks, SymLinksifOwnerMatch, ExecCGI, MultiViews...

    Indexes:启用DocumentRoot的索引特性;当web站点没有定义符合要求的主页或者主页不存在时,在浏览器上允许以索引的方式列表显示整个DocumentRoot中所有的资源给用户选择;一般用于资源下载站点;对于正常的web站点来说,应禁用此功能;

    FollowSymLinks:跟踪符号链接并找到被链接的文件,并可以在客户端浏览器中打开;

    SymLinksifOwnerMatch:只有处理客户端请求的子进程的所有者与符号链接文件的所有者为同一用户时,才跟踪符号链接;

    

            ②AllowOverride Directive

                控制被允许放置于.htaccess文件中的指令是否生效;

                格式:AllowOverride All|None|directive-type [directive-type]

                httpd允许在web站点的文档根目录中以及各级子目录中使用.htaccess文件进行资源的访问控制;凡是放置于.htaccess文件中的指令,有继承的特性;如果每次执行指令都要读取该文件进行比对,则运行效率会下降,所以通常建议该指令的值设置为"None";


    ③Order Directive

                定义基于IP地址的访问控制管理的顺序;

                a.配置顺序:

    根据指定的Allow和Deny的顺序来执行;

                b.范围顺序:

    匹配范围越小的,越优先执行;

                格式:Order ordering

    ordering可以包含两种通用顺序:

                    Allow, Deny:

                            先计算Allow指令的匹配,如果能够匹配任意规则,则允许;

                            再计算Deny指令的匹配,如果能够匹配任意规则,则阻止;

                            如果没有匹配,则默认阻止所有;

                    Deny, Allow:

    先计算Deny指令的匹配,如果能够匹配任意规则,则阻止;

    再计算Allow指令的匹配,如果能够匹配任意规则,则允许;

    如果没有匹配,则默认允许所有;


    ④Deny Directive

                控制阻止访问服务器的客户端主机;

                格式:Deny from all|host|env=[!]env-variable [host|env=[!]env-variable] ...


      Allow Directive

                控制允许访问服务器的客户端主机;

                格式:Allow from all|host|env=[!]env-variable [host|env=[!]env-variable] ...

    host可以写成:

                        域名或FQDN:example.net www.abc.com

                        单个IP:172.16.0.1

                        逻辑网段:172.16 172.16.0.0/16 172.16.0.0/255.255.0.0


    示例:

        Order allow,deny

                        Allow from all

                            //允许所有客户端主机访问当前服务器的web站点服务;


                        Order deny,allow

                        Deny from 172.16.0.1

    //仅阻止IP地址为172.16.0.1的主机访问当我服务器的web站点服务;

        

    9.DirectoryIndex Directive

        为当前web站点指定默认的主页文件名称;

        格式:DirectoryIndex disabled | local-url [local-url] ...


        注意:

    1) DirectoryIndex指令之后可以设置多个本地URL作为主页文件名称;按照顺序从前到后进行名称匹配,如果能够匹配成功,就将该资源当作本站点的主页文档;如果没有匹配成功,且Options指令中也没有定义Indexes特性,则web服务器阻止本次请求;

    2) 如果请求资源时明确的给出URL,则DirectoryIndex指令的值无任何意义;

    

    10.日志相关指令

        ErrorLog Directive

    标明错误信息的日志记录的位置(文件路径)

        格式:ErrorLog file-path|syslog[:[facility][:tag]]


        示例:

    ErrorLog logs/error_log


        LogLevel Directive

            控制错误日志记录的详细程度;

            格式:LogLevel [module:]level [module:level] ...

    level包括:emerg、alert、crit、error、warn、notice、info、debug


    注意:

        1) 日志记录等级越高,在错误日志中记录的信息就会越少;

        2) 选择的日志记录等级,有向上兼容的特性;


        CustomLog Directive

    标明记录访问日志的文件的路径及日志记录的格式;

            格式:CustomLog file format


        示例:

    CustomLog logs/access_log combined

     

        LogFormat Directive

    功能:描述了在访问日志中记录信息的特定格式;

    格式:LogFormat format|nickname [nickname]

                常用的format:

    %h:远程主机名称;如果HostnameLookups的值设置为Off,则记录远程主机的IP地址;

    %l:远程登录名称;如果没有登录名,就在日志中记录为"-";

    %u:远程用户名称;记录通过身份验证之后访问资源的用户名称;

    %t:收到客户端请求的时候的服务器的时间戳;[18/Sep/2011:19:18:28 -0400]

    \"%r\":请求报文首部的首行;

                        "GET /index.html HTTP/1.1"

    %>s:请求报文的状态信息;

    %b:以字节为单位的响应报文的长度;

    \"%{Referer}i\":访问此页面之前通过哪个超链接跳转而来;使用"{}"引用的内容是报文首部中的首部名称;

    \"%{User-Agent}i\":客户端使用的http应用程序及相关信息;


                示例:

    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


                四种格式,默认选择combined

                    CustomLog logs/access_log combined


    11.定义路径别名的指令:

        Alias Directive

            将指定的URL映射至本地的文件系统路径;

            格式:Alias URL-path file-path|directory-path

        示例:    

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

            <Directory "/var/www/icons">

                Options Indexes MultiViews FollowSymLinks

                AllowOverride None

                Order allow,deny

                Allow from all

            </Directory>


        AliasMatch Directive

            使用正则表达式将URL映射至本地的文件系统路径;

            格式:AliasMatch regex file-path|directory-path

        示例:

    AliasMatch ^/exam(.*)?$ "/tmp/exam$1"

    <Directory "/tmp/exam/">

                Options None

                AllowOverride None

                Order allow,deny

                Allow from all

    </Directory>


    12.服务器系统状态数据查询:

        前提:LoadModule status_module modules/mod_status.so

        <Location /server-status>

    SetHandler server-status

    Order deny,allow

    Deny from all

    Allow from 172.16

        </Location>


        ExtendedStatus On|Off:开启或关闭更多的额外状态信息展示;


三、虚拟主机配置段:

    ### Section 3: Virtual Hosts

    <VirtualHost> Directive

    启动并配置虚拟主机及相关参数;

        格式:

    <VirtualHost addr[:port] [addr[:port]] ...>

                Directive Value

    </VirtualHost>


    使用虚拟主机:默认一个httpd仅能构建一个web站点,因此很多的情况下,我们需要在同一台服务器上架构多个web站点,此时则需要使用虚拟主机来定义。如果启用了虚拟主机,每个独立的Web站点都必须要有至少一个独立的主机标识:

    IP地址 + Port + 主机头(请求报文首部中的Host首部的值,通常为FQDN)


    三种典型的虚拟主机实现方式:

        1) 基于IP地址构建的虚拟主机;

        2) 基于Port构建的虚拟主机;

        3) 基于主机头构建的虚拟主机;

        注意:Main Server和Virtual Host不能同时被定义;而且一旦虚拟主机配置被激活,Main Server就不再有效;


    常用指令:

    NameVirtualHost Directive

        功能:在使用基于主机头构建虚拟主机时,指定虚拟主机名称;

        格式:NameVirtualHost addr[:port]


        配置示例:

    /etc/httpd/conf/httpd.conf中添加如下指令:

Listen172.16.88.99:8000
NameVirtualHost 172.16.88.99:80


    /etc/httpd/conf.d/vhost1.conf的内容如下:

<VirtualHost 192.168.109.2:80>
    ServerNamewww.ppp213.com
    DocumentRoot"/myvhost/vhost1/"
    <Directory "/myvhost/vhost1">
        Options None
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>


    /etc/httpd/conf.d/vhost2.conf的内容如下

<VirtualHost 192.168.109.20:8080>
    ServerNamewww.ppp213.cn
    DocumentRoot"/myvhost/vhost2/"
    <Directory "/myvhost/vhost2/">
        Options None
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>


    /etc/httpd/conf.d/vhost3.conf的内容如下

<VirtualHost 192.168.109.20:80>
    ServerName www.ppp213.org
    DocumentRoot "/myvhost/vhost3/"
    <Directory "/myvhost/vhost3/">
    Options None
    AllowOverride None
    Order allow,deny
    Allow from all
    </Directory>
</VirtualHost>


        为主机添加新的ip地址 192.168.109.20:

ip add add 192.168.109.20/16 dev eth0 label eth0:0

    

        分别创建/myvhost/vhost1,/myvhost/vhost2,/myvhost/vhost3,并再其下创建index.html,重新载入httpd服务后,分别访问192.168.109.2、192.168.109.20、192.168.109.20:8080

        blob.png

        blob.png

        blob.png