本文旨在复习httpd2.2常用配置。复习http协议相关知识、httpd2.2配置文件相关配置介绍、配置httpd的身份验证、配置httpd虚拟主机 等等。


知识储备:


http协议知多少?

http协议:

    HTTP:hyper text transfer protocol,超文本传输协议,是互联网上应用最为广泛的一种网络协议。HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准。通常,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到 请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息。


http协议版本:

    http/0.9:原型版本,功能简陋

    http/1.0: cache,MIME,method

        MIME:Multipurpose Internet Mail Extension

        method(请求方法):GET,POST,HEAD,PUT,DELETE,TRACE,OPTIONS

    http/1.1: 增强了缓存功能

    http/2.0:


http工作模式:

    HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则     在那个端口监听客户端的请求。一旦收到 请求,服务器会向客户端返回一个状态

    http请求报文:http request

    http响应报文:http response

    简单来来说 一次http事务就是:请求<-->响应


web资源:web resource

    静态资源:无需服务端做出额外处理。如:.jpg, .png, .gif, .html, .txt, .js,.css,                   .mp3,.avi 等。

    动态资源:服务端需要通过执行程序做出处理, 发送给客户端的是程序的运行结果。

              如 .php,.jsp

    注意:一个页面中展示的资源可能有多个,每个资源都需要单独处理。


    资源标识:URL 统一资源标识符

        Uniform Resource Locator:用于描述服务器特定资源的位置

        例如: http://www.sina.com.cn/index.html

        Scheme://Server[:Port][/PATH/TO/SOME_RESOURCE]


一次完整的http请求处理过程:

    (1)建立或者处理连接;接收或者拒绝请求

    (2)接收请求;接收来自互联网上的主机请求报文中对某特定资源的一次请求过程。

    (3)处理请求;对请求资源进行解析,获取客户端的请求资源及请求方法。

    (4)访问资源:通过存储IO获取用户的请求的资源。

    (5)构建响应报文

    (6)发送响应报文

    (7)记录日志


并发访问响应模型:
    单进程I/O模型:启动一个进程处理用户请求;一次只能处理一个请求,多个请求被串行响应。

    多进程I/O模型:并行启动多个进程,每个进程响应一个请求。

    复用I/O模型:一个进程响应n个请求。

        多线程模式:一个进程生成n个线程,一个线程处理一个请求。

        事件驱动(event-driven):一个进程直接处理n个请求。

    复用的多进程I/O模型:启动多个(m)进程,每个进程生成(n)个线程。


http协议实现:

    静态服务器技术:httpd(apache),nginx,lighttpd ...

    应用程序服务器:动态服务器技术,IIS: .net 、tomcat:.jsp


httpd测程序版本:

    httpd 1.3:官方已经停止维护

    httpd 2.0:

    httpd 2.2:MPM不支持DSO机制

    httpd 2.4:目前最新稳定版:支持DSO

    

 CentOS6.7中httpd-2.2配置详解


 

1.httpd的相关功能

        CGI:Common Gateway Interface

        虚拟主机:IP,PORT, FQDN

        反向代理

        负载均衡:bytraffic,bybusiness,byrequest

        路径别名

        丰富的用户认证机制

            basic 

            digest

        支持第三方模块

        ......

2.httpd的特性

    高度模块化:core+modules

    DSO:dynamic shared object 动态共享对象

    MPM:Multipath processing Modules (多路处理模块)

        prefork:多进程模型。一个主进程,多个子进程。每个进程响应一个请求;

            主进程:负责生成子进程及回收子进程;负责创建套接字;负责接收请求,并将其派发给

                    某子进程进行处理;

            n个子进程:每个子进程处理一个请求。

            工作模型:会预先生成几个空闲进程,随时等待用于响应用户请求;最大空闲和最小空闲.

        worker:多进程多线程模型,一个线程响应一个用户请求;

            一个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程

                        进行处理;

            多个子进程:每个子进程负责生成多个线程;

            每个线程:负责响应用户请求;

            并发数量:m*n

                m:子进程数量

                n:每个子进程所能创建的最大线程数量;

        event:事件驱动模型,多进程模型,每个进程响应多个请求;

            一个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进

                       行处理

            子进程:基于事件驱动机制直接响应多个请求;

            

            httpd-2.2: 仍为测试使用模型;

            httpd-2.4:event可生产环境中使用;    

           

3.centos6:httpd-2.2程序环境

    配置文件:/etc/httpd/conf/httpd.conf、 /etc/httpd/conf.d/*.conf

    服务脚本:/etc/rc.d/init.d/httpd

        脚本配置文件:/etc/sysconfig/httpd

    主程序文件:

        /usr/sbin/httpd

        /usr/sbin/httpd.event

        /ust/sbin/httpd.worker

    日志文件:

        /var/log/httpd:

            access_log:访问日志

            error_log:错误日志

    站点目录:

        /var/www/html

    模块文件路径:

        /usr/lib64/httpd/modules

    服务控制和启动:

        chkconfig httpd on|off

        service httpd {start|stop|restart|status|configtest|reload}

         

4.httpd配置文件介绍       

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

    ### Section 1: Global Environment

    ### Section 2: 'Main' server configuration

    ### Section 3: Virtual Hosts

    4.2 修改监听的服务端口

         Listen  [IP:]PORT

         (1) 省略IP表示为0.0.0.0

        (2)Listen指令可重复出现多次;             

        Listen  80
        Listen  8080

        (3)修改监听socket,重启服务进程方可生效;

    4.3 持久连接(长连接)

        Persistent Connection:tcp连接建立后,每个资源获取完成后不全断开连接,而是继续等待

        其它资源请求的进行; 

        如何断开持久连接?

            可以通过数量限制和时间限制

        持久连接的副作用:
            对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常响应;

        代码段:           

        KeepAlive  On|Off
        KeepAliveTimeout  15 持久连接的时间限制
        MaxKeepAliveRequests  100 持久连接时最大请求资源数量

 

    4.4 MPM-多路处理模块

        httpd-2.2不支持同时编译多个MPM模块,所以只能编译时选定一个;CentOS 6的rpm包为此专门

        提供了三个应用程序文件,httpd(prefork), httpd.worker, httpd.event,分别用于实现对不

        同的MPM机制的支持。默认使用prefork的MPM模块

        确认现在使用的那个程序文件的方法:

            # ps aux|grep httpd

        查看httpd程序的模块文件列表:

            # httpd  -l

        查看静态编译及动态编译的模块:

            # httpd -M

        更换使用的httpd程序,以支持其它MPM机制:

            /etc/sysconfig/httpd

                HTTPD=/usr/sbin/httpd.{worker,event}

        注意:重启服务进程才能生效

        

        MPM配置:           

            prefork的配置

                            
            StartServers       8 服务器启动时建立的子进程数
            MinSpareServers    5 最小空闲子进程数
            MaxSpareServers   20 最大空闲子进程数
            ServerLimit      256 服务器允许配置的进程数上限
            MaxClients       256 允许同时伺服的最大接入请求数量(最大子进程数)
            MaxRequestsPerChild  4000  每个子进程在其生存期内允许伺服的最大请求数量
            

    worker的配置            

            
             StartServers         4 服务器启动时建立的子进程数
             MaxClients         300 允许同时伺服的最大接入请求数量(最大线程数)
             MinSpareThreads     25 最小空闲线程数
             MaxSpareThreads     75 最大空闲线程数
             ThreadsPerChild     25 每个子进程建立的线程数
             MaxRequestsPerChild  0 每个子进程在其生存期内允许伺服的最大请求数量,0表示进
                                    程永远不会过期
             


    4.5 DSO 动态共享对象

            配置指定实现模块加载

                LoadModule    

            模块文件路径可使用相对路径:

                相对于ServerRoot(/etc/httpd指向的路径)


    4.6 DocumentRoot "Main" server的文档页面路径

        DoucmentRoot指向的路径为URL路径的起始位置

            其相当于站点URL的根路径;

            (FileSystem) /data/vhosts1/index.html  -->  (URL)  /index.html

    

    4.8 站点访问控制

        基于两种机制指明对哪些资源进行何种访问控制

        基于文件系统路径:      

                
            ...
            
            
            ...
            
            
            ...
            

          基于URL路径:  

                    
            ...
            
            
            ...
            

    4.8.1 中“基于源地址”实现访问控制

          (1) Options

              用于定义资源的展示方式,后跟1个或多个以空白字符分隔的“选项”列表;

                Indexes:

                    指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给

                    用户。

                FollowSymLinks:

                    允许跟踪符号链接文件所指向的源文件;

                ExecCGI:允许执行CGI脚本。

                None:

                All:   

           (2)AllowOverride

                httpd允许访问控制相关的哪些指令可以放在.htaccess文件(每个目

                录下都可以有一个)中;                    

                      /data/web/

                            .htaccess

    admin:.htaccess

    p_w_picpaths:.htaccess

                 None:

                 All:

            

            (3)order,allow和eny from  

                 基于ip地址的访问控制

                 order:定义allow和deny的生效次序;写在后面的表示默认法则;

                    Allow from IP/NETWORK/FQDN

                    Deny from  IP/NETWORK/FQDN

                 来源地址格式:

                        IP或者Netaddr                       

                            172.16

    172.16.0.0

    172.16.0.0/16

    172.16.0.0/255.255.0.0

                  

                  来源请求遵循最佳匹配法则机制:

                        order allow,deny(默认机制)白名单

                        order deny,allow(默认机制) 黑名单

                        allow from all

    

    4.8.2 基于用户的访问控制机制

            认证方式有2种:basic 明文,digest消息摘要认证

            安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户

                    认证的原因;

            虚拟账号:仅用于访问某服务时用到的行号和密码

            存储于何处(httpd要有相应的适配模块):

                文本文件;sql数据库;ldap目录存储

            

            basic基于用户认证配置示例:

                (1) 定义安全域

                            
                Options None
                AllowOverride None
                AuthType Basic
                AuthName "SOME_STRING_HERE"
                AuthName "For Administrators"
                AuthUserFile  "/PATH/TO/HTTPD_USER_PASSWD_FILE"
                AuthUserFile  "/etc/httpd/conf/.htpasswd"
                Require  user  username1  username2 ...
                

                允许账号文件中的所有用户登录访问:

                    Require  valid-user

                (2) 提供账号和密码存储(文本文件)

            使用专用命令完成此类文件的创建及用户管理

    htpasswd  [options]   /PATH/TO/HTTPD_PASSWD_FILE  username 

        -c:自动创建此处指定的文件,因此,仅应该在此文件不存在时使用;

                        -m:md5格式加密

                        -s: sha格式加密

                        -D:删除指定用户

                    # htpasswd -c -m /etc/httpd/conf/.htpasswd jerry

                    # htpasswd  -m /etc/httpd/conf/.htpasswd tom

            

            basic基于组账号认证配置示例: 

                (1)定义安全域             

                            
                Options None
                AllowOverride None
                AuthType Basic
                AuthName "String“
                AuthUserFile  "/PATH/TO/HTTPD_USER_PASSWD_FILE"
                AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"
                Require  group  grpname1  grpname2 ...
                

                (2) 创建用户账号和组账号文件;

                    组文件:每一行定义一个组

        GRP_NAME: username1  username2  ...

                

    4.9 定义站点默认主页

           DirectoryIndex  index.html  index.html.var 

         

    4.10 定义路径别名

           Alias  /URL/  "/PATH/TO/SOMEDIR/"

           alias 指定的URL右侧的“/” 相当于后面的路径右侧的“/”

               

           DocumentRoot "/data/vhosts1"    

                http://www.magedu.com/p_w_picpaths/logo.png

    /data/vhosts1/p_w_picpaths/logo.png

           Alias  /p_w_picpaths/  "/tmp/pub/"

                http://www.magedu.com/p_w_picpaths/logo.png

                    /tmp/pub/logo.png

    4.11 设定默认字符集

         AddDefaultCharset  UTF-8

         中文字符集:GBK, GB2312, GB18030

    4.12 日志设定

         日志类型:访问日志 和错误日志 

         错误日志:

            ErrorLog  logs/error_log

            LogLevel  warn

    Possible values include: debug, info, notice, warn, error, crit, alert, emerg.

        访问日志:

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

          LogFormat:定义日志信息格式

          CustomLog:指明日志文件路径及日志格式

          LogFormat format strings:       

            %h:远程主机,客户端IP地址;    
            %l:Remote User, 通常为一个减号(“-”);
            %u:Remote user (from auth; may be bogus if return status (%s) is 401);
                非为登录访问时,其为一个减号;
            %t:服务器收到请求时的时间;
            %r:First line of request,
                即表示请求报文的首行;记录了此次请求的“方法”,“URL”以及协议版本;
            %>s:响应状态码;
            %b:响应报文的大小,单位是字节;不包括响应报文的http首部;
            %{Referer}i:请求报文中首部“referer”的值;
                         即从哪个页面中的超链接跳转至当前页面的;
            %{User-Agent}i:请求报文中首部“User-Agent”的值;即发出请求的应用程序;

       4.13 虚拟主机配置

             站点标识:socket

                 ip相同,但是端口不同

                 ip不同,但是端口默认端口

                 FQDN不同:

                    请求报文首部

             虚拟主机有三种实现方案:  

                 基于ip:为每个虚拟主机准备至少一个独有ip地址;

 基于port:为每个虚拟主机使用至少一个独有的port;

                 基于FQDN:为每个虚拟主机使用至少一个FQDN;

                意:一般虚拟机不要与中心主机混用;因此要使用虚拟主机,得先禁用'main'机;

                禁用方法:注释中心主机的DocumentRoot指令即可;               

             

            虚拟主机的配置方法:              

                        
                ServerName FQDN
                DocumentRoot  ""
            
            其它可用指令:
                ServerAlias:虚拟主机的别名;可多次使用;
                ErrorLog:
                CustomLog:
                 可设置访问控制
                ...
                
                Alias
                ...