Apache基本配置:

1)设置监听地址和端口:

   语法:Listen [IP:]PORT

   例子:

         Listen 80     #表示监听在本机所有接口的80端口上

         Listen 172.16.100.1:8080  #表示只监听在172.16.100.1接口的8080端口上

   注意:

         Listen指令可以重复使用

         如果apache需要使用多个端口,则必须写多行Listen选项

   配置文件语法测试:

        #service httpd configtest    //实际是调用httpd -t
        #httpd -t
        #service httpd restart      //重启服务

   注意:大多数配置修改后,使用service httpd reload即能生效;

         而修改了监听地址和端口则需要重启服务。


2)配置服务器HTTP响应头:

   语法:ServerTokens Major|Minor|Minimal|ProductOnly|OS|Full

   默认值:ServerTokens Full

   说明:此指令控制了Server回送给客户端的响应头域是否包含关于服务器OS类型和编译进的模块描述信息。

   详细说明:  

指令回送格式
ServerTokens ProductOnly服务器会发送:Server:Apache 
ServerTokens Major服务器会发送:Server:Apache/2
ServerTokens Minor 服务器会发送:Server:Apache/2.0 
ServerTokens Minimal服务器会发送:Server:Apache/2.0.41
ServerTokens OS服务器会发送:Server: Apache/2.0.41 (Unix)
ServerTokens Full服务器会发送:Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2 

   注意:此设置将作用于整个服务器,而且不能在虚拟主机的管理层次上予以启用或禁用。


3)设置httpd工作目录:

   语法:ServerRoot "/path/to/somewhere"

   默认值:ServerRoot "/etc/httpd"

   说明:此指令用于指定守护进程httpd的运行目录,httpd在启动之后将自动将进程的当前目录改变为这个目录。

   注意:路径最后不要带"/"


4)设置PidFile路径:

   语法:PidFile  path/to/somewhere

   默认值:PidFile run/httpd.pid

   注意:这里使用的是相对路径;

         相对于httpd的工作目录;

         /etc/httpd/run这个目录是链接到/var/run/httpd目录


5)设置链接超时:

   语法:Timeout 数字(单位为秒)

   默认值:Timeout 60

   

6)设置保持连接:

   语法:keepAlive {on|off}               //是否启用长连接

         MaxKeepAliveRequests  数字       //设置每个连接的最大请求资源数

         KeepAliveTimeout  数字(单位为秒) //两次请求的最大间隔时间

   默认值:    

         KeepAlive Off   

         MaxKeepAliveRequests 100

         KeepAliveTimeout 15

   注意:对动态内容的服务器建议关闭keepalive

   keepAlive配置的合理使用:

在 Apache 服务器中,KeepAlive 是一个布尔值,On 代表打开,Off 代表关闭,这个指令在其他众多的 HTTPD 服务器中都是存在的。

  KeepAlive 配置指令决定当处理完用户发起的 HTTP 请求后是否立即关闭 TCP 连接,如果 KeepAlive 设置为 On,那么用户完成一次访问后,不会立即断开连接,如果还有请求,那么会继续在这一次 TCP 连接中完成,而不用重复建立新的 TCP 连接和关闭 TCP 连接,可以提高用户访问速度。

  那么我们考虑3种情况:
   1。用户浏览一个网页时,除了网页本身外,还引用了多个 javascript. 文件,多个 css 文件,多个图片文件,并且这些文件都在同一个 HTTP 服务器上。
  2。用户浏览一个网页时,除了网页本身外,还引用一个 javascript. 文件,一个图片文件。
  3。 用户浏览的是一个动态网页,由程序即时生成内容,并且不引用其他内容。

  对于上面3中情况,我认为:1 最适合打开 KeepAlive ,2 随意,3 最适合关闭 KeepAlive

  下面我来分析一下原因。

  在 Apache 中,打开和关闭 KeepAlive 功能,服务器端会有什么异同呢?

  先看看理论分析。

  打开 KeepAlive 后,意味着每次用户完成全部访问后,都要保持一定时间后才关闭会关闭 TCP 连接,那么在关闭连接之前,必然会有一个 Apache 进程对应于该用户而不能处理其他用户,假设 KeepAlive 的超时时间为 10 秒种,服务器每秒处理 50 个独立用户访问,那么系统中 Apache 的总进程数就是 10 * 50 = 500 个,如果一个进程占用 4M 内存,那么总共会消耗 2G 内存,所以可以看出,在这种配置中,相当消耗内存,但好处是系统只处理了 50次 TCP 的握手和关闭操作。

  如果关闭 KeepAlive,如果还是每秒50个用户访问,如果用户每次连续的请求数为3个,那么 Apache 的总进程数就是 50 * 3 = 150 个,如果还是每个进程占用 4M 内存,那么总的内存消耗为 600M,这种配置能节省大量内存,但是,系统处理了 150 次 TCP 的握手和关闭的操作,因此又会多消耗一些 CPU 资源。

  在看看实践的观察。

  我在一组大量处理动态网页内容的服 务器中,起初打开 KeepAlive 功能,经常观察到用户访问量大时Apache进程数也非常多,系统频繁使用交换内存,系统不稳定,有时负载会出现较大波动。关闭了 KeepAlive 功能后,看到明显的变化是: Apache 的进程数减少了,空闲内存增加了,用于文件系统Cache的内存也增加了,CPU 的开销增加了,但是服务更稳定了,系统负载也比较稳定,很少有负载大范围波动的情况,负载有一定程度的降低;变化不明显的是:访问量较少的时候,系统平均 负载没有明显变化。


  总结一下:
  在内存非常充足的服务器上,不管是否关闭 KeepAlive 功能,服务器性能不会有明显变化;
  如果服务器内存较少,或者服务器有非常大量的文件系统访问时,或者主要处理动态网页服务,关闭 KeepAlive 后可以节省很多内存,而节省出来的内存用于文件系统Cache,可以提高文件系统访问的性能,并且系统会更加稳定。


   补充:
  关于是否应该关闭 KeepAlive 选项,我觉得可以基于下面的一个公式来判断。

  在理想的网络连接状况下, 系统的 Apache 进程数和内存使用可以用如下公式表达:
HttpdProcessNumber = KeepAliveTimeout * TotalRequestPerSecond / Average(KeepAliveRequests)
HttpdUsedMemory = HttpdProcessNumber * MemoryPerHttpdProcess
  换成中文:
总Apache进程数 = KeepAliveTimeout * 每秒种HTTP请求数 / 平均KeepAlive请求
Apache占用内存 = 总Apache进程数 * 平均每进程占用内存数

  需要特别说明的是:
  [平均KeepAlive请求] 数,是指每个用户连接上服务器后,持续发出的 HTTP 请求数。当 KeepAliveTimeout 等 0 或者 KeepAlive 关闭时,KeepAliveTimeout 不参与乘的运算从上面的公式看,如果 [每秒用户请求] 多,[KeepAliveTimeout] 的值大,[平均KeepAlive请求] 的值小,都会造成 [Apache进程数] 多和 [内存] 多,但是当 [平均KeepAlive请求] 的值越大时,[Apache进程数] 和 [内存] 都是趋向于减少的。

  基于上面的公式,我们就可以推算出当 平均KeepAlive请求 <= KeepAliveTimeout 时,关闭 KeepAlive 选项是划算的,否则就可以考虑打开。


7)设置Prefork MPM(多道处理模块):

   prefork:预先fork进程模型

          主进程的作用:

                       1,启动服务时,绑定特权端口(小于1024的端口)

                       2,管理各子进程,包括子进程的创建和销毁

                       3,读取并分析主配置文件

                       4,监听每一个客户端请求并给它派发子进程

   默认值:       

   <IfModule prefork.c>

   StartServers       8     //设置预生成的子进程数

   MinSpareServers    5     //设置预生成最小空闲进程数

   MaxSpareServers   20     //设置预生成最大空闲进程数

   ServerLimit      256     //设置最多启动多少个子进程数

   MaxClients       256     //设置允许连接进来的最大客户端数量

   MaxRequestsPerChild  4000 //设置每个子进程可处理的请求数,0代表无限制。

   </IfModule>


   注意:maxclients的值一般小于等于serverlimit;

         maxclients大于serverlimit,当客户端数量达到maxclients时,则多出serverlimit的客户端只能排队等待;

         maxclients小于serverlimit,则总有一部分服务器进程处于闲置状态;

         一个子进程接受的请求次数超过MaxRequestsPerChild值时,这个子进程会被重启。

     

   练习题:

         1,假如每一个客户端请求进来,到响应处理结束需要50ms。请问在一秒钟内一个服务器进程可以处理多少个这样的请求?

           答案:20个   1000/50=20

         2,一个子进程响应处理时间依然为50ms,服务器一共启动了256个子进程。请问一秒钟内服务器可以处理的最大连接数?一天内服务器可以处理的最大连接数?

           答案: 一秒钟:  256*20     

                  一天:    256*20*86400


8)设置Worker MPM(多道处理模块):

   worker:一个进程生成多个线程,一个线程响应一个客户端请求;

           一个进程生成的线程不能过多,有一个最佳值。

   启用worker模型:       

                # vi /etc/sysconfig/httpd      //httpd启动时会读取这个配置文件
                  HTTP=/usr/sbin/httpd_worker  //设置使用worker模型
                # service httpd restart        //重新启动httpd


   默认值:

   <IfModule worker.c>

   StartServers         4    //设置预生成的子进程数

   MaxClients         300    //最多允许连接进来的客户端个数

   MinSpareThreads     25    //最小空闲线程数

   MaxSpareThreads     75    //最大空闲线程数

   ThreadsPerChild     25    //设置每个子进程数预生成的线程数

   MaxRequestsPerChild  0    //设置每个子进程最大请求数,0表示无限制

   </IfModule>


   注意:

        到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为"0",子进程将永远不会结束。

        将MaxRequestsPerChild设置成非零值有两个好处:
           * 可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
           * 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。

        对于KeepAlive链接,只有第一个请求会被计数。事实上,它改变了每个子进程限制最大链接数量的行为。

     

    练习题:

           1,假如一个进程最多生成25个线程,期望最多150个客户端同时连接进来,那么需要启动多少个进程?

             答案:6个  150/25=6  

           2,依据work的默认设置,请问服务器满负荷服务时,需要多少个子进程?

             答案:12个  300/25=12


9)设置Event MPM(多道处理模块):

   event:一个进程处理多个客户端请求

    

   默认值:

   <IfModule mpm_event_module>

   StartServers      3           //启动多少个进程 一个进程响应多个用户请求

   MinSpareThreads   75          //最小空闲线程数

   MaxSpareThreads   250         //最大空闲线程数

   ThreadsPerChild   25          //每个进程最多生成多少个线程数

   MaxRequestWorkers  400        //最大提供多少个工作线程

   MaxConnectionsPerChild 0      //一个线程响应多少个客户端请求 0表示无限制 

   </IfModule>

    

10)设置模块加载

   语法:LoadModule  模块名称  模块路径

   例子:LoadModule  foo_module modules/mod_foo.so 

   注意:这个模块路径是相对于httpd的工作目录;

         /etc/httpd/modules是链接到/usr/lib64/httpd/modules


11)设置加载扩展配置文件:

   语法:Include conf.d/*.conf


12)显示服务器运行状态的详细信息:

   语法:ExtendedStatus On

   说明:Apache服务器可以通过特殊的HTTP请求,来报告自身的运行状态,打开这个ExtendedStatus 参数可以让服务器报告更全面的运行状态信息。

   注意:当使用"server-status"时,可以开启此功能来获取更为详细的服务器状态信息。


13)配置启动服务进程的用户和组:

    语法:User apache

          Group apache


14)设置管理员邮箱地址:

    语法:ServerAdmin root@localhost

    说明:这个指令用来设置服务器返回给客户端的错误信息中包含的管理员邮件地址。便于用户在收到错误信息后能及时与管理员取得联系。


14)设置站点名称:
    语法:ServerName www.example.com:80

    注意:如果设置这项  在启动apache的时候 apache会去试图反解当前主机监听的IP地址去得到主机名 如果反解不出来 就会报错。并使用127.0.0.1。

          解决办法:           

                    1,启动这个选项 并设置站点名称

                    2,添加监听地址对应的主机名 host记录

                       #vi /etc/hosts

                       172.16.100.1   www.example.com   www


站点发布的基本设置:

1)设置站点主目录的位置:

   语法:DocumentRoot "路径"

   默认值:DocumentRoot "/var/www/html"

2)指定首页文件名:

   语法:DirectoryIndex  文件名

   默认值:DirectoryIndex index.html index.html.var

3)设置特定目录的相关属性:

   语法:<Directory "路径">

          .........

          配置命令

          ........

         </Directory>

   配置命令:

           1,Options [+|-] 选项

             功能:设置目录的各种特性。主要特性有:

                   ExecCGI      允许执行CGI脚本

                   FollowSymLinks   允许使用符合链接

                   SymLinksifOwnerMatch  如果那个链接目标文件的属主是当前运行apache程序的属                         

                                         主,就可以符号链接

                   Includes     允许使用服务器包含

                   Indexes      允许使用自动生成目录列表

                   ALL          所有特性,除MultiViews外

           2,AllowOverride  选项

             功能:允许存在于.htaccess文件中的指令类型。选项有:

Authconfig 

允许使用与认证授权相关的指令(AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, Require, 等)。

fileinfo

允许使用控制文档类型的指令(DefaultType, ErrorDocument, ForceType, LanguagePriority, SetHandler, SetInputFilter, SetOutputFilter, mod_mime中的 Add* 和 Remove* 指令等等)、控制文档元数据的(Header,RequestHeader,  SetEnvIf, SetEnvIfNoCase, BrowserMatch, CookieExpires, CookieDomain,  CookieStyle, CookieTracking, CookieName)、mod_rewrite中的指令(RewriteEngine, RewriteOptions, RewriteBase, RewriteCond, RewriteRule)和mod_actions中的Action指令。

 Indexes  

允许使用控制目录索引的指令(AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName, 等)。

Limit允许使用控制主机访问的指令(Allow, Deny, Order)。
Options

允许使用控制指定目录功能的指令(Options和XBitHack)。可以在等号后面附加一个逗号分隔的(无空格的)Options选项列表,用来控制允许Options指令使用哪些选项。

All所有具有 “.htaccess” 作用域的指令都允许出现在 .htaccess 文件中。
None.htaccess 文件将被完全忽略


4)其他容器类指令:

   1,配置特定URL属性

       <Location URL-PATH>

        ............

       </Location>

   

       <LocationMatch 正则表达式>

        ............

       </LocationMatch>

   2,配置特定文件属性

       <Files 文件名>

        .............

       </Files>

   

       <FilesMatch   正则表达式>

        .............

       </FilesMatch>


5)配置语言与字符集:

   设置所有文件的默认语言:

             DefaultLanguage  语言缩写

   设置指定语言所对应的扩展名:

             AddLanguage  语言缩写  扩展名

   设置默认字符集:    

             AddDefaultCharset UTF-8


配置虚拟主机:

1)apache支持的虚拟主机种类:

   --基于IP地址的虚拟主机

   --基于域名的虚拟主机

   --基于端口的虚拟主机

   --动态虚拟主机

  注意:虚拟主机和主服务器不能同时使用,关闭主服务器,注释主服务器的DocumentRoot即可。

2)虚拟主机定义基本格式

    <VirtualHost IP:PORT>

     ServerName

     DocumentRoot ""

    </VirtualHost>

3)基于端口的虚拟主机:

       1,设置监听端口:

            Listen 80

            Listen 8080

       2,关闭主服务器

            #DocumentRoot "/var/www/html" //注释主站根目录

       3,添加虚拟主机记录

            <VirtualHost *:80>

            ServerName  www.a.com

            DocumentRoot "/web/host1"

            </VirtualHost>

            <VirtualHost *:8080>

            ServerName  www.b.org

            DocumentRoot "/web/host2"

            </VirtualHost>

       4,创建主页面

            # mkdir -pv /web/host{1,2}

            # echo "<h1>Host1</h1>" >/web/host1/index.html

            # echo "<h1>Host2</h1>" >/web/host2/index.html

       5,客户端测试

            # elinks http://172.16.100.1 

            # elinks http://172.16.100.1:8080

4)基于IP的虚拟主机: 

       1,添加辅助地址

            # ifconfig eth0:0 172.16.100.2 

       2,添加虚拟主机记录

           <VirtualHost 172.16.100.1:80>

           ServerName  www.a.com

           DocumentRoot "/web/host1"

           </VirtualHost>

           <VirtualHost 172.16.100.2:80>

           ServerName  www.b.org

           DocumentRoot "/web/host2"

           </VirtualHost>

       3,关闭主服务器

           #DocumentRoot "/var/www/html"

5)基于域名的虚拟主机:

   httpd-2.2: NameVirtualHost 需要启用;

   httpd-2.4以后不需要这个指令。

       1, 清空辅助地址

           #ifconfig eth0:0 down

       2, 启用NameVirtualHost

           NameVirtualHost 172.16.100.1:80 //监听地址和端口 必须与虚拟主机设置中的保持一致      

       3, 添加虚拟主机记录

   <VirtualHost 172.16.100.1:80>

           ServerName  www.a.com

           DocumentRoot "/web/host1"

           </VirtualHost>

           <VirtualHost 172.16.100.1:80>

           ServerName  www.b.org

           DocumentRoot "/web/host2"

           </VirtualHost>

       4, 添加主机解析记录

           # echo "172.16.100.1 www.a.com" >>/etc/hosts

           # echo "172.16.100.1 www.b.org" >>/etc/hosts

       5, 测试

           # elinks -dump http://www.a.com   //-dump 表示不进入交互模式 直接查看网页内容

           # elinks -dump http://www.b.org 

6)动态虚拟主机:

   —基于IP地址的动态虚拟主机
a.给服务器绑定多个IP地址
b.修改httpd.conf
   #vi  httpd.conf
   .........
   virtualdocumentrootip    可变化的路径
   ........
注:可变化的路径就是路径中包含了变量,常用的变量格式如下:
    %N  表示客户机输入的IP地址(域名)的从左向右的第N部分,其中%0代表整个IP地址(域名)
    %-N表示客户机输入的IP地址(域名)的从右到左的第N部分
    %+N表示客户机输入的IP地址(域名)的从左边第N部分到结尾
    %-N+表示客户机输入的IP地址(域名)的从右边第N部分到开头
如:www.abc.com, %0=www.abc.com,%2=abc, %-1=com%, %2+=abc.com  %-2+=www.abc
例如:virtualdocumentrootip    /web/%0
c.重启服务


  —基于域名的动态虚拟主机
a.申请多个域名指向服务器
b.修改httpd.conf
 #vi  httpd.conf
   ...........
  virtualdocumentroot    可变化的路径
   ...........
c.重启服务
注:配置基于域名虚拟主机时必须将usecanonicalname设为off


7)混合使用:

       1,添加虚拟主机记录

          <VirtualHost 172.16.100.1:80>

          ServerName  www.a.com

          DocumentRoot "/web/host1"

          </VirtualHost>

          <VirtualHost 172.16.100.1:80>

          ServerName  www.b.org

          DocumentRoot "/web/host2"

          </VirtualHost>

          <VirtualHost 172.16.100.2:80>

          ServerName  www.c.net

          DocumentRoot "/web/host3"

          </VirtualHost>

          <VirtualHost 172.16.100.2:8080>

          ServerName  www.d.gov

          DocumentRoot "/web/host4"

          </VirtualHost>

      2,启用监听8080端口

          Listen 172.16.100.2:8080

      3,配置辅助地址

         # ifconfig eth0:0 172.16.100.2 

      4,创建主页面

         # mkdir /web/host{3,4}

         # echo "<h1>Host3</h1>" >/web/host3/index.html

         # echo "<h1>Host4</h1>" >/web/host4/index.html


配置用户认证和主机访问控制:

1)主机访问控制:

   作用:限制访问站点资源的客户端来源,即设置允许或拒绝访问服务器资源的来源主机。

   配置指令:

         Order allow,deny|deny,allow

         Allow from  all|IP地址|网络号       //定义允许列表

         Deny from  all|IP地址|网络号       //定义拒绝列表

         指令说明:Order指令是用来定义allow和deny哪一个为默认法则;

                   写在后面的为默认法则;

                   写在前面的指令,没有显示定义的,即受后面指令控制。

         例子:

               Order allow,deny

               Allow from 172.16.0.0/16    //仅允许这个网段内的客户端访问


               Order deny,allow

               Deny from 172.16.0.0/16     //仅拒绝这个网段内的客户端访问


               Order allow,deny

               Allow from 172.16.0.0/16

               Deny from 172.16.100.7      //最长匹配原则 172.16.100.7是被拒绝的

   注意:这些命令可放directory/files/location容器中,也可以放在.htaccess文件


2)用户认证:

   用户认证的分类:

                 基本用户认证

                 摘要用户认证

   --基于文本文件的用户认证配置指令:

                 AuthType   basic|digset     //指定用户认证的类型

                 AuthName   "字符串"         //配置用户认证的提示信息

                 AuthUserfile  文件路径      //配置存放用户口令信息的文件路径

                 Require  user   用户名      //指定可以访问站点资源的用户名

                 Require  group  用户组名    //指定可以访问站点资源的组名

                 Require  valid-user         //配置允许所有经过身份验证的用户都能访问资源

                 Authgroupfile   文件路径    //配置存放用户组信息的文件路径

                Satisfy  all|any           //配置主机访问控制和用户认证之间的相互关系

                             当一个目录同时使用主机访问控制和用户认证两种规则时,

                             Satisfy值为All时,表示必须同时满足两个规则才能访问;

                             Satisfy值为Any时,表示任意一个规则满足都可以访问。

     注意:这些命令可放directory/files/location容器中,也可以放在.htaccess文件

   ---为客户端访问创建web用户: 

             # htpasswd -c -m /etc/httpd/conf/.htpass jerry
               -c  表示创建认证文件
               -m  指定认证文件
             # cat /etc/httpd/conf/.htpass
             # htpasswd -m  /etc/httpd/conf/.htpass tom  
                //如果认证文件已经存在则不需要-c选项,否则会覆盖之前的文件

     例子:

           1,创建用户

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

           2,设置用户认证     

            <Directory "/web/host1">

            Options None

            AllowOverride  AuthConfig

            AuthName "Realm"

            AuthType Basic           //有基本认证和摘要认证

            AuthUserFile /path/to/passwords   //指定认证文件路径

            Require jerry tom        //指明哪些用户可以访问  valid-user  表示所有用户

            </Directory>


     注意:保证apache的启动用户对用户信息文件具有读权限


3)apache 2.4中使用的新方法:

   基于IP的访问控制:

         语法格式:      

             Require ip IPADDR

             Require not ip IPADDR

         IP地址格式:          IP 

                   NETWORK/NETMASK

                   NETWORK/LENGTH

   NET 

 例如: 定义172.16.0.0网段有以下三种方式:

              172.16.0.0/255.255.0.0- 172.16.0.0/16- 172.16 

  

   基于主机名的访问控制:

         语法格式:             

             Require host HOSTNAME

             Require not host HOSTNAME

         主机名部分:

                    可以是主机名

                    也可以是域名

         例如:

                    www.abc.com

                    .abc.com


   基于用户的访问控制:

         语法格式:              

             Require user USERNAME

             Require group GRPNAME


    特殊约定:     

        允许所有主机访问:

 Require all granted

 

拒绝所有主机访问:

 Require all deny

 

配置虚拟目录和URL重定向:

1)配置虚拟目录

   --认识虚拟目录:

                  就是在站点中建立一个链接指向某个物理路径,可用于发布站点主目录以外资源或缩短物理路径。

   --虚拟目录配置指令:

                  Alias  URL-path  物理路径

                      作用:映射URL到文件系统的特定区域

                  AliasMatch  正则表达式  物理路径

                      作用:使用正则表达式映射URL到文件系统特定区域

   --注意:以上配置命令可以在主服务器或虚拟主机中配置

   --例子:

           Alias /p_w_picpaths/ "/www/static/p_w_picpaths/"


2)配置URL重定向:

   --认识URL重定向:

                   修改客户端请求的URL,并将修改后的URL返回给客户端,由客户端重新请求修改后的URL。

   --URL重定向配置指令:

                   redirect [状态] URL-path  URL

                       作用:发送一个外部重定向使客户端重定向到一个不同的URL

                   RedirectMatch  正则表达式  URL

                       作用:基于正则表达式匹配对当前的URL发送一个外部重定向

   --注意:以配置命令可以放在主服务器、虚拟主机、directory或.htaccess中

   --例子:

           RedirectMatch ^/(.*)$ http://www.new.com/$1


配置个人站点:

userdir模块:

         # httpd -D DUMP_MODULES | grep user   

模块功能:

         可以实现当前主机上可以正常登录系统的每一个用户都可以拥有自己独立的个人站点。

配置指令:  

         <IfModule mod_userdir.c>

 UserDir disabled         //禁用user功能  注释这行表示启用这个功能

 UserDir public_html       //设置user的主目录

 </IfModule>

创建用户个人主页:

         # useradd jerry

         # su - jerry

         # mkdir public_html

         # echo "jerry home" >public_html/index.html

         # exit

         # setfacl -m u:apache:x /home/jerry/     

             //必须apache启动用户有权限进入这个目录,并且能读取里面的文件


查看服务器状态:

server-status模块:

         # httpd -D DUMP_MODULES |grep status    

先确定该模块是否已经加载:

         LoadModule status_module modules/mod_status.so

添加容器:      

        <Location /status>

        SetHandler server-status     //处理器

        #AllowOverride AuthConfig    //没有使用Order allow,deny 基于IP的访问控制 需要这行

        AuthName "Status"

        AuthType Basic

        AuthUserFile  /etc/httpd/conf/.statuspass

        </Location>

创建访问用户:

        # htpasswd -c -m /etc/httpd/conf/.statuspass  status

输出更为详细信息:

        ExtendedStatus On     //开启status扩展内容  输出的信息更为详细

server-status的输出说明:

wKiom1O4-1CBJprzAAEpPqYQODU275.jpg


Apache Server Status for 192.168.1.109服务器的配置地址
Server Version:服务器软件版本
Server Built: Apr 3 2014 23:56:16服务器的安装日期
Current Time:服务器当前时间
Restart Time服务器上次重启的时间
Parent Server Generation: 2apache在正常运行后,apache的父进程会重读配置文件,如果配置文件有改动那么就强制所有apache的子进程重启,Parent Server Generation就是记录这个重启次数的
Server uptime: 8 secondsapache的持续运行时间
3 requests currently being processed, 5 idle workers当前任务运行状况,正在处理的请求是3个,空闲的活动是5个

Scoreboard Key的含义:


-
等待连结中。
S启动中
R正在读取要求
W正在送出回应
K处于保持联机的状态
D正在查找 DNS
C
正在关闭连结
L正在写入记录文件
G进入正常结束程序中
I
处理闲置
.尚无此程序


配置代理与负载均衡:

1)正向代理:

   配置正向代理很简单,此处我们配置vhost来实现代理, 只需要在浏览器的Proxy选项里加入你的Apache配置的vHost主机即可。

   开启代理模块:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so

  引入vhost文件

Include conf/extra/httpd-vhosts.conf

  如果你想监听别的端口, 修改Listen参数:

Listen 80
Listen 8087
Listen 8088

  将想监听的端口全都写上,相应的, 在vhost文件里写上:

NameVirtualHost *:80
NameVirtualHost *:8087
NameVirtualHost *:8088

  NameVirtualHost表示vhost匹配的请求的ip和端口那些会取扫描vhost


  虚拟主机配置:

<VirtualHost *:80>
    DocumentRoot "D:/www/test"
    ServerName www.test.com
     <Directory "D:/www/test">
        Options FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from all    
     </Directory>
    
    #正向代理设置
    ProxyRequests On       #开启正向代理
    ProxyVia On            
       
      <Proxy *>
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1    
      </Proxy>
</VirtualHost>

   配置解释:

<VirtualHost *:80>

   VirtualHost 后面的参数表示的是该VHost的IP/域名/和端口, 你可以写 :

  (1)IP:PORT, 例如 <VirtualHost 175.2.22.65:8088>, 访问的时候通过IP访问

    (2) Domain, 例如 <VirtualHost www.test1.com>, 访问的时候通过域名访问, 也可以指定里面的ServerName来指定域名

      (3) *, 表示匹配所有对Apache监听主机的请求, 只要是apache监听到的请求都可以匹配该虚拟主机

     此处表示的就是监听所有80端口的请求, 但是由于ServerName里写了www.test.com, 所以这个vhost匹配的是www.test.com:80,

  

  现在看正向代理设置那一段:

  • ProxyRequests On:开启Apache正向代理

  • ProxyVia On:控制位于代理服务器链中的代理请求的流向

引用Apache2.2官方文档中对ProxyVia的解释如下:


1,如果设置为默认值Off ,将不会采取特殊的处理。如果一个请求或应答包含"Via:"头,将不进行任何修改而直接通过。

2,如果设置为On每个请求和应答都会对应当前主机得到一个"Via:"头。

3,如果设置为Full ,每个产生的"Via:"头中都会额外加入Apache服务器的版本,以"Via:"注释域出现。

4,如果设置为Block ,每个代理请求中的所有"Via:"头行都将被删除。且不会产生新的"Via:"头。

 

  • <Proxy *>...</Proxy>:用来控制谁可以访问你的代理


<Proxy *>
     Order deny,allow
     Deny from all
     Allow from 127.0.0.15
</Proxy>

  客户端设置(以FireFox为例):


wKiom1O3kbLAhJgOAAHKsIc2WPE420.jpg

  测试:

访问 www.sina.com,观察HTTP请求Response:

wKioL1O3kcqRvBzBAADqYYGX67o952.jpg

可以看到,Via:www.test.com,正向代理成功了。


2)反向代理:

  1,同样需要开启代理模块

  2,配置:

<VirtualHost *:80> 
    DocumentRoot "/www/test" 
    ServerName www.test.com 
    <Directory "/www/test">
        Options FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory> 
    #反向代理设置
    ProxyRequests Off   #关闭正向代理 也就是启用反向代理
    ProxyPass /proxy http://www.proxypass.com/proxy
    ProxyPa***everse /proxy http://www.proxypass.com/proxy
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/www/proxypass"
    ServerName www.proxypass.com
    <Directory "/www/proxypass">        
           Options FollowSymLinks        
           AllowOverride All        
           Order allow,deny         
           Allow from all
    </Directory> 
</VirtualHost>

  3,解释:

     通过在同一台主机上实现模拟反向代理的效果。

  • ProxyPass /proxy http://www.proxypass.com/proxy : 将 www.test.com/proxy 域下的所有请求转发给 www.proxypass.com/proxy 代理,例如 www.test.com/proxy/login.php 会交给 www.proxypass.com/proxy/login.php 代理

  • ProxyPa***everse /proxy http://www.proxypass.com/proxy :


  •  www.proxypass.com/proxy/login.php 中有如下代码:


<?php
     header('Location: http://www.proxypass.com/proxy/result.php');
?>

    www.proxypass.com/proxy/result.php 中有如下代码:



 <?php
      echo 'in proxypass.com <br>';
 ?>

  4,测试效果:


访问 www.test.com/proxy/login.php 

  • Apache将请求交给 www.proxypass.com/proxy/login.php 代理,HTTP请求如图:


wKiom1O3ljCgfkCjAAGA__az7n4469.jpg

 可以发现其实Request中的请求还是 www.test.com 的,但是它确实是由 www.proxypass.com 来处理的

  • proxypass.com/proxy/login.php 重定向到 proxypass.com/proxy/result.php

   页面显示:


              in proxypass.com

 HTTP请求如图:


wKiom1O3ltTyXH52AAF5XfelGFo316.jpg

也可以看到请求依然是 www.test.com/proxy/result.php

  5,总结反向代理相关指令:

ProxyRequests Off

开启反向代理
SetEnv force-proxy-request-1.0 1强制使用HTTP/1.0 如果后端应用程序服务器不支持HTTP/1.1
SetEnv proxy-nokeepalive 1关闭长连接 如果后端应用程序服务器不支持长连接
proxypass 将一个远端服务器映射到本地服务器的URL空间中
proxypa***everse
调整由反向代理服务器发送的HTTP回应头中的UR


3)负载均衡:

  1,加载负载均衡模块:

LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

  2,相关配置:

    将Apache作为LoadBalance前置机分别有三种不同的部署方式,分别是:

    1,轮询均衡策略的配置

    进入Apache的conf目录,打开httpd.conf文件,在文件的末尾加入:

    ProxyPass / balancer://proxy/         #注意这里以"/"结尾

    <Proxy balancer://proxy>

           BalancerMember http://192.168.6.37:6888/

           BalancerMember http://192.168.6.38:6888/

    </Proxy>


      我们来观察上述的参数“ProxyPass / balancer://proxy/”,其中,“ProxyPass”是配置虚拟服务器的命令,“/”代表发送Web请求的URL前缀,如:http://myserver/或者http://myserver/aaa,这些URL都将符合上述过滤条件;“balancer://proxy/”表示要配置负载均衡,proxy代表负载均衡名;BalancerMember 及其后面的URL表示要配置的后台服务器,其中URL为后台服务器请求时的URL。以上面的配置为例,实现负载均衡的原理如下:


      假设Apache接收到http://localhost/aaa请求,由于该请求满足ProxyPass条件(其URL前缀为“/”),该请求会被分发到后台某一个BalancerMember,譬如,该请求可能会转发到 http://192.168.6.37:6888/aaa进行处理。当第二个满足条件的URL请求过来时,该请求可能会被分发到另外一台BalancerMember,譬如,可能会转发到http://192.168.6.38:6888/。如此循环反复,便实现了负载均衡的机制。


    2,按权重分配均衡策略的配置

    ProxyPass / balancer://proxy/         #注意这里以"/"结尾

    <Proxy balancer://proxy>

            BalancerMember http://192.168.6.37:6888/  loadfactor=3

            BalancerMember http://192.168.6.38:6888/  loadfactor=1

    </Proxy>


      参数”loadfactor”表示后台服务器负载到由Apache发送请求的权值,该值默认为1,可以将该值设置为1到100之间的任何值。以上面的配置为例,介绍如何实现按权重分配的负载均衡,现假设Apache收到http://myserver/aaa 4次这样的请求,该请求分别被负载到后台服务器,则有3次连续的这样请求被负载到BalancerMember为http://192.168.6.37:6888的服务器,有1次这样的请求被负载BalancerMember为http://192.168.6.38:6888后台服务器。实现了按照权重连续分配的均衡策略。


    3,权重请求响应负载均衡策略的配置

    ProxyPass / balancer://proxy/ lbmethod=bytraffic  #注意这里以"/"结尾

    <Proxy balancer://proxy>

             BalancerMember http://192.168.6.37:6888/  loadfactor=3

             BalancerMember http://192.168.6.38:6888/  loadfactor=1

    </Proxy>


       参数“lbmethod=bytraffic”表示后台服务器负载请求和响应的字节数,处理字节数的多少是以权值的方式来表示的。“loadfactor”表示后台服务器处理负载请求和响应字节数的权值,该值默认为1,可以将该值设置在1到100的任何值。根据以上配置是这么进行均衡负载的,假设Apache接收到http://myserver/aaa请求,将请求转发给后台服务器,如果BalancerMember为http://192.168.6.37:6888后台服务器负载到这个请求,那么它处理请求和响应的字节数是BalancerMember为http://192.168.6.38:6888 服务器的3倍(回想(2)均衡配置,(2)是以请求数作为权重负载均衡的,(3)是以流量为权重负载均衡的,这是最大的区别)。


注:每次修改httpd.conf,用apachectl –k restart重新启动Apache。


配置带宽和并发连接数限制:

1)配置带宽:

   mod_bandwidth可以对IP的并发数进行控制,也可以对下载流量进行控制,也可以对某个目录的流量进行控制。

   1,下载地址:http://bwmod.sourceforge.net/

   2,安装bw_mod:

      如果没有apxs工具,可以安装httpd-devel包。

      # yum install httpd-devel -y

      # tar  -xzvf   mod_bw

      # cd mod_bw

      # apxs -i -a -c mod_bw.c

   3,配置带宽限制:

      <VirtualHost 172.16.100.1:80>

      ServerName  www.a.com

      DocumentRoot "/web/host1" 

      BandwidthModule On    //

      ForceBandWidthModule On   

      Bandwidth all 1024000   

      MinBandwidth all 50000   

      LargeFileLimit * 500 50000   

      MaxConnection all 6 

      CustomLog "/var/log/httpd/access1_access_log" combined

      </VirtualHost>

    4,参数说明:

  解压bandwidth的压缩文件后,里面有一个mod_bw.txt有详细的说明和实例,下面是部分参数说明

1,BandWidth localhost 0                                      #对localhost不限速
2,BandWidth 192.168.1.5 102400                       #对192.168.1.5限速为100KB

3,BandWidth “u:^Mozilla(.*)” 10240              #用mozilla时限速10KB
4,BandWidth “u:wget” 102400                      #如果用wget下载时限速10KB

5,MinBandWidth all -1                                      #保证每个客户端最高速度可达10KB
6,LargeFileLimit .jpg 100 10240                      #jpg文件超过100KB,限速10KB

7,#下面的510挺好,如果不设置,apache自己会报错,就根报404差不多,页面非常的丑
ErrorDocument 510 /exceed_speed.html
BandWidthError 510

8,MaxConnection all 10                                       #所有ip最大连接数为10
9,MaxConnection 192.168.1.5 5                         #192.168.1.5最大连接数为5

2)配置并发连接限制:

   1,下载地址:http://dominia.org/djao/limitipconn2.html

   2,安装mod_limitipconn模块

      # tar  -xjvf  mod_limitipconn-........tar.bz2

      # cd  mod_limiticonn

      # apxs  -i  -a   -c  mod_limitipconn.c

   3,配置:

      Extendedstatus   on

      <IfModule mod_limitipconn.c>   

            <Location />                                       #对应根目录   

               MaxConnPerIP 6                                  #最大并发数   

               NoIPLimit p_w_picpath/*                              #对图片不做限制   

            </Location>   

            <Location /download>                             #对根目录下面的download   

               MaxConnPerIP 1                                #最大并发数为1   

            </Location>   

       </IfModule>

    4,参数说明:

       Extendedstatus   on/off         #启用apache的扩展状态         
       Maxconnperip   数字             #设置每个客户机的最大并发连接数  

      

配置规则重写:

1)认识规则重写
 规则重写就是web服务器会改写客户机符合特定规则的URL;用于实现资源重定向


2)规则重写的配置命令
  —rewriteengine   on/off
  设置apache是否启用重写引擎


  —rewriterule
  作用:为重写引擎定义重写规则
  格式:rewriterule   正则表达式   替代字符串[标记]
  正则表达式元字符:
          .         任意一个单字符                
          [chars]   字符类:“chars”中的任意一个字符
          [^chars]  字符类:不在“chars”中的字符
          text1|text2   选择:text1或text2 
          ?          前面的字符出现0或1次
          *          前面的字符出现0或N次 (N>0)
          +          前面的字符出现1或N次(N>1)
          ^          锚定到行首
          $          锚定到行尾
          \字符      转义字符
  标记:C         连接到下一条件规则 ....
          F          强烈禁URL
          G         强烈废弃URL
          L         结尾规则
          N        跳转到开头,从头再来
          NC      忽略大小写
          P        强制为代理
          R       强制为重定向
  实例:rewriterule    ^/$    http://www.sje.cn  [R.L]


  —rewritecond
  作用:定义重写发生的条件
  格式:rewritecond   字符串   正则表达式    [标记]
  字符串所包含一些特殊字符
  a.$N  反向rewriterule中的分组
  b.%N  反向rewritecond中的分组
   c. 服务器变量
           %{HTTP_USER_AGENT}   客户机信息,包括操作系统和浏览器信息
           %{HTTP_HOST} 请求的主机名  
           %{REMOTE_ADDR}  客户机IP地址
           %{REMOTE_HOST}  客户机的主机名
           %{REMOTE_PORT}  客户机连接服务器所有端口
           %{REQUEST_METHOD}  客户机的请求方法
           %{REQUEST_FILENAME} 客户机的请求的文件名
           %{REQUEST_URI}  客户机请求URI
           %{DOCUMENT_ROOT} 服务器的站点主目录
           %{SERVER_NAME}  服务器的名称
           %{SERVER_ADDR}  服务器的IP地址
           %{SERVER_PORT}  服务器的端口号
    特殊比较符号:
          <  小于
          >  大于
          =  等于
          -d  判断是不是存在的目录
          -f  判断是不是存在的普通文件
          -s  判断是不是为非空的普通文件
          -x  判断是不是为可执行的文件
          -l  判断是不是为链接文件
          -U  判断是不是有效的URL
      标记:
          -NC   忽略大小写 
          -OR   或
      实例:rewritecond %{REMOTE_ADDR} ^192.168.3.1


  --rewritebase 
  作用:设置目录级重写的基准URL
  格式:rewritebase  URL-PATH


3) 规则重写的应用案例
     --移动站点主目录到站点的/bbs路径下
     rewriteengine on
     rewriterule  ^/$    /bbs [R,L]
     -利用规则重写实现基于域名的虚拟主机
    RewriteEngine on
    RewriteCond   %{HTTP_HOST}    ^www\.abc\.com$
    RewriteRule   ^(.+)     %{HTTP_HOST}$1   [C]
    RewriteRule   ^www\.abc\.com(.*) /web/abc$1
 
    RewriteCond   %{HTTP_HOST}    ^www\.linux\.cn$
    RewriteRule   ^(.+)     %{HTTP_HOST}$1   [C]
    RewriteRule   ^www\.linux\.com(.*) /web/linux$1


配置使用SSL实现https访问:

1,安装SSL模块:

 # yum -y install mod_ssl

2,自建CA: 

# cd /etc/pki/CA

# (umask 077;openssl genrsa -out private/cakey.pem 2048)  //产生CA服务器私钥

# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365  

                                                         //生成CA自签名证书

# touch index.txt

# echo 01 >serial

3,生成证书签发请求:

# cd /etc/httpd/conf

# mkdir ssl

# cd ssl

# (umask 077;openssl genrsa -out httpd.key 1024)   //生成私钥文件

# openssl req -new -key httpd.key -out httpd.csr   //生成证书请求文件

4,CA完成对证书的签发:

# openssl ca -in httpd.csr -out httpd.crt -days 365   //CA签署证书

5,修改配置文件:

# vi /etc/httpd/conf.d/ssl.conf

      <VirtalHost 172.16.100.1;443>

      DocumentRoot "/web/host1"

      ServerName www.a.com 

      SSLEngine on   //启用SSL引擎

      SSLProtocol all -SSLv2   //协议版本

      SSLCertificateFile  /etc/httpd/conf/ssl/httpd.crt   //证书文件

      SSLCertificateKeyFile /etc/httpd/conf/ssl/httpd.key   //指定服务器私钥文件

      </VirtualHost>

6,测试:

# openssl s_client -connect www.a.com:443 -CAfile /etc/pki/CA/cacert.pem