配置多路处理模块(MPM)

         编辑多路处理模块配置文件:
         vi /usr/local/apache-2.2.6/conf/extra/httpd-mpm.conf 

         如果使用prefork多路处理模块,按下面的提示修改:
###=============httpd-mpm.conf prefork begin===================
##设置prefork多路处理模块
<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    ServerLimit    4000
    MaxClients         4000
    MaxRequestsPerChild   0
</IfModule>
###=============httpd-mpm.conf prefork end===================
   指令说明:
StartServers
        设置服务器启动时建立的子进程数量。因为子进程数量动态的取决于负载的轻重,所有一般没有必要调整这个参数。
MinSpareServers:(可理解为备用\侯补的子进程)
        设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于 MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。
         MaxSpareServers
        设置空闲子进程的最大数量。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。如果你将该指令的值设置为比MinSpareServers 小,Apache将会自动将其修改成"MinSpareServers+1"。
         ServerLimit
         服务器允许配置的进程数上限。只有在你需要将MaxClients设置成高于默认值256的时候才需要使用。要将此指令的值保持和MaxClients一样。修改此指令的值必须完全停止服务后再启动才能生效,以restart方式重启动将不会生效。
 MaxClients
         用于伺服客户端请求的最大请求数量(最大子进程数),任何超过MaxClients限制的请求都将进入等候队列。默认值是256,如果要提高这个值必须同时提高ServerLimit的值。笔者建议将初始值设为(以Mb为单位的最大物理内存/2),然后根据负载情况进行动态调整。比如一台4G内存的机器,那么初始值就是4000/2=2000。
         MaxRequestsPerChild
         设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为"0",子进程将永远不会结束。将MaxRequestsPerChild设置成非零值有两个好处:可以防止(偶然的)内存泄漏无限进行而耗尽内存;
给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
如果设置为非零值,笔者建议设为10000-30000之间的一个值。
          公式:
MaxClients<=ServerLimit
  如果使用worker多路处理模块,按下面的提示修改:
###=============httpd-mpm.conf worker begin===================
##设置worker多路处理模块
<IfModule mpm_worker_module>
    StartServers          5
    ServerLimit          20
    ThreadLimit         200
    MaxClients         4000
    MinSpareThreads      25
    MaxSpareThreads   250
    ThreadsPerChild     200
    MaxRequestsPerChild   0
</IfModule>
###=============httpd-mpm.conf worker end===================
         指令说明:
        StartServers
        设置服务器启动时建立的子进程数量。因为子进程数量动态的取决于负载的轻重,所有一般没有必要调整这个参数。
        ServerLimit
        服务器允许配置的进程数上限。只有在你需要将MaxClients和ThreadsPerChild设置成需要超过默认值16个子进程的时候才需要使用这个指令。不要将该指令的值设置的比MaxClients 和ThreadsPerChild需要的子进程数量高。修改此指令的值必须完全停止服务后再启动才能生效,以restart方式重启动将不会生效。
        ThreadLimit
        设置每个子进程可配置的线程数ThreadsPerChild上限,该指令的值应当和ThreadsPerChild可能达到的最大值保持一致。修改此指令的值必须完全停止服务后再启动才能生效,以restart方式重启动将不会生效。
        MaxClients
       用于伺服客户端请求的最大接入请求数量(最大线程数)。任何超过MaxClients限制的请求都将进入等候队列。默认值是"400",16 (ServerLimit)乘以25(ThreadsPerChild)的结果。因此要增加MaxClients的时候,你必须同时增加 ServerLimit的值。笔者建议将初始值设为(以Mb为单位的最大物理内存/2),然后根据负载情况进行动态调整。比如一台4G内存的机器,那么初始值就是4000/2=2000。
        MinSpareThreads
       最小空闲线程数,默认值是"75"。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太少,子进程将产生新的空闲线程。
        MaxSpareThreads
       设置最大空闲线程数。默认值是"250"。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太多,子进程将杀死多余的空闲线程。MaxSpareThreads的取值范围是有限制的。Apache将按照如下限制自动修正你设置的值:worker要求其大于等于 MinSpareThreads加上ThreadsPerChild的和。 
        ThreadsPerChild
       每个子进程建立的线程数。默认值是25。子进程在启动时建立这些线程后就不再建立新的线程了。每个子进程所拥有的所有线程的总数要足够大,以便可以处理可能的请求高峰。
        MaxRequestsPerChild
       设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为"0",子进程将永远不会结束。将MaxRequestsPerChild设置成非零值有两个好处:可以防止(偶然的)内存泄漏无限进行而耗尽内存;
给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
如果设置为非零值,笔者建议设为10000-30000之间的一个值。
         公式:
         ThreadLimit >= ThreadsPerChild
         MaxClients <= ServerLimit * ThreadsPerChild 必须是ThreadsPerChild的倍数
         MaxSpareThreads >= MinSpareThreads+ThreadsPerChild
配置Apache服务器默认设置
         编辑Apache服务器默认设置文件:
         vi /usr/local/apache-2.2.6/conf/extra/httpd-default.conf 
         按下面的提示修改:
###=============httpd-default.conf begin===================
##Apache默认设置文件
Timeout 300
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 5
UseCanonicalName Off
AccessFileName .htaccess
ServerTokens Prod
ServerSignature Off
HostnameLookups Off
###=============httpd-default.conf end====================
         指令说明:
    Timeout
         设置服务器在断定请求失败前等待的秒数。默认值300。
         KeepAlive
         设置是否启用HTTP持久链接,On 代表打开,Off 代表关闭。如果用于同一页面包含大量静态文件的应用,设置为On,以提高性能;如果用于主要为动态页面的应用,设置为Off,以节约内存资源;如果服务器前跑有squid或者其它七层设备,设置为On。
        MaxKeepAliveRequests
        限制当启用KeepAlive时,每个连接允许的请求数量。如果将此值设为"0",将不限制请求的数目。笔者建议将此值设为100-500之间的一个值,以确保最优的服务器性能。
    KeepAliveTimeout
        设置持久链接中服务器在两次请求之间等待的秒数。对于高负荷服务器来说,KeepAliveTimeout值较大会导致一些性能方面的问题:超时值越大,与空闲客户端保持连接的进程就越多。
         UseCanonicalName
         配置服务器如何确定它自己的域名,可选值为On | Off | DNS。DNS用于为大量基于IP的虚拟主机支持那些古董级的不提供"Host:"头的浏览器使用。笔者建议设置为Off。
        AccessFileName
        设置分布式配置文件的名字,默认为.htaccess。如果为某个目录启用了分布式配置文件功能,那么在向客户端返回其中的文档时,服务器将在这个文档所在的各级目录中查找此配置文件,因此会带来性能问题,笔者建议关闭分布式配置文件功能。
        ServerTokens
        控制服务器回应给客户端的"Server:"应答头是否包含关于服务器操作系统类型和编译进的模块描述信息,同时还控制着 ServerSignature指令的显示内容。可选值为Full | OS | Minor | Minimal | Major | Prod。笔者建议设置为显示最少信息的Prod。
        ServerSignature
        配置服务器生成页面的页脚,可选值为On | Off | EMail。采用On会简单的增加一行关于服务器版本和正在伺服的虚拟主机的ServerName,而EMail设置会额外创建一个指向 ServerAdmin的"mailto:"部分。建议使用默认值Off。
        HostnameLookups
        设置是否启用对客户端IP的DNS查找,可选值为On | Off | Double。DNS查询会造成明显的时间消耗,建议设置为Off。
 4.3.5 配置mod_deflate压缩模块
         mod_deflate模块提供了DEFLATE输出过滤器,允许服务器在将输出内容发送到客户端以前进行压缩,以节约带宽。
         编辑mod_deflate压缩模块设置文件:
         vi /usr/local/apache-2.2.6/conf/extra/httpd-deflate.conf 
         按下面的提示修改:
###=============httpd-deflate.conf begin===================
##mod_deflate压缩模块设置文件
<IfModule mod_deflate.c>
    ##定义deflate默认设置
    DeflateMemLevel 9
    DeflateWindowSize 15
    DeflateBufferSize 8096
    DeflateCompressionLevel 8
    ## 调试时去掉下面5行前的注释符,用以记录压缩日志
    #DeflateFilterNote Input instream
    #DeflateFilterNote Output outstream
    #DeflateFilterNote Ratio ratio
    #LogFormat '"%r" %b %{outstream}n/%{instream}n (%{ratio}n%%) "%{User-agent}i"' deflate
    #CustomLog logs/deflate_log deflate 
    ## 插入DEFLATE过滤器,以启用输出压缩
SetOutputFilter DEFLATE
## Netscape 4.x 有一些问题,仅压缩txt/html类型
    BrowserMatch ^Mozilla/4 gzip-only-text/html
## Netscape 4.06-4.08不能处理任何压缩内容,不进行压缩
    BrowserMatch ^Mozilla/4.0[678] no-gzip
    ## MSIE 会伪装成 Netscape ,但是事实上它没有问题
    BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
    ## 设置图片、mp3、压缩格式文件等不需要进行压缩内容
    SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
    SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
    SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary
    ## 确保代理不会发送错误的内容
    Header append Vary User-Agent env=!dont-vary
</IfModule>
###=============httpd-deflate.conf end=====================
         指令说明:
        DeflateMemLevel:指定zlib在压缩时最多可以使用多少内存,取值范围在1到9之间。
        DeflateWindowSize:定义zlib压缩窗口(compression window)的大小,取值范围在1到15之间,通常窗口越大压缩效果越好。
        DeflateBufferSize:定义zlib一次压缩的片断的字节数,默认为8096。
        DeflateCompressionLevel:设定压缩程度,越高的压缩程度就会有越好的压缩效果,同时也意味着占用越多的CPU资源。取值范围在 1(最低压缩率) 到 9(最高压缩率)之间,如果不设置此指令,默认为zlib的默认值。
        DeflateFilterNote:在日志中放置压缩率标记。
     语法为:DeflateFilterNote type notename
         notename就表示这个压缩率标记的名字,你可以为了某种统计目的将这个标记的名字添加到访问日志中。
         type指定notename标记所记录的数据类型:Input,在标记中存储过滤器输入流的字节数;Output,在标记中存储过滤器输出流的字节数;Ratio,在标记中存储过滤器的压缩比(输出/输入*100),这是type的默认值。
         SetOutputFilter:设置用于在服务器应答发送到客户端之前使用的过滤器。如果多于一个过滤器,必须按照处理内容的顺序用分号(;)分隔。
        BrowserMatch:基于User-Agent头有条件地设置环境变量。
        SetEnvIfNoCase:根据大小写无关的客户端请求属性设置环境变量。
         Headers:配置HTTP应答头。这个指令可以替换、合并、删除HTTP应答头。应答头紧跟在内容处理器和输出过滤器完工之后生成,这时候才能对头进行修改。
 4.3.6 配置mod_expires模块
          这个模块控制服务器应答时的Expires头内容和Cache-Control头的max-age指令。有效期(expiration date)可以设置为相对于源文件的最后修改时刻或者客户端的访问时刻。这些HTTP头向客户端表明了文档的有效性和持久性。如果有缓存,文档就可以从缓存(除已经过期)而不是从服务器读取。接着,客户端考察缓存中的副本,看看是否过期或者失效,以决定是否必须从服务器获得更新。
         编辑mod_expires设置文件:
         vi /usr/local/apache-2.2.6/conf/extra/httpd-expires.conf 
         按下面的提示修改:
###=============httpd-expires.conf begin===================
## mod_expires设置文件
<IfModule mod_expires.c>
        ExpiresActive on
     ExpiresDefault A300 
        ExpiresByType text/html A300
        ExpiresByType p_w_picpath/gif A2592000
        ExpiresByType p_w_picpath/jpeg A2592000
        ExpiresByType p_w_picpath/png A2592000
        ExpiresByType text/css A2592000
        ExpiresByType text/js A2592000
        ExpiresByType text/javascript A2592000
        ExpiresByType application/x-javascript A2592000
</IfModule>
###=============httpd-expires.conf end=====================
         指令说明:
        ExpiresActive:对其作用范围内的文档启用或禁用产生Expires和Cache-Control头的功能。若设置为 Off 则不会为其作用范围内的任何文档生成Expires和Cache-Control头(除非被更低一层的规则改写,比如.htaccess文件)。若设置为 On 则会按照ExpiresByType和ExpiresDefault指令定义的标准为其作用范围内的文档生成Expires和Cache-Control 头。注意,这个指令并不保证Expires或Cache-Control头一定会产生。如果定义的标准不规范,将不会产生这两个头,其效果是好像从未设置过这个指令一样。
        ExpiresByType:为指定MIME类型的文档配置Expires头的值。
         语法为:ExpiresByType MIME-type <code>seconds
         seconds参数设置了添加到基准时间以构造有效期限的秒数。Cache-Control: max-age的计算方法是从有效期减去当前请求时间并转化为秒数。
         基准时刻可以是源文件的最后修改时刻或者客户端对源文件的访问时刻,至于使用那一个则由<code>指定。"M"表示源文件的最后修改时刻,"A"表示客户端对源文件的访问时刻。需要注意的是<code>和seconds之间没有空格。如果使用"M",所有当前缓存中的文档副本都将在同一时刻过期,这个可能对定期更新的URL(比如位于同一位置的每周通告)很有好处。如果使用"A",则每个客户端所得到的有效期是不一样的,这个可能对那些几乎不更新的图片文件很有好处,特别是对于一组都引用了相同图片的相关文档。
         ExpiresDefault:设置其作用范围内的所有文档的默认有效期的计算方法,它可以被ExpiresByType指令基于MIME类型被改写。
          语法为:ExpiresDefault <code>seconds
          <code>seconds同ExpiresByType一致。