httpd常用访问控制配置,常见request响应码以及MPM模型简介

一、Centos7系统下实现httpd-2.2的安装,并分别实现prefork、worker、event等几种工作方式

  centos6中光盘的本地yum源默认httpd程序包是2.2版本的,而centos7中默认的httpd程序包2.4版本的,centos7要安装httpd-2.2就要下载好源码包和对应的依赖包进行编译安装,安装之前先简单讲解一下httpd的这三种处理模型,需要注意的是httpd-2.2的event事件驱动模型还只是测试使用功能并且不支持同时编译多个模块,每次只能选定一个模块。

其对应的配置文为:/etc/httpd/conf/httpd.conf


  prefork:多进程模型,每个进程响应一个请求

    一个主进程:负责生产子进程及回收子进程,负责创建套接字,负责接收请求,并将其派发给某子进程进行处理n个子进程:每个子进程处理一个请求

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


  work:多进程多线程模型,每个线程处理一个用户请求

     一个主进程:负责生成子进程,负责创建套接字,负责接收请求,比将其派发给某子进程进行处理多个子进程:每个子进程负责生成多个线程,每个线程:负责响应用户请求

     并发响应数量:M*N

        M:子进程数量

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


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

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

     子进程:基于事件驱动机制只想响应多个请求


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

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


以下为编译安装httpd-2.2的步骤:

1.安装依赖环境组包

~]#yum install zlib-devel-y

~]#yum install expat-devel -y

~]# yum groupinstall "Development Tools" "ServerPlatform Development" -y

2.提前下载好httpd安装的依赖包apr/apr-util,并解压安装


~]# ls

apr-1.6.5.tar.gz  apr-util-1.6.1.tar.gz  httpd-2.2.32.tar.gz

~]# tar -zxvf apr-1.6.5.tar.gz

~]# tar -zxvf apr-util-1.6.1.tar.gz

~]# cd apr-1.6.5

apr-1.6.5]#./configure --prefix=/usr/local/apr-httpd/ --with-apr=/usr/local/apr-httpd/

apr-1.6.5]# make && make install

apr-1.6.5]#cd /root/apr-util-1.6.1

apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util-httpd/ --with-apr=/usr/local/apr-httpd/

apr-util-1.6.1]# make && make install


3.编译安装httpd-2.2


apr-util-1.6.5]# cd ~

~]# tar -zxvf httpd-2.2.32.tar.gz

~]# cd httpd-2.2.32

httpd-2.2.32]# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd/ --enable-so --enable-deflate --enable-headers --enable-rewrite --with-mpm=prefork --with-apr=/usr/local/apr-httpd/ --with-apr-util=/usr/local/apr-util-httpd/ --with-included-apr

httpd-2.2.32] make && make install


4.启动httpd,并查看80端口是否监听


apache]# /usr/local/apache/bin/httpd -k start

apache]# ss -tnl  | grep 80

LISTEN     0      128         :::80                      :::*                  



httpd2.2默认是prefork方式下工作的,要在几个工作方式中切换,则需要修改etc/sysconfig/httpd下对应的配置,并重启服务即可。


~]# vim /etc/sysconfig/httpd

#HTTPD=/usr/sbin/httpd.worker

HTTPD=/usr/sbin/httpd.event     #将该选项切换到对应模式,重启服务即可







二、简述request报文请求方法和状态响应码


 http请求报文:http request

           http响应报文:http response

              一次http事务:请求<-->响应

      http事务:

         请求:request

         响应:response



         报文语法格式:

            request报文

               <method><request-URL><version>

                  <HEADERS>


                  <enter-body>



            response报文

               <version><status><reason-phrsse>

                  <HEADERS>


                  <enter-body>



           method:请求方法,标明客户端希望服务器对资源进行的动作

              GET,HEAD,POST,PUT(DAV),DELETE,TRACE,OPTIONS

           version:

              HTTP/<major><minor>

           status:

              三位数字:如200,301,302,404,502;标记请求处理过程中发生的情况

           reason-phrase:

              状态码所标记的状态的简要描述

           headers:

              每个请求或响应报文可包含任意个首部,每个首部都有首部名称,后面各一个冒号,而后跟上一个可选空格,接着是一个值

           enter-body:

              请求时附加的数据或响应时附加的数据



        method(方法):            

           GET:从服务器获取一个资源

           HEAD:只从服务器获取文档的响应首部

           POST:向服务器发动要处理的数据

           PUT:将请求的主体部分存储在服务器上

           DELETE:请求删除服务器上指定的文档

           TRACE:追踪请求到达服务器中间经过的代理服务器

           OPTIONS:请求服务器返回对指定资源支持使用的请求方法


           协议查看或分析工具:

              tcpdump, tshark, wireshark



        status(状态码):

           1xx:100-101,信息提示

           2xx:200-206,成功

           3xx:300-305,重定向

           4xx:400-415,错误类信息,客户端错误

           5xx:500-505,错误类信息,服务器端错误


           常用状态码:

              200:成功,请求的所有数据通过响应报文的enter-body部分发送;OK

              301:请求的URL指向的资源已经被删除,但在响应报文中通过首部Location指明了资源现在所处的新位置;Moved Permanently

              302:与301相似,但在响应报文中通过Location指明资源现状所处临时新位置;Found

              304:客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端;Not Modified

              401:需要输入账号和密码认证方式方能访问资源;Unauthorized

              403:请求被禁止;Forbidden

              404:服务器无法找到客户端请求的资源;Not Found

              500:服务器内部错误;Internal Server Error

              502:代理服务器从后端服务器收到了一条伪响应;Bad Gateway



三、详细描述httpd虚拟主机、站点访问控制、基于用户的访问控制、持久链接等应用配置实例


httpd基于虚拟主机:


虚拟主机


   站点标识:socket

     IP相同,但端口不同

     IP不同,但端口均为默认端口

     FQDN不同:

       请求报文首部

       Host:www.listen.com



   有三种实现方案:

     基于IP:

       为每个虚拟主机准备至少一个IP地址


    基于port:

       为每个虚拟主机使用至少一个独立的port


    基于FQDN:

       为每个虚拟主机使用至少一个FQDN


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

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



    虚拟主机的配置方法:

       <VirtualHost IP:PORT>

          ServerName FQDN

          DocumentRoot ""

       </VirtualHost>


    其他可用指令:

       ServerAlias:虚拟主机的别名,可多次使用

       ErrorLog:错误日志

       CustomLog:访问日志

          <Directory "">

              ....

          </Directory>

          Alias

             ......



    基于IP的虚拟主机示例:

       <VirtualHost 192.168.73.137:80>

          ServerName www.ilinux.com

          DocumentRoot "/var/www/ilinux"

          <Directory "/var/www/ilinux/">

            Options None

            Allowoverride None

            Require all granted

          </Directory>

          Customlog "logs/ilinux_access.log"   combined

        </VirtualHost>



        <VirtualHost 192.168.73.138:80>

           ServerName www.iunix.com

           DocumentRoot "/var/www/iunix"

           <Directory "/var/www/iunix/">

             Options None

             Allowoverride None

             Require all granted

           </Directory>

           Customlog "logs/iunix_access.log"   combined

        </VirtualHost>

             


    基于端口的虚拟主机:

        <VirtualHost 192.168.73.137:80>

           ServerName www.ilinux.com

           DocumentRoot "/var/www/ilinux"

           <Directory "/var/www/ilinux/">

              Options None

              Allowoverride None

              Require all granted

           </Directory>

           Customlog "logs/ilinux_access.log"   combined

        </VirtualHost>



        <VirtualHost 192.168.73.137:8080>

           ServerName www.iunix.com

           DocumentRoot "/var/www/iunix"

           <Directory "/var/www/iunix/">

              Options None

              Allowoverride None

              Require all granted

           </Directory>

           Customlog "logs/iunix_access.log"   combined

        </VirtualHost>   



    基于FQDN的虚拟主机:

        <VirtualHost 192.168.73.137:80>

           ServerName www.ilinux.com

           DocumentRoot "/var/www/ilinux"

           <Directory "/var/www/ilinux/">

             Options None

             Allowoverride None

             Require all granted

           </Directory>

           Customlog "logs/ilinux_access.log"   combined

       </VirtualHost>



       <VirtualHost 192.168.73.137:80>

          ServerName www.iunix.com

          DocumentRoot "/var/www/iunix"

          <Directory "/var/www/iunix/">

             Options None

             Allowoverride None

             Require all granted

          </Directory>

          Customlog "logs/iunix_access.log"   combined

      </VirtualHost>  



     注意:如果是httpd-2.2,则使用基于FQDN的虚拟主机时,需要事先使用如下指令:

        NameVirtualHost IP:PORT




站点访问控制常见机制

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


    文件系统路径:

       <Directory "">

          ...

       </Directory>


       <File "">

          ....

       </File>

                  

       <FileMatch "">

          .....

       </FileMatch>



    URL路径:

      <Location "">

         ....

      </Location>


      <LocationMatch "">

         ....

      </LocationMatch>



      <Directory>中“基于源地址”实现访问控制



    httpd-2.2

      (1)AllowOverride

         与访问控制相关的那些指令可以放在.htaccess文件(每个目录下都可以有一个)中

            ALL

            None


      (2)order和allow、deny

          order:定义生效次序,写在后面的表示默认法则


          Allow from,Deny from

            来源地址:

              IP

              NetAddr:

                192.168

                192.168.0.0

                192.168.0.0/24

                192.168.0.0/255.255.255.0



    httpd-2.4

       基于IP控制:

          Require ip IP地址或网络地址

          Require not ip IP地址或网络地址


       基于主机名控制

          Require host 主机名或域名

          Require not host 主机名或域名




    控制页面资源允许所以来源的主机可访问:

       httpd-2.2

         <Directory "">

            ...

           Order allow,deny

           Allow from all

         </Directory>


       httpd-2.4

         <Directory "">

            ...

            Require all granted

         </Directory>



    控制页面资源拒绝所有来源的主机可访问:

       httpd-2.2

          <Directory "">

             ...

            Order allow,deny

             Deny from all

          </Directory>



       httpd-2.4

           <Directory "">

              ...

              Require all denied

           </Directory>



       Options

         后跟1个或多个空白字符分隔的“选项”列表

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

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

            None

            All:All options except for MultiViews.










基于用户的访问控制


   认证质询:

     WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码


   认证:

     Authorization:客户端用户填入账号和密码后再次发动请求报文,认证通过时,则服务器发送响应的资源


       认证的方式有两种:

         basic:明文

         digest:消息摘要认证


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


       用户的账号和密码存放于何处?

          虚拟账号:仅能用于访问某服务时用到的认证标识


          存储:

            文本文件

            SQL数据库

            ldap目录存储


       basic认证配置示例:

         (1)定义安全域

            <Directory "">

              Options None

              AllowOverride None

              AuthType basic

              AuthName "提示的说明"

              AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"

              Require user username1 username2 ...

            </Directory>


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

              Require valid-user



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

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

               htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username

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

                  -m:MD5格式加密

                  -s:sha格式加密

                  -D:删除指定用户

                  -b:批模式添加用户

                      htpasswd -b [options] /PATH/TO/HTTPD_PASSWD_FILE username password


          另外:基于组账号进行认证

            (1)定义安全域

                <Directory "">

                  Options None

                  AllowOverride None

                  AuthType basic

                  AuthName "提示的说明"

                  AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"

                  AuthGroupFile "/PATH/TO/HTTPD_USER_GROUPE_FILE"

                  Require group grpname1 grpname2 ...

                </Directory> 


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

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

                   GRP_NAME:username1 username2 ...  



持久连接

   Persistent Connection:tcp连接建立后,每个资源获取完成后不全断开连街,而是继续等待其他资源请求的进行

     如何断开?

       数量限制

       时间限制


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

       折中:使用较短的持久连接时长,以及较少的请求数量



     KeepAlive ON|OFF

     KeepAliveTimeout 15

     MaxKeepAliveRequests 100


   测试:

     telnet WEB_SERVER_IP PORT

     GET /URL HTTP/1.1

     Host:WEB_SERVER_IP


  注意:httpd-2.4的KeepAliveTimeout可以是毫秒级的


上一篇:NoClassDefFoundError: org/apache/hadoop/hbase/coprocessor/BaseRegionObserver


下一篇:单元测试包junit报错 java.lang.NoClassDefFoundError