httpd简介
   httpd也叫Apache,是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一


httpd特性

  • 虚拟主机

  • 反向代理

  • 负载均衡

  • 丰富的用户认证机制
      basic
      digest

  • 支持第三方模块


httpd的配置文件

  • /etc/httpd/conf/httpd.conf 主要配置文件

  • /etc/httpd/conf.d/*.conf 分段配置文件

  • /etc/sysconfig/httpd MPM模式配置文件


httpd配置文件详解
  httpd.conf主要分3个部分

  • ### Section 1: Global Environment

  • ### Section 2: 'Main' server configuration

  • ### Section 3: Virtual Hosts

 注意:配置文件的修改,只要不是改动过IP或端口,只要service httpd reload重新装载就可以 

   

   1.主页文件配置 DirectoryIndex        

   index.html index.html.var 默认主页顺序从左至右

        

   2.程序路径配置  
   ServerRoot "/etc/httpd"

        

   3.主服务文件路径 
   DocumentRoot "/var/www/html"
   如果开启了虚拟主机,必须把这行注释掉
 
   4.指定监听地址和端口
   Listen [IP]80
   (1) IP省略时表示监听本机上所有可用的IP地址;
   (2) Listen指令可以出现多次,用于指明多个不同的监听端口或套接字:
      Listen 172.16.100.11:80
      Listen 172.16.100.11:8080

        

   5.持久连接
    用途:连接建立后,每个资源获取结束不会断开连接,而继续等待其它资源请求并完成传输;如果不启用该项,非持久连接,浏览器获取每一个资源都要建立一个连接,每个资源都是单独通过专用的连接进行获取

    KeepAlive=off|on 保持连接打开或关闭
    断开条件:
      MaxKeepAliveRequests 100 数量限制,保持连接的最大请求数
      KeepAliveTimeout 15 时间限制,httpd-2.2使用的是秒,httpd-2.4支持毫秒级

   缺点:对并发访问量较大的服务器,开持久连接会有些请求得不到服务;


   6.MPM 多路处理模块,并发请求响应的不同实现
     httpd里有3种模型:prefork worker event
     (1).prefork
     多进程模型。每个进程响应一个请求。预先生成多个进程等待响应请求。因为每个进程间是独立的,某个进程的崩溃并不影响
     其他进程,所以它的稳定性是最好的。
     最重要的是将MaxClients设置为一个足够大的数值以处理潜在的请求高峰,同时又不能太大,以致需要使用的内存超出物理内
     存的大小
     (2).worker
     多进程多线程模型。它可以生成M个进程,然后每个进程再生成N个线程,每个线程响应一个请求,由于线程的开销比进程少,
     所以相对节省资源,适用于海量请求
     (3).event
      事件驱动模型。它不同于以上2种,一个进程可以响应N个请求,2.2版只提供用于测试,2.4版可用于生产环境

         

       各个模型在配置文件中的配置和说明
       # prefork MPM
       # StartServers: number of server processes to start
       # MinSpareServers: minimum number of server processes which are kept spare
       # MaxSpareServers: maximum number of server processes which are kept spare
       # ServerLimit: maximum value for MaxClients for the lifetime of the server
       # MaxClients: maximum number of server processes allowed to start
       # MaxRequestsPerChild: maximum number of requests a server process serves
        
            StartServers       8
            MinSpareServers    5
            MaxSpareServers     20
            ServerLimit      256
            MaxClients        256
            MaxRequestsPerChild  4000
        

       prefork各项解析说明:
       工作原理,主控进程在最初建立“StartServers”个子进程后,为了满足MinSpareServers的设置,需要再创建一个进程,等待一秒钟,继续 创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多 达到每秒32个,直到满足 MinSpareServers设置的值为止。 
    
       StartServers      8 启动时主进程建立的子进程数
       MinSpareServers    5 最少空闲可用的子进程数
       MaxSpareServers   20 最大空闲可用的子进程数.如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多
                       余的子进程
       ServerLimit      256 默认是256,20000是ServerLimit这个参数的最大值。如果需要更大,则必须编译apache
       MaxClients      256 最大客户端请求数,如果请求总数已达到这个值(可通过ps -ef|grep http|wc -l来确认),那么后
                       面的请求就要排队,直到某个正处理请求的完毕,这个值最大不能超过ServerLimit的值
       MaxRequestsPerChild  4000 设置的是每个子进程可处理的请求数。每个子进程在处理了“MaxRequestsPerChild”个请求后
                         将自动销毁。0意味着无限,即子进程永不销毁。虽然缺省设为0可以使每个子进程处理更多的请
                         求,但如果设成非零值也有两点重要的好处:◆ 可防止意外的内存泄漏;◆ 在服务器负载下降
                         的时侯会自动减少子进程数


       # worker MPM
       # StartServers: initial number of server processes to start
       # MaxClients: maximum number of simultaneous client connections
       # MinSpareThreads: minimum number of worker threads which are kept spare
       # MaxSpareThreads: maximum number of worker threads which are kept spare
       # ThreadsPerChild: constant number of worker threads in each server process
       # MaxRequestsPerChild: maximum number of requests a server process serves
        
            StartServers        4
            MaxClients        300
            MinSpareThreads     25
            MaxSpareThreads     75
            ThreadsPerChild     25
            MaxRequestsPerChild  0
        

       worker各项解析说明:
       worker的工作原理是,由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild 线程数,各个线程独立地处理请求。同样,为了不在请求到来时再临时生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;而MaxClients设置了所有子进程中的线程总数。如果现有子进程 中的线程总数不能满足负载,控制进程将派生新的子进程。

            ServerLimit         16 worker下默认子进程数为16
            StartServers         4 开启时启动4个子进程,官方配置很奇怪,默认启动4个,4x25=100个线程,超出
                                  下面75个,又自动杀掉了25个
            MaxClients         300 这里的最大用户请求数=ServerLimit*ThreadsPerChild
            MinSpareThreads     25 最小的线程数
            MaxSpareThreads     75 最大的线程数
            ThreadsPerChild     25 每个进程生成的线程数
            MaxRequestsPerChild  4000 设置的是每个子进程可处理的请求数。每个子进程在处理
                                  了“MaxRequestsPerChild”个请求后将自动销毁。0意味着无限,即子进程永不
                                  销毁。虽然缺省设为0可以使每个子进程处理更多的请求,但如果设成非零值也有
                                  两点重要的好处:◆ 可防止意外的内存泄漏;◆ 在服务器负载下降的时侯会自
                                  动减少子进程数


     httpd-2.2 不支持同时编译多个不同的MPM,rpm安装的httpd-2.2提供了三个文件分别用于实现提供对不同的MPM的支持;
          确认方法:

            # ps aux | grep httpd

        默认为/usr/sbin/httpd,其为prefork; 
       

       查看模块列表
            httpd -l: 查看静态编译的模块
            httpd -M: 查看所有模块,包括静态编译和DSO模块
            httpd -t -D DUMP_MODULES

        

       各模式之间的切换
            控制文件在/etc/sysconfig/httpd,默认是prefork模式

               找到注释的#HTTPD=/usr/sbin/httpd.worker,只要取消注释就可以改为对应的模式

               例如改为event的话是HTTPD=/usr/sbin/httpd.event


    7.DSO 指令模块加载
       LoadModule

       模块路径:可使用相对路径
       相对于ServerRoot指令指向的位置而言;
       注意:建议使用service httpd reload重新装载配置文件

 

    8.Directory域属性
       Options
       Indexes: 当访问的路径下无默认主页面文件存在,且没有指定具体要访问的资源时,会将此路径下的所有资源以列
       表呈现给用户;非常危险,不建议使用;
       FollowSymLinks:如果某页面文件是为指向DocumentRoot之外路径上的其它文件时,将直接显示目标文件的内容;
       None: none
       All: 所有的都启用;

    

    注意:

(1)FollowSymLinks表示允许在此目录使用符号连接。这是一种什么概念呢,比如/va/ftp/data是你存ftp上传数据的地方,而

web目录是/var/www/perfgeeks,假定你想通过http://www.yuzhenhai.com/ftp访问/var/ftp/data目录的数据,你可以在/var/www/perfgeeks目录下建立一个符号连接ftp指向/var/ftp/data。而FollowSymLinks就是指明这种操作是允许的,指示Apache不必去检查ftp文件是否为链接。另外SymLinksIfOwnerMatch则要求和符号连接与其指向的目录或文件属主是同一人(相同的uid)才允许上述操作,即/var/www/perfgeeks/ftp与/var/ftp/data拥有者的uid要求是一样的,这样Apache就必须通过请求系统内核调用stat()来检查文件名每一个组成部分是否为链接,如果是链接就要去核实是否与链接指向的原文件具有相同的uid。我们推荐设置FollowSymLinks,而不要设置SymLinksIfOwnerMatch,这样可以获取更高的性能。因为,假定没有设置FollowSymLinks或者一旦设置了SymLinksIfOwnerMatch,则会额外地调用系统内核函数lstat()来验证目录是否为符号连接。而且是验证文件的每一个组成部分

(2)禁止显示Apache目录列表的方法

  在Options Indexes FollowSymLinks在Indexes前面加上 – 符号。

   即: Options -Indexes FollowSymLinks

  (在Indexes前,加 + 代表允许目录浏览;加 – 代表禁止目录浏览)


   如果是在虚拟主机中,只要增加如下信息就行:

         

            Options -Indexes FollowSymLinks

            AllowOverride None

            Order deny,allow

            Allow from all

       

   这样的话就禁止在test工程下进行目录浏览。


   还有一种方法:

   可以在根目录的 .htaccess 文件中输入

    

    Options -Indexes

    

  就可以阻止Apache 将目录结构列表出来。



     9.站点路径访问控制
       访问控制机制:(1)基于来源地址 (2)基于账号

       定义的方式有两种(其实这里唯一不同的是Directory和Location,一个针对目录,一个针对的是URL,里面还是要用
                   Order或基于用户的认证):
            

            方法一:文件系统路径
                
                      ...
                

           

            方法二:URL路径
                
                      ...
                

            例:系统自带的服务状态用的就是
                
                  SetHandler server-status
                  Order deny,allow
                  Deny from all
                  Allow from
www.a.com
                

             a).基于来源地址的访问控制
              Order: 检查次序
              Order Allow,Deny:先检查allow语句,再检查deny语句,以后面的为准!
              Order Deny,Allow: 先检查deny语句,再检查allow语句,以后面的为准!总之原则就是如有冲突,以后面
                               的语句为准
              Allow from:允许访问的来源地址
              Deny from:拒绝访问的来源地址
            (注意:Order语句必须放在Directory里面)

             

                from后可跟上的地址格式:
                 IP地址;
                 网络地址:
                  172.16
                  172.16.0.0
                  172.16.0.0/16
                  172.16.0.0/255.255.0.0
    
                例:
                如果要禁止部分内容的访问,其他的全部开放:
                Order Deny,Allow
                Deny from ip1 ip2
                或者
                Order Allow,Deny
                Allow from all
                Deny from ip1 ip2

            apache会按照order决定最后使用哪一条规则,比如上面的第二种方式,虽然第二句allow允许了访问,但由于在
                order中allow不是最后规则,因此还需要看有没有deny规则,于是到了第三句,符合ip1和ip2的访问就被禁止
                了。注意,order决定的“最后”规则非常重要,下面是两个错误的例子和改正方式:

                Order Deny,Allow
                Allow from all
                Deny from domain.org
            错误:想禁止来自domain.org的访问,但是deny不是最后规则,apache在处理到第二句allow的时候就已经匹配
                    成功,根本就不会去看第三句。
            解决方法:Order Allow,Deny,后面两句不动,即可。

                

                Order Allow,Deny
                Allow from ip1
                Deny from all
            错误:想只允许来自ip1的访问,但是,虽然第二句中设定了allow规则,由于order中deny在后,所以会以第三
                    句deny为准,而第三句的范围中又明显包含了ip1(all include ip1),所以所有的访问都被禁止了。
             解决方法一:直接去掉第三句。
             解决方法二:
                Order Deny,Allow
                Deny from all
                Allow from ip1


            b).基于用户的访问认证控制
            有两类:a) basic b) digest
            质询:
             WWW-Authenticate: 服务器用401状态拒绝客户端请求,说明需要用户提供用户名和密码;弹出对话框;
            认证:
             Authorization:客户端用户填入账号密码后再次发请求至服务器;认证通过,则请求授权;
    
            以下说明basic的应用
            (1)在相应的主机配置段,针对要受控的目录加入对应的Directory段
                
                 Options=None
                 AuthType=basic
                 AuthUserFile=/root/.htpasswd
                 AuthGroupFile=/root/.htgroup
                 Require vail-user .htpasswd文件中所有用户都能访问
                 Require user= 只允许AuthUserFile中出现的用户访问
                

        

            (2)密码文件.htpasswd和组文件.htgroup的生成
                 使用htpasswd工具生成密码文件(这里的用户是虚拟用户,和系统用户无关)
                 语法:htpasswd [ -c ] [ -m ] [ -D ] passwdfile username
                     -c 生成密码文件,首次添加用户时使用,会一并生成密码文件
                     -m 使用MD5加密密码
                     -s 使用sha1加密密码
                     -D 删除用户
              例:
                   htpasswd -c -m .htpasswd aa 第一次加用户和生成密码文件
                   htpasswd -m .htpasswd bb 后续用户添加
                   htpasswd -D .htpasswd bb 删除用户

                 

                 组文件.htgroup的生成:
                 用vim直接编辑生成,里面内容格式:用户组:用户名(第一个用户名前面貌似要有空格)


     10.虚拟主机
         

        一个物理服务器可以服务于多个站点,每个站点可通过一个或多个虚拟机来实现

        httpd三种类型的虚拟主机:

             基于IP

             基于PORT

             基于FQDN(最常用)

        注意:启用虚拟主机得先关闭“main” server,注释DocumentRoot指令即可       

             # 经测试不关闭也可以,但如果80端口被虚拟主机占用了,那么想要"main server"只要指定另一个监听了的,没
            被虚拟主机占用的端口即可

  

        定义虚拟主机的方法:

          

              ServerName  (不基于主机名做虚拟主机时可不写)

              ServerAlias(可不写)

              DocumentRoot (一定要写)

                  

                      Options

                   

           

        注意:大多数可用全局或‘main’server中的指令,都可以定义有Virtualhost中   


           a).基于IP的虚拟主机
           例:
           
            

            DocumentRoot /var/www/html/a/
           

           
            

            DocmuntRoot /var/www/html/b/
           

          

            b).基于端口(PORT)的虚拟主机
            例:
           
                 

                 DocumentRoot /var/www/html/a/
           

           
                 

                 DocumentRoot /var/www/html/b/
           

          

            c).基于域名(FQDN)的虚拟主机
                 当使用基于域名的虚拟主机,必须加上NameVirtualHost这行
             例:
            NameVirtualHost 192.168.1.1:80
           
                ServerName
www.a.com  基于域名时这个是一定要写的
                DocumentRoot /var/www/html/a/
           

           
                ServerName
www.b.com
                DocumnetRoot /var/www/html/b/
           

        

    11.内置的状态页面
          用途:显示httpd的一些状态
           
                SetHandler server-status
                Order deny,allow
                Deny from all
                Allow from
www.a.com

                   


   12.日志功能

     /var/log/httpd/

          access.log:访问日志

          error.log:错误日志 

      (1)错误日志: 

          Errorlog logs/error_log

          Loglevel warn             


     (2)访问日志:要自定义日志格式

        Customlog logs/access_log combined

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

        combined 为此格式名称,方面后面可直接调用

        %h:客户端地址

        %l:客户端用户通过identd登录时使用的名称,一般为-(空)

        %u:用户认证登录的名字,无登录机制一般-

        %t:收到客户端请求时的时间

        \":显示引号本身,而不作为引用符号

        %r:请求报文首行

           

        %>s:响应状态状态码

        %b:响应报文的大小,单位为字节,不包含首部信息

        %{Refer}i:记录Http首部Referer对应的值:即访问入口,从哪个页面跳转至此页面 “-”表示直接访问

        %{User-Agent}i:记录http首部User-Aget对应的值,即浏览器类型

        详情请参考:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html


   13.路径别名

       Alias /URL/ "/path/to/some_directory/"

     例如:Alias /bbs/ "/web/bbs/htdocs/"

     就跟FTP的虚拟目录一样的咯

     注意:前面的目录最后加“/",后面的目录也一定要加,前面不加,后面的也一定不要加,要保持一致


   14.设定默认字符集

       AddDefaultCharset UTF-8

       常用字符集:GBK,GB2312,GBK18030


    15.CGI脚本路径别名

     CGI:Common Gateway Interface  通过网关接口协议

     使WEB可以跟一个应用程序进行通信,从通信环境中获得结果

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

     URL-->FileSystem Directory

     CGI是不安全的,现在web站点一般都不用,很早以前mail服务可能还会使用,实现起来简便

     在第一行写入

        echo “Content-Type:text/html:

     实现该功能的模块:

        mod_alias

        mod_cgi

     ScriptAlias /URL/ "/path/to/somewhere"  somewhere下的文件可以被执行,也可以在目录中实现

     格式一般为:

        cat << EOF

         Content-Type:text/html

         

         The time is : `date`.

         

         EOF


https配置

   实验环境说明:dns1.dx.com -> httpd 服务器 IP:192.168.255.201 简称dns1
               dns2.dx.com -> 自建CA  IP:192.168.255.200 简称dns2

    1.dns2自建CA及安装openssl
     a) 安装openssl:
          yum -y install openssl
     b) 先查看/etc/pki/tls/openssl.cnf,确定私钥和证书正确的名称和存放位置
          dir           = /etc/pki/CA
          certificate     = $dir/cacert.pem
          private_key     = $dir/private/cakey.pem


     c) 生成私钥:(进去子shell设置好umask后再生成,不会影响当前umask,私钥权限是600)
          (umask 077;openssl genrsa -out /etc/pki/tls/private/cakey.pem 2048 )

     d) 生成自签证书:
          openssl req -new -x509 -key /etc/pki/tls/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365

    

    2.dns1安装openssl
      yum -y install openssl


    3.dns1生成私钥和csr证书请求文件
     mkdir /etc/httpd/ssl 用这个目录存放私钥和证书文件
     openssl genrsa -out /etc/httpd/ssl/httpd.key 2048
     (umask 077;openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr) 同样在子shell中生成


    4.传送证书请求文件给dns2生成证书及回传给dns1
      scp /etc/httpd/ssl/httpd.csr
[email protected]:/tmp
       dns2生成dns1的证书文件:
      openssl ca -in /tmp/httpd.csr -out /tmp/httpd.crt -days 365
     回传证书文件:
          scp /tmp/httpd.crt
[email protected]:/etc/httpd/ssl
     注意:如果提示WARING:REMOTE HOST IDENTIFICATION HAS CHANGED(目标主机的验证码已经发生改变,因为第一次访问时会记录
           该主机的特征码)
     这时候只要把本机当前用户的home/username/.ssl/known_hosts文件内容全部删掉,或里面对应主机的内容清掉就可以了


    5.dns1安装mod_ssl模块及配置
     a) 安装mod_ssl
      yum -y install mod_ssl

     b) 修改ssl.conf配置文件
      安装mod_ssl后,会在/etc/httpd/conf.d/ssl.conf
      vim /etc/httpd/conf.d/ssl.conf,文件会默认生成一个虚拟主机,编辑为和自己虚拟主机一样的设置。这里要注意!如果有
        多个虚拟主机,https只能使用其中的一个!
      例:
      httpd.conf中虚拟主机的配置:
      NameVirtualHost *:80
       
         DocumentRoot /var/www/html/site1
         ServerName
www.a.com

        

       ssl.conf中就要这样改:
       NameVirtualHost *:443
       
           DocumentRoot /var/www/html/site1
           ServerName
www.a.com

        指定私钥和证书的位置:

          SSLCertificateFile /etc/httpd/ssl/httpd.crt
        SSLCertificateKeyFile /etc/httpd/ssl/httpd.key


        至此https配置完成