Linux学习之路-经典WEB服务器软件 Httpd


经典WEB服务器软件 Httpd


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


httpd特性

        a) 虚拟主机
        b) 反向代理
        c) 负载均衡
        d) 丰富的用户认证机制
                basic
                digest
        e) 支持第三方模块


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
        <IfModule prefork.c>
            StartServers       8
            MinSpareServers    5
            MaxSpareServers   20
            ServerLimit      256
            MaxClients       256
            MaxRequestsPerChild  4000
        </IfModule>

        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
        <IfModule worker.c>
            StartServers         4
            MaxClients         300
            MinSpareThreads     25
            MaxSpareThreads     75
            ThreadsPerChild     25
            MaxRequestsPerChild  0
        </IfModule>

        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  0 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 <module_name> <module_path>

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

 

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


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

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

            方法一:文件系统路径
                <Directory "/PATH/TO/SOMEDIR">
                      ...
                </Directory>
           

            方法二:URL路径
                <Location "/URL">
                      ...
                </Location>
            例:系统自带的服务状态用的就是
                <Location /server-status>
                  SetHandler server-status
                  Order deny,allow
                  Deny from all
                  Allow from
www.a.com
                </Location>

             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段
                <Directory "/var/www/html/a/emc/">
                 Options=None
                 AuthType=basic
                 AuthUserFile=/root/.htpasswd
                 AuthGroupFile=/root/.htgroup
                 Require vail-user .htpasswd文件中所有用户都能访问
                 Require user= 这里可以只指定列表中允许的用户
                </Directory>

        

            (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.虚拟主机
           a).基于IP的虚拟主机
           例:
           <VirtualHost 192.168.1.2:80>
            ServerName
www.a.com
            DocumentRoot /var/www/html/a/
           </VirtualHost>

           <VirtualHost 192.168.1.3:80>
            ServerName
www.b.com
            DocmuntRoot /var/www/html/b/
           </VirtualHost>

          

            b).基于端口的虚拟主机
            例:
            <VirtualHost 192.168.1.1:8080>
                ServerName
www.a.com
                DocumentRoot /var/www/html/a/
            </VirtualHost>

            <VirtualHost 19.168.1.1:81>
                ServerName
www.b.com
                DocumentRoot /var/www/html/b/
           </VirtualHost>

          

            c).基于域名的虚拟主机
               当使用基于域名的虚拟主机,必须加上NameVirtualHost这行
             例:
            NameVirtualHost 192.168.1.1:80
            <VirtualHost 192.168.1.1:80>
                ServerName
www.a.com
                DocumentRoot /var/www/html/a/
            </VirtualHost>

            <VirtualHost 193.168.1.1:80>
                ServerName
www.b.com
                DocumnetRoot /var/www/html/b/
            </VirtualHost>

        

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

                    </Location>



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
       <VirtualHost *:80>
           DocumentRoot /var/www/html/site1
           ServerName
www.a.com

        

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

        指定私钥和证书的位置:

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


        至此https配置完成






你可能感兴趣的:(apache,Web,service,httpd)