设为首页 收藏本站
查看: 691|回复: 0

[经验分享] 经典WEB服务器软件 Httpd(Apache)

[复制链接]

尚未签到

发表于 2018-11-21 06:54:25 | 显示全部楼层 |阅读模式


  

  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  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 root@192.168.255.200:/tmp
       dns2生成dns1的证书文件:
      openssl ca -in /tmp/httpd.csr -out /tmp/httpd.crt -days 365
     回传证书文件:
          scp /tmp/httpd.crt root@192.168.255.201:/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配置完成

  

  

  

  

  





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-637499-1-1.html 上篇帖子: Debian 8 Jessie LAMP server tutorial with Apache 2, PHP 5 and MariaDB 下篇帖子: apache httpd 禁止目录浏览 及 安全配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表