zoukankan      html  css  js  c++  java
  • apache 工作模式

    apache三种工作模式: prefork(2.4前默认)/worker/event(2.4默认)
    内容整理来自以下网站
    http://m.blog.csdn.net/article/details?id=40738507
    http://blog.chinaunix.net/uid-20773865-id-113915.html

    查看是哪一个模式,可通过
    httpd -l 或者 httpd -V
    如果有 prefork.c,则表示为 prefork模式,同理,如果有 worker.c,则为worker模式,如果有 event.c,则为 event

    其中event模式,并且已经是稳定的,这个可以说是 worker的升级版本,
    因为解决了worker中的keep-alive场景下,长期被占用线程的资源
    浪费问题,某些线程因为被keep-alive,空挂在哪等待,
    中间几乎没有请求过来,甚至等到超时

    prefork模式:
    效率比较高,但要比 worker使用内存更大
    这个多路处理模块(MPM)实现了一个非线程型的,预派生的web服务器,
    工作类似于 apache1.3。它适用于没有线程安全库,
    需要避免线程兼容性问题的系统.它要求将每个请求互相独立的情况下最好的MPM,这样一个请求出现问题就不会影响到其他请求。
    这个MPM具有很强的自我调节能力,只需要很少的配置指定调整。最重要的是将 MaxClients设置为一个足够大的数值以处理
    潜在的请求高峰,同时,又不能太大,以致需要使用的内存超过物理内存的大小
    配置文件:httpd.conf中
    <IfModule prefork.c>
    ServerLimit 256
    StartServers 5
    MinSpareServers 10
    MaxSpareServers 15
    MaxClients 256
    MaxRequestsPerChild 4000
    </IfModule>
    StartServers 5 #指定服务器在启动时建立的子进程数量,默认为 5
    MinSpareServers 5 #指定空闲子进程的最小数量,默认为5,假如当前空闲子进程数少于 MinSpareServers,那么
    apache将以最大每秒一个速度产生新的子进程。此参数不宜过大
    举个例子就明白了:
    apache在没有用户访问时候有5个闲置的进程,如果有一个用户访问网站。则闲置的进程就只有4个,这个值小于MinSpareServers,所以apache就以第一秒1个进程,第二秒2个进程,第三秒4个进程的速度新建空闲进程,即2的N次方产生个数,最大为32个,直到大于等于MinSpareServers个空闲进程才结束。

    MaxSpareServers 20 # 配置空闲子进程的最大数量,默认为20,假如当前有超过 MaxSpareServers数量的空闲子进程,
    那么父进程将杀死多余的子进程。此参数不宜过大
    例子就明白了:
    apache在没有用户访问时候有5个闲置的进程,如果有5个用户同时访问网站。则闲置的进程就只有0个,这个值小于 MinSpareServers,所以apache就以第一秒1个进程,第二秒2个进程,第三秒4个进程的速度新建空闲进程。直到大于等于 MinSpareServers个空闲进程才结束。在这个例子中直到第三秒,一共生成1+2+4个进程才能满足大于等于MinSpareServers的要求。后来这5个用户访问完apache,访问结束,关闭浏览器。所以apache就有了5+7个空闲的进程。这时空闲的进程比较多,apache就开始关闭一些进程,直到满足小于MaxSpareServers个空闲进程才结束。如果该值小于MinSpareServers则apache默认将该值设置成MinSpareServers+1。

    ServerLimit:这个参数是控制apache的进程总数的,那为什么会有两个参数控制apache的进程总数呢?这个参数在apache1的时代是没有的,因为那个时候有个256M内存的服务器就很厉害了。后来apache2的时代到来,服务器的硬件也得到升级。很多服务器都是4G内存,还有很多比4G内存大的服务器出现。apache1的时代只有一个MaxClients参数控制进程总数就够了,而这个参数最大值是256定死了。但是到了apache2的时代必须调整ServerLimit值大于256才能使MaxClient支持大于256的值。

    MaxClients:apache最大的进程数。apache1的时代只有一个MaxClients参数控制进程总数就够了,而这个参数最大值是256定死了。但是到了apache2的时代必须调整ServerLimit值大于256才能使MaxClient支持大于256的值。

    MaxRequestsPerChild:举个例子就明白了。
    apache在没有用户访问的时候有5个空闲进程。当一个用户访问网站,访问完又离开。则apache的第一个进程就处理了一个请求,从新进入闲置状态。再有一个用户访问网站,访问完后离开。则apache的第一个进程就处理了1+1个请求。这样继续访问3998个用户,这个进程就处理了4000个请求,之后就自动关闭这个进程。这个时候apache就只有4个限制的进程,小于MinSpareServers值所以apache从今建立一个空闲进程。至于为什么处理完4000个请求就要关闭这个进程呢?答案之一:为了防止内存的泄露。
    设置为大于0有好处:
    1.能防止内存泄漏无限进行,从而耗尽内存。
    2.给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。

    通过 ps -ef|grep httpd | wc -l 可以了解当前系统中 apache进程数,
    从而可以根据实际情况修改以上参数

    配置文件中:
    KeepAlive On/Off
    指保持连接活跃,类似于mysql永久连接。
    如果设置为On,那么来自同一客户端的请求就不需要再
    一次连接,避免每次请求都要新建一个连接而加重服务器的负担。

    KeepAliveTimeOut number
    如果第二次和第一次请求间隙时间超过了这个值,第一次连接就会中断,
    再新建第二个连接。一般设置了10秒可以了

    MaxKeepAliveRequests 100
    一次连接可以进行的HTTP请求的最大次数。将其值设置为0,将支持一次
    连接内进行无限次的传输请求。事实上,没有客户程序在一次连接中请求太多的页面,
    通常达不到这个上限就完成了连接了

    worker模式:(支持混合的多线程多进程的多路处理模块)
    使用多个子进程,每个子进程有多个线程。每个线程在某个确定的时间只能维持一个连接。通常来说,
    一个高流量的HTTP服务器上,worker MPM是个比较好的选择,因为worker MPM的内存使用比Prefork MPM要低得多。
    但是worker MPM也有缺点,如,一个线程崩溃了,整个进程就会连同其任何线程一起“挂了”,
    由于线程是共享内存空间,所以一个程式在运行时必须被系统识别为“每个线程是安全的”

    Worker的工作原理及配置
    worker是2.0 版中全新的支持多线程和多进程混合模型的MPM。由于使用线程来处理,所以可以处理相对海量的请求,
    而系统资源的开销要小于基于进程的服务器。但是,worker也使用了多进程,每个进程又生成多个线程,
    以获得基于进程服务器的稳定性。

    如下为缺省的worker配置段:
    StartServers 2
    MaxClients 150
    MinSpareThreads 25
    MaxSpareThreads 75
    ThreadsPerChild 25
    MaxRequestsPerChild 0

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

    Worker conf指令分析:
    StartServers
    服务器启动时建立的子进程数
    MaxClients
    允许同时伺服的最大接入请求数量(最大线程数量)。任何超过MaxClients限制的请求都将进入等候队列。
    默认值是”400″,16(ServerLimit)乘以25(ThreadsPerChild)的结果。因此要增加MaxClients的时候,你必须同时增加ServerLimit的值
    MaxSpareThreads
    设置最大空闲线程数。默认值是”250″。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太多,子进程将杀死多余的空闲线程。
    ThreadsPerChild
    每个子进程建立的常驻的执行线程数。默认值是25。子进程在启动时建立这些线程后就不再建立新的线程了。
    MaxRequestsPerChild
    设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。
    如果MaxRequestsPerChild为”0″,子进程将永远不会结束。将MaxRequestsPerChild设置成非零值有两个好处:
    可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
    给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
    4.ServerLimit指令解释:

    对于preforkMPM,这个指令设置了MaxClients最大允许配置的数值。
    对于workerMPM,这个指令和ThreadLimit结合使用设置了MaxClients最大允许配置的数值。

    对于preforkMPM,只有在你需要将MaxClients设置成高于默认值256的时候才需要使用这个指令。要将此指令的值保持和MaxClients一样。
    对于workerMPM,只有在你需要将MaxClients和ThreadsPerChild设置成需要超过默认值16个子进程的时候才需要使用这个指令。
    不要将该指令的值设置的比MaxClients 和ThreadsPerChild需要的子进程数量高。如果显式声明了ServerLimit,
    那么它乘以ThreadsPerChild的值必须大于等于MaxClients,而且MaxClients必须是ThreadsPerChild的整数倍,
    否则Apache将会自动调节到一个相应值(可能是个非期望值)。
    注意:
    Apache在编译时内部有一个硬限制"ServerLimit 20000"(对于preforkMPM为"ServerLimit 200000")。你不能超越这个限制。

    Maxclient指令解释:

    对于非线程型的MPM(也就是prefork),MaxClients表示可以用于伺服客户端请求的最大子进程数量,默认值是256。
    要增大这个值,你必须同时增大ServerLimit 。

    对于线程型或者混合型的MPM(也就是beos或worker),MaxClients表示可以用于伺服客户端请求的最大线程数量。
    线程型的beos的默认值是50。对于混合型的MPM默认值是16(ServerLimit)乘以25(ThreadsPerChild)的结果。
    因此要将MaxClients增加到超过16个进程才能提供的时候,你必须同时增加ServerLimit的值。

    Apache是基于模块化的设计,而Apache 2.0更扩展了模块化设计到Web服务器的最基本功能。
    服务器装载了一种多道处理模块,负责绑定本机网络端口、接受请求,并调度子进程来处理请求
    在用户级,MPM看起来和其它Apache模块非常类似。主要区别是在任意时刻只能有一种MPM被装载到服务器中
    指定MPM的方法:
    #./configure --help|grep mpm
    --with-mpm=MPM Choose the process model for Apache to use.
    MPM={beos|event|worker|prefork|mpmt_os2| perchild|leader|threadpool}

    apache配置安装参数
    ./configure --prefix=/usr/local/apache2
    --enable-rewrite --enable-so --enable-headers
    --enable-expires --with-mpm=worker
    --enable-modules=most --enable-deflate

    --prefix=/usr/local/apache2表示指定apache的安装路径,默认安装路径为/usr/local/apache2

    --enable-rewrite提供URL规则的重写

    --enable-so激活apache服务的DSO(Dynamic Shared Objects动态共享目标),即在以后可以以DSO的方式编译安装共享模块,这个模块本身不能以DSO方式编译。

    --enable-headers提供允许对HTTP请求头的控制。

    --enable-expires激活通过配置文件控制HTTP的“Expires:”和“Cache-Control:”头内容,即对网站图片、js、css等内容,提供客户端浏览器缓存的设置。这个是apache调优的一个重要选项之一。

    --with-mpm=worker选择apache mpm的模式为worker模式。为worker模式原理是更多的使用线程来处理请求,所以可以处理更多的并发请求。而系统 资源的开销小玉基于进程的MPM prefork。如果不指定此参数,默认的模式是prefork进程模式。也可以指定 event模式.这个是apache调优的一个重要选项之一。

    --enable-deflate提供对内容的压缩传输编码支持,一般是html、js、css等内容的站点。使用此参数会打打提高传输速度,提升访问者访问的体验。在生产环境中,这是apache调优的一个重要选项之一

    event模式是worker升级版本

  • 相关阅读:
    [原创] 基础中的基础(三):理解数据库的几种键和几个范式
    [原创] 思维导图笔记(一):设计模式
    [原创] 基础中的基础(二):C/C++ 中 const 修饰符用法总结
    [原创] 基础中的基础(一):简单排序算法总结(附代码)
    [转载] Linux 下产生和调试core文件
    [转载] C++异常处理机制
    spring cloud开发、部署注意
    使用Spring Sleuth和Zipkin跟踪微服务
    HttpClient4.5 SSL访问工具类
    多线程处理中Future的妙用
  • 原文地址:https://www.cnblogs.com/lin3615/p/4631030.html
Copyright © 2011-2022 走看看