此文摘自: http://www.365mini.com/page/apache-concurrency-configuration.htmweb
Apache查看链接数和限制当前的链接数 : http://zhengdl126.iteye.com/blog/802520apache
Apache是一个跨平台的web服务器,因为其简单高效、稳定安全的特性,被普遍应用于计算机技术的各个领域。如今,Apache凭借其庞大的用户数,已成为用户数排名第一的web服务器。安全
尽管如此,在实际的生产环境中,咱们仍然不可能直接使用默认配置的Apache来充当服务器。毕竟,为了更充分合理地利用Apache服务器,咱们都应该根据本身的实际须要对Apache的默认配置做出一些必要的调整。而针对Apache的优化配置过程当中,修改Apache的最大并发链接数就显得尤其重要。服务器
在修改Apache的最大并发链接数以前,咱们须要预先了解一些Apache的相关知识。并发
众所周知,Apache是一个跨平台的、采用模块化设计的服务器。为了应对不一样的平台和不一样的环境产生的各类不一样的需求,也为了在具体的平台或环境下达到最佳的效果,Apache在web服务器的基础功能方面(端口绑定、接收请求等)也一样采用了模块化设计,这个Apache的核心模块就叫作多路处理模块(Multi-Processing Module,简称MPM)。编辑器
Apache针对不一样的操做系统提供了多个不一样的MPM模块,例如:mpm_beos
、mpm_event
、mpm_netware
、mpmt_os2
、mpm_prefork
、mpm_winnt
、mpm_worker
。若是条件容许,咱们能够根据实际需求将指定的MPM模块编译进咱们本身的Apache中(Apache的源码是开放的,容许用户自行编译)。不过,若是在编译时咱们没有选择,Apache将按照以下表格根据不一样的操做系统自行选择对应的MPM模块,这也是Apache针对不一样平台推荐使用的MPM模块。模块化
mpm_event模块能够看做是mpm_worker模块的一个变种,不过其具备实验性质,通常不推荐使用。性能
固然,Apache在其官方网站上也提供了根据不一样操做系统已经编译好对应MPM模块的成品Apache。优化
此外,若是咱们想要知道某个Apache内部使用的是何种MPM模块,咱们能够以命令行的方式进入Apache安装目录\bin
,而后键入命令httpd -l
,便可查看到当前Apache内部使用的何种MPM模块。--使用httpd -l命令查看编译模块网站
因为在日常的开发工做中,BeOS、NetWare、OS/2等操做系统并不常见,这里咱们主要针对Windows和Unix/Linux操做系统上的MPM模块进行讲解。在Windows和Unix/Linux操做系统上,MPM模块主要有mpm_winnt
、mpm_prefork
、mpm_worker
三种。
mpm_prefork
模块主要应用于Unix/Linux平台的Apache服务器,其主要工做方式是:当Apache服务器启动后,mpm_prefork
模块会预先建立多个子进程(默认为5个),当接收到客户端的请求后,mpm_prefork
模块再将请求转交给子进程处理,而且每一个子进程同时只能用于处理单个请求。若是当前的请求数将超过预先建立的子进程数时,mpm_prefork
模块就会建立新的子进程来处理额外的请求。Apache老是试图保持一些备用的或者是空闲的子进程用于迎接即将到来的请求。这样客户端的请求就不须要在接收后等候子进程的产生。
因为在mpm_prefork
模块中,每一个请求对应一个子进程,所以其占用的系统资源相对其余两种模块而言较多。不过mpm_prefork
模块的优势在于它的每一个子进程都会独立处理对应的单个请求,这样,若是其中一个请求出现问题就不会影响到其余请求。同时,mpm_prefork
模块能够应用于不具有线程安全的第三方模块(好比PHP的非线程安全版本),且在不支持线程调试的平台上易于调试。此外,mpm_prefork
模块还具备比mpm_worker
模块更高的稳定性。
mpm_worker
模块也主要应用于Unix/Linux平台的Apache服务器,它能够看做是mpm_prefork
模块的改进版。mpm_worker
模块的工做方式与mpm_prefork
模块相似。不过,因为处理相同请求的状况下,基于进程(例如mpm_prefork
)比基于线程的处理方式占用的系统资源要多。所以,与mpm_prefork
模块不一样的是,mpm_worker
模块会让每一个子进程建立固定数量的服务线程和一个监听线程,并让每一个服务线程来处理客户端的请求,监听线程用于监听接入请求并将其传递给服务线程处理和应答。Apache老是试图维持一个备用或是空闲的服务线程池。这样,客户端无须等待新线程或新进程的创建便可获得处理。
与mpm_prefork
模块相比,mpm_worker
模块能够进一步减小系统资源的开销。再加上它也使用了多进程,每一个进程又有多个线程,所以它与彻底基于线程的处理方式相比,又增长了必定的稳定性。
mpm_winnt
模块是专门针对Windows操做系统而优化设计的MPM模块。它只建立一个单独的子进程,并在这个子进程中轮流产生多个线程来处理请求。
在对Apache的MPM模块具有必定了解后,咱们就能够针对不一样的MPM模块来修改Apache的最大并发链接数配置了。
1.启用MPM模块配置文件
在Apace安装目录/conf/extra
目录中有一个名为httpd-mpm.conf
的配置文件。该文件主要用于进行MPM模块的相关配置。不过,在默认状况下,Apache的MPM模块配置文件并无启用。所以,咱们须要在httpd.conf
文件中启用该配置文件,以下所示:
# Server-pool management (MPM specific) Include conf/extra/httpd-mpm.conf (去掉该行前面的注释符号"#")
2.修改MPM模块配置文件中的相关配置
在启动MPM模块配置文件后,咱们就可使用文本编辑器打开该配置文件,咱们能够看到,在该配置文件中有许多<IfModule>
配置节点,以下图所示:
只有Apache使用对应MPM模块时,对应配置才会生效
此时,咱们就须要根据当前Apache服务器所使用的MPM模块,来修改对应<IfModule>
节点下的参数配置。首先,咱们来看看mpm_winnt
模块下的默认配置:
#因为mpm_winnt模块只会建立1个子进程,所以这里对单个子进程的参数设置就至关于对整个Apache的参数设置。 <IfModule mpm_winnt_module> ThreadsPerChild 150 #推荐设置:小型网站=1000 中型网站=1000~2000 大型网站=2000~3500 MaxRequestsPerChild 0 #推荐设置:小=10000 中或大=20000~100000 </IfModule>
对应的配置参数做用以下:
该参数建议设为非零的值,能够带来如下两个好处:
接着,咱们再来看看mpm_perfork
模块和mpm_worker
模块下的默认配置:
#mpm_perfork模块 <IfModule mpm_prefork_module> StartServers 5 #推荐设置:小=默认 中=20~50 大=50~100 MinSpareServers 5 #推荐设置:与StartServers保持一致 MaxSpareServers 10 #推荐设置:小=20 中=30~80 大=80~120 MaxClients 150 #推荐设置:小=500 中=500~1500 大型=1500~3000 MaxRequestsPerChild 0 #推荐设置:小=10000 中或大=10000~500000 (此外,还需额外设置ServerLimit参数,该参数最好与MaxClients的值保持一致。) </IfModule>
#mpm_worker模块 <IfModule mpm_worker_module> StartServers 2 #推荐设置:小=默认 中=3~5 大=5~10 MaxClients 150 #推荐设置:小=500 中=500~1500 大型=1500~3000 MinSpareThreads 25 #推荐设置:小=默认 中=50~100 大=100~200 MaxSpareThreads 75 #推荐设置:小=默认 中=80~160 大=200~400 ThreadsPerChild 25 #推荐设置:小=默认 中=50~100 大型=100~200 MaxRequestsPerChild 0 #推荐设置:小=10000 中或大=10000~50000 (此外,若是MaxClients/ThreadsPerChild大于16,还需额外设置ServerLimit参数,ServerLimit必须大于等于 MaxClients/ThreadsPerChild 的值。) </IfModule>
对应的配置参数做用以下:
所谓空闲子进程是指没有正在处理请求的子进程。若是当前空闲子进程数少于MinSpareServers
,那么Apache将以最大每秒一个的速度产生新的子进程。只有在很是繁忙机器上才须要调整这个参数。此值不宜过大。
只有在很是繁忙机器上才须要调整这个参数。此值不宜过大。若是你将该指令的值设置为比MinSpareServers
小,Apache将会自动将其修改为MinSpareServers+1
。
任何超过MaxClients
限制的请求都将进入等待队列,直到达到ListenBacklog
指令限制的最大值为止。
对于非线程型的MPM(也就是mpm_prefork
),MaxClients
表示能够用于处理客户端请求的最大子进程数量,默认值是256。要增大这个值,你必须同时增大ServerLimit
。
对于线程型或者混合型的MPM(也就是mpm_beos
或mpm_worker
),MaxClients
表示能够用于处理客户端请求的最大线程数量。线程型的mpm_beos
的默认值是50。对于混合型的MPM默认值是16(ServerLimit
)乘以25(ThreadsPerChild
)的结果。所以要将MaxClients
增长到超过16个进程才能提供的时候,你必须同时增长ServerLimit
的值。
不一样的MPM对这个指令的处理是不同的:
mpm_worker
的默认值是75。这个MPM将基于整个服务器监视空闲线程数。若是服务器中总的空闲线程数太少,子进程将产生新的空闲线程。mpm_netware
的默认值是10。既然这个MPM只运行单独一个子进程,此MPM固然亦基于整个服务器监视空闲线程数。mpm_beos
和mpmt_os2
的工做方式与mpm_netware
差很少,mpm_beos
的默认值是1;mpmt_os2
的默认值是5。
不一样的MPM对这个指令的处理是不同的:
mpm_worker
的默认值是250。这个MPM将基于整个服务器监视空闲线程数。若是服务器中总的空闲线程数太多,子进程将杀死多余的空闲线程。mpm_netware
的默认值是100。既然这个MPM只运行单独一个子进程,此MPM固然亦基于整个服务器监视空闲线程数。mpm_beos
和mpmt_os2
的工做方式与mpm_netware
差很少,mpm_beos
的默认值是50;mpmt_os2
的默认值是10。
备注:ServerLimit
表示Apache容许建立的最大进程数。 值得注意的是,Apache在编译时内部有一个硬限制ServerLimit 20000
(对于mpm_prefork
模块为ServerLimit 200000
)。你不能超越这个限制。
使用这个指令时要特别小心。若是将ServerLimit
设置成一个高出实际须要许多的值,将会有过多的共享内存被分配。若是将ServerLimit
和MaxClients
设置成超过系统的处理能力,Apache可能没法启动,或者系统将变得不稳定。
注意:在配置相关参数时,请先保证服务器具有足够的硬件性能(例如:CPU、内存等)。 若是发现自启动后,随着服务器的运行时间增长,服务器的内存占用也随之增长,多是程序中出现内存泄露,请向下调整参数MaxRequestsPerChild
的值以下降内存泄露带来的影响,而后尽快找出程序中的问题之所在。