Apache 2.x支持插入式并行处理模块,称为多路处理模块(MPM Multi-Processing Modules),在编译Apache时必须选择一个MPM(有且只能选择一次),针对非UNIX系统的MPM有:beos、 mpm_netware、mpmt_os2、mpm_winnt。对付UNIX系统,有几个不同的MPM可供选择,它们都会影响到httpd的速率和可伸缩性:
preforkMPM利用多个子进程,但每个子进程并不包含多线程,每个进程只处理一个链接,在许多系统上它的速率和workerMPM一样快,但是须要更多的内存。workerMPM利用多个子进程,每个子进程中又有多个线程,每个线程处理一个要求。该MPM常日对高流量的做事器是一个不错的选择,由于它比preforkMPM须要更少的内存且更具有伸缩性。Apache Prefork MPM 是个多路处理模块(MPM)实现了一个非线程型的、预派生的web做事器,它的事情办法类似于Apache 1.3。它适宜于没有线程安全库,须要避免线程兼容性问题的系统。它是哀求将每个要求相互独立的情形下最好的MPM选择办法,这样若一个要求涌现问题就不会影响到其他要求。
这个MPM具有很强的自我调节能力,只须要很少的配置指令调度。最主要的是将MaxClients设置为一个足够大的数值以处理潜在的要求高峰,同时又不能太大,甚至须要利用的内存超出物理内存的大小。

其事情办法是一个单独的掌握进程(父进程)卖力产生子进程,这些子进程用于监听要求并作出应答。Apache总是试图保持一些备用的(spare)或者是空闲的子进程用于欢迎即将到来的要求,这样客户端就不须要在得到做事前期待子进程的产生。
StartServers、MinSpareServers、MaxSpareServers、MaxClients指令用于调节父进程如何产生子进程。常日情形下Apache具有很强的自我调节能力,以是一样平常的网站不须要调度这些指令的默认值,可能须要处理最大超过256个并发要求的做事器可能须要增加MaxClients的值。内存比较小的机器则须要减少MaxClients的值以担保做事器不会崩溃。
在Unix系统中,父进程常日以root身份运行以便邦定80端口,而Apache产生的子进程常日以一个低特权的用户运行,User和Group指令用于设置子进程的低特权用户。运行子进程的用户必须要对它所做事的内容有读取的权限,但是对做事内容之外的其他资源必须拥有尽可能少的权限。MaxRequestsPerChild指令掌握做事器杀去世旧进程产生新进程的频率。
MaxSpareServers
该指令设置空闲子进程的最大数量。所谓空闲子进程是指没有正在处理要求的子进程。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀去世多余的子进程。只有在非常繁忙机器上才须要调度这个参数,此参数设的常日不能设置过大。如果你将该指令的值设置为比MinSpareServers小,Apache将会自动将其修正成“MinSpareServers+1”。
MinSpareServers
该指令设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理要求的子进程,如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速率产生新的子进程。只有在非常繁忙机器上才须要调度这个参数,不应将此参数设置过大。
MaxClients
该指令设置了许可同时伺服的最大接入要求数量。任何超过MaxClients限定的要求都将进入期待行列步队,直到达到ListenBacklog指令限定的最大值为止,一旦一个链接被开释,行列步队中的要求将得到做事。
对付非线程型的MPM(也便是prefork),MaxClients表示可以用于伺服客户端要求的最大子进程数量,默认值是256,要增大这个值,必须同时增大ServerLimit的值。
对付线程型或者稠浊型的MPM(也便是beos或worker),MaxClients表示可以用于伺服客户端要求的最大线程数量。线程型的beos的默认值是50,对付稠浊型的MPM默认值是16(ServerLimit)乘以25(ThreadsPerChild)的结果。因此要将MaxClients增加到超过16个进程才能供应的时候,必须同时增加ServerLimit的值。
MaxClients打算公式如下:
MaxClients ≈ (RAM - size_all_other_processes)/(size_apache_process)
如以下实例:
系统:VPS(虚拟专用做事器)Linux RedHat5 128MB RAM
Apache:2.2 mpm_prefork、mod_php、mod_rewrite、mod_ssl及其它一些模块
其他做事:MySQL、BIND、Sendmail
报告的系统内存:120MB
报告的httpd进程大小:7-13MB
假设Apache可用内存为:90MB
最佳的设置:
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 15
MaxClients 15
MaxRequestsPerChild 2000
ServerLimit
该指令指做事器许可配置的进程数上限,对付preforkMPM,这个指令设置了MaxClients最大许可配置的数值。对付workerMPM,这个指令和ThreadLimit结合利用设置了MaxClients最大许可配置的数值。任何在重启期间对这个指令的改变都将被忽略,但对MaxClients的修正却会生效。
利用这个指令时要特殊把稳,如果将ServerLimit设置成一个赶过实际须要许多的值,将会有过多的共享内存被分配,如果将ServerLimit和MaxClients设置成超过系统的处理能力,Apache可能无法启动,或者系统将变得不稳定。
对付preforkMPM,只有在须要将MaxClients设置成高于默认值256的时候才须要利用这个指令,要将此指令的值保持和MaxClients一样。
对付workerMPM,只有在须要将MaxClients和ThreadsPerChild设置成须要超过默认值16个子进程的时候才须要利用这个指令。不要将该指令的值设置的比MaxClients 和ThreadsPerChild须要的子进程数量高。
把稳:Apache在编译时内部有一个硬限定“ServerLimit 20000”(对付preforkMPM为“ServerLimit 200000”),不能超越这个限定。
StartServers
该指令是指做事器启动时建立的子进程数。StartServers指令设置了做事器启动时建立的子进程数量。由于子进程数量动态的取决于负载的轻重,所有一样平常没有必要调度这个参数。不同的MPM默认值也不一样,对付worker默认值是“3”,对付prefork默认值是“5”,mpmt_os2是“2”。
Apache MPM worker多路处理模块(MPM)使网络做事器支持稠浊的多线程多进程。由于利用线程来处理要求,以是可以处理海量要求,而系统资源的开销小于基于进程的MPM,但是,它也利用了多进程,每个进程又有多个线程,以得到基于进程的MPM的稳定性。
掌握这个MPM的最主要的指令是,掌握每个子进程许可建立的线程数的ThreadsPerChild指令,和掌握许可建立的总线程数的MaxClients。
事情办法是每个进程可以拥有的线程数量是固定的,做事器会根据负载情形增加或减少进程数量,一个单独的掌握进程(父进程)卖力子进程的建立,每个子进程可以建立ThreadsPerChild数量的做事线程和一个监听线程,该监听线程监听接入要求并将其通报给做事线程处理和应答。
Apache总是试图坚持一个备用(spare)或是空闲的做事线程池,这样,客户端无须等待新线程或新进程的建立即可得到处理。初始化时建立的进程数量由StartServers指令决定,随后父进程检测所有子进程中空闲线程的总数,并新建或结束子进程使空闲线程的总数坚持在MinSpareThreads和MaxSpareThreads所指定的范围内。由于这个过程是自动调度的,险些没有必要修正这些指令的缺省值。可以并行处理的客户真个最大数量取决于MaxClients指令,活动子进程的最大数量取决于MaxClients除以ThreadsPerChild的值。
有两个指令设置了活动子进程数量和每个子进程中线程数量的硬限定,要想改变这个硬限定必须完备停滞做事器然后再启动做事器(直接重启是弗成的),ServerLimit是活动子进程数量的硬限定,它必须大于或即是MaxClients除以ThreadsPerChild的值,ThreadLimit是所有做事线程总数的硬限定,它必须大于或即是ThreadsPerChild指令,这两个指令必须涌如今其他workerMPM指令的前面。
在设置的活动子进程数量之外,还可能有额外的子进程处于“正在中止”的状态但是个中至少有一个做事线程仍旧在处理客户端要求,直达到到MaxClients甚至结束进程,虽然实际数量会很小。这个行为能够通过以下禁止特殊的子进程中止的方法来避免:
Ø 将MaxRequestsPerChild设为“0”;
Ø 将MaxSpareThreads和MaxClients设为相同的值;
Apache Winnt MPM 是专门针对Windows NT优化的MPM(多路处理模块),它利用一个单独的父进程产生一个单独的子进程,在这个子进程中轮流产生多个线程来处理要求,也便是说 mpm_winnt只能启动父子两个进程,不能像Linux下那样同时启动多个进程。
mpm_winnt紧张通过ThreadsPerChild和MaxRequestsPerChild两个参数来优化Apache。
关于StartServers、MinSpareServers、MaxSpareServers、MaxClients和ServerLimit的设置与Apache Prefork MPM模块中的设置同等。
ThreadsPerChild
这个参数用于设置每个进程的线程数,子进程在启动时建立这些线程后就不再建立新的线程了. 一方面由于mpm_winnt不能启动多个进程,以是这个数值要足够大,以便可以处理可能的要求高峰;另一方面该参数以做事器的相应速率为准的,数目太大的反而会变慢。因此须要综合均衡一个合理的数值。
mpm_winnt上的默认值是64,最大值是1920,建议设置为100-500之间,做事器性能高的话值大一些,反之值小一些。
MaxRequestsPerChild
该参数表示每个子进程能够处理的最大要求数,即同韶光内子进程数目。设置为零表示不限定, mpm_winnt上的默认值便是0。
把稳:建议不应该设置为0,紧张基于两点考虑:第一:可以防止(有时的)内存泄露无限进行,从而耗尽内存;第二:给进程一个有限寿命,从而有助于当做事器负载减轻的时候减少活动进程的数量。
类UNIX常用的模式有三种:prefork 、worker 、event
prefork模块事情的事理如下:
worker模块事情事理如下:
event模块事情事理如下: