调优是一个大主题,涉及面颇广。目前受条件所限,大部分人可能只能从apache本身入手调优。所以本文将主要从apache的配置方面入手来详解apache调优。希望对正在使用apache的朋友有所裨益,有什么问题欢迎交流探讨,大家共同学习共同进步! mysql
KeepAlive参数
KeepAlive On
MaxKeepAliveRequests 0
KeepAliveTimeout 15
使用keepalive可以在单一连接时进行多个请求。
Keepalivetimeout 每个连接保持的时间
MaxKeepAliveRequests这个我就不解释了,意思是最大保持的连接数,0为不限制。
我在来形象的描述一下,KeepAlive中的连接就像是餐厅中的女服务员,而KeepAliveTimeout就是服务员的忍耐时间,我和几个哥们往店里一坐然后开始唠嗑,根本不理她,她不可能一直站在那吧?所以忍耐度一够她就撤了。
这个数目设多少合适呢?因服务器而异,就像五星级的餐厅和街边小餐馆的区别。
选择多处理模块(Multi-Processing Module,MPM)
这玩意主要负责管理网络连接、调度请求。理解成不同的社会制度就好,万恶的封建主义和万恶的资本主义,很难说的清谁好谁坏,所以针对不同情况选择就好。
每 次只能有一种 MPM 被应用,必须使用 –with-mpm=(worker|prefork|event) 静态编译。Apache默认安装是使用一个进程的传统模型称为 prefork。较新的线程化模型称为 worker,它使用多个进程,每个进程又有多个线程,这样就能以较低的开销获得更好的性能。最新的 event MPM 是一种实验性的模型,为不同的任务使用单独的线程池。要确定当前使用的是哪种 MPM,可执行 httpd -l。
mysql
MPM中的MinSpareServers 和MaxSpareServers
MinSpareServers指令设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。
只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。
MaxSpareServers 指令设置空闲子进程的最大数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进 程将杀死多余的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。如果你将该指令的值设置为比 MinSpareServers小,Apache将会自动将其修改成”MinSpareServers+1″。
以上说明摘自apache中文手 册。根据我个人的理解这个进程就像是apache大酒店的服务小姐,MinSpareServers设置的就是小姐的基本富裕人数,服务员带着我去开房了 这时候如果有其他人来也需要有人照顾的对吧?这个富裕人数就是应对这种状况的。MaxSpareServers就是最大空闲人数了,什么意思?你一个三星 apache大酒店搞2万个服务员开的下去吗?很显然除非你有门路,不然是没有那么多人的,服务员住哪(硬件)都是个问题。哈哈,扯远了。所以设定这个值 一定要结合自身情况,当客流量大的时候数值也适当增大。可是流量大的时候也就是个别时段,所以用crontab搞一下就好 unix
prefork模式中的调节
默认配置如下
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
几 乎所有的文档都会罗列出上面的数据。StartServers的值是只要启动服务就会立即启动 8 个进程,并尽力保持 5 到 20 个空闲服务器运行。进程数的硬性限制由 MaxClients 指定。尽管一个进程能够处理许多相继的请求,Apache 还是会取消连接数超过 4,000 以后的进程,这降低了内存泄漏的风险。 linux
Worker模式中的调节
默认配置如下
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
与 prefork的调节类似,不同之处只是必须确定使用多少线程和进程。要经过几次尝试和出错之后才能选好要使用的值。最重要的值是 MaxClients。目标在于允许足够多的 workder 进程或线程运行,同时又不会导致服务器进行过度的交换。如果传入的请求超出处理能力,那么至少满足此值的那些请求会得到服务,其他请求被阻塞。
如 果 MaxClients 过高,那么所有客户机都将体验到糟糕的服务,因为 Web 服务器会试图换出一个进程,以使另一个进程能够运行。而设得过低意味着可能会不必要地拒绝服务。查看高负载下运行的进程数量和所有 Apache 进程所导致的内存占用情况对设置这个值很有帮助。如果 MaxClients 的值超过 256,必须将 ServerLimit 也设为同样的数值 linux
缓存动态内容
<IfModule mod_cache.c>
CacheForceCompletion 100
CacheDefaultExpire 3600
CacheMaxExpire 86400
CacheLastModifiedFactor 0.1
<IfModule mod_disk_cache.c>
CacheEnable disk /
CacheRoot /home/wwwroot/
CacheSize 327680
CacheDirLength 4
CacheDirLevels 5
CacheGcInterval 4
</IfModule>
<IfModule mod_mem_cache.c>
CacheEnable mem /
MCacheSize 8192
MCacheMaxObjectCount 10000
MCacheMinObjectSize 1
MCacheMaxObjectSize 51200
</IfModule>
</IfModule>
linux
参数的解释
mod_cache.c
CacheEnable: 启动mod_cache其后接两个参数。第一个参数指定快取的种类,应设为mem(记忆体快取)或disk(磁碟快取)之其一;第二个参数指定使用快取的URI路径,如果对整个网站(或虚拟主机)进行快取,简单指定为根目录(/)即可。
CacheForceCompletion: 指定当 HTTP request 被取消时,内容的产生动作要完成的百分比;预设是 60(%)。
CacheDefaultExpire: 指定快取的预设过期秒数;预设值是一小时 (3600)。
CacheMaxExpire: 指定快取最大的过期秒数;预设值是一天 (86400)。
CacheLastModifiedFactor: 用来从回应里 Last Modified 资讯算出 expire date。
mod_disk_cache.c
CacheRoot: 指定磁碟快取所使用的目录。
CacheSize: 指定快取使用的磁碟空间大小;以 KByte 为单位。
CacheDirLength: 指定各目录存在于快取階层(hierarchy) 中所使用的字元数。
CacheDirLevels: 指定快取的目录层数; CacheDirLength,acheDirLevels设定值相乘不能超过 20。
CacheGcInterval: 指定收垃圾 (Garbage Collection) 的动作间隔时间;单位是小时。Apache2 中这个指令还沒有被实在。
linux
mod_mem_cache.c
MCacheMaxObjectCount 最大缓存对象数;默认值1009。
MCacheMaxObjectSize 缓存允许的最大文档大小;默认值10000。
MCacheMaxStreamingBuffer 内存中允许缓冲的最大流式响应字节长度;默认值100000与MCacheMaxObjectSize中的小者。
MCacheMinObjectSize 允许缓存的最小文档大小;默认值 0。
MCacheRemovalAlgorithm 定义在需要时哪个文档被移出缓存的算法;默认值 LRU|GDSF。
MCacheSize 允许使用的最大内存量;以KB为单位默认值100。
关闭网页内容协商
一个资源可能会有多种不同的表现形式,比如,可能会有不同语言或者媒体类型的版本甚至其组合。最常用的选择方法是提供一个索引页以供选择。但是由于浏览器可以在请求头信息中提供其首选项的表现形式,因此就有可能让服务器进行自动选择。
linux
除非是五星级饭店各国来宾都比较多,否则不建议开启,因为这玩意严重降低性能。
Options -MultiViews oracle
关闭或者开启符号链接
这个符号连接就是俗称的软链接,好像是windows中的快捷方式。
通 过这个链接用户很可能就进入到你不想让他们看见的位置,从安全角度上来说这是非常糟糕的。所以从安全角度上考虑那就用Options SymlinksIfOwnerMatch 。当然也许你根本不知道那个符号链接是个什么东西,那就直接Options FollowSymlinks unix
控制.htaaccess文件
关闭在全局选项中改为AllowOverride None
这样可以省去apache找htaccess的时间,也自然就节省了资源。
那么原来的.htaccess的如何安置呢?将其放入<Directory></Directory>即可。
unix
关闭DNS查询
五星级餐厅用的都少。直接关闭。
HostNameLookups Off
oracle
当优化工作完成后
使用ab对负载进行测试
ab –n 1000 –c 1000 http://www.yourdomain.com/site.html
-n 1000 表示请求1000次
-c 1000 表示每次1000个请求
因为只能对某个页面进行测试,注意是单位是个。所以最后的结果可能并不一定能反应真实情况。
或者使用 Apache Ant 和 Apache JMeter 频繁进行负载测
http://blog.sina.com.cn/s/blog_4d1cc4c90100becq.html
linux
结合自身情况确保关闭系统中不需要的服务
Keepalive的开启与关闭
在理想的网络连接状况下,系统的 Apache 进程数和内存使用可以用如下公式表达:
HttpdProcessNumber = KeepAliveTimeout * TotalRequestPerSecond / Average(KeepAliveRequests)
HttpdUsedMemory = HttpdProcessNumber * MemoryPerHttpdProcess
换成中文:
总Apache进程数 = KeepAliveTimeout * 每秒种HTTP请求数 / 平均KeepAlive请求
Apache占用内存 = 总Apache进程数 * 平均每进程占用内存数
unix
需要特别说明的是:
[平均KeepAlive请求] 数,是指每个用户连接上服务器后,持续发出的 HTTP 请求数。当 KeepAliveTimeout 等 0 或者 KeepAlive 关闭时,KeepAliveTimeout 不参与乘的运算从上面的公式看,如果 [每秒用户请求] 多,[KeepAliveTimeout] 的值大,[平均KeepAlive请求] 的值小,都会造成 [Apache进程数] 多和 [内存] 多,但是当 [平均KeepAlive请求] 的值越大时,[Apache进程数] 和 [内存] 都是趋向于减少的。
基于上面的公式,我们就可以推算出当 平均KeepAlive请求 <= KeepAliveTimeout 时,关闭 KeepAlive 选项是划算的,否则就可以考虑打开。