Apache
Apache 7 : 参数调优
## Timeout 60 - 该参数指定Apache在接收请求或发送所请求内容之前的最长等待时间(秒),若超过该时间Apache则放弃处理该请求,并释放连接。 - 该参数默认值为120,推荐设置为60,对于访问量较大的网站可以设置为30或15。 ## KeepAlive On - keepAlive 配置指令决定当处理完用户发起的 HTTP 请求后是否立即关闭 TCP 连接,如果 KeepAlive 设置为On,那么用户完成一次访问后,不会立即断开连接,如果还有请求,那么会继续在这一次 TCP 连接中完成,而不用重复建立新的 TCP 连接和关闭TCP 连接,可以提高用户访问速度。 - 那么我们考虑3种情况: 1.用户浏览一个网页时,除了网页本身外,还引用了多个javascript 文件,多个css 文件,多个图片文件,并且这些文件都在同一个HTTP 服务器上。 2.用户浏览一个网页时,除了网页本身外,还引用一个javascript 文件,一个图片文件。 3.用户浏览的是一个动态网页,由程序即时生成内容,并且不引用其他内容。 对于上面3中情况,我认为:1 最适合打开 KeepAlive ,2 随意,3 最适合关闭 KeepAlive 下面我来分析一下原因。 在 Apache 中,打开和关闭 KeepAlive 功能,服务器端会有什么异同呢? 先看看理论分析。 打开KeepAlive 后,意味着每次用户完成全部访问后,都要保持一定时间后才关闭会关闭TCP 连接,那么在关闭连接之前,必然会有一个Apache进程对应于该用户而不能处理其他用户,假设KeepAlive 的超时时间为10 秒种,服务器每秒处理 50个独立用户访问,那么系统中 Apache 的总进程数就是 10 * 50 = 500 个,如果一个进程占用 4M 内存,那么总共会消耗 2G内存,所以可以看出,在这种配置中,相当消耗内存,但好处是系统只处理了 50次 TCP 的握手和关闭操作。 如果关闭KeepAlive,如果还是每秒50个用户访问,如果用户每次连续的请求数为3个,那么 Apache 的总进程数就是 50 * 3= 150 个,如果还是每个进程占用 4M 内存,那么总的内存消耗为 600M,这种配置能节省大量内存,但是,系统处理了 150 次 TCP的握手和关闭的操作,因此又会多消耗一些 CPU 资源。 再看看实践的观察。 我在一组大量处理动态网页内容的服务器中,起初打开KeepAlive功能,经常观察到用户访问量大时Apache进程数也非常多,系统频繁使用交换内 存,系统不稳定,有时负载会出现较大波动。关闭了KeepAlive功能后,看到明显的变化是:Apache 的进程数减少了,空闲内存增加了,用于文件系统Cache的内存也增加了,CPU的开销增加了,但是服务更稳定了,系统负载也比较稳定,很少有负载大范围 波动的情况,负载有一定程度的降低;变化不明显的是:访问量较少的时候,系统平均负载没有明显变化。 总结一下: 在内存非常充足的服务器上,不管是否关闭KeepAlive 功能,服务器性能不会有明显变化; 如果服务器内存较少,或者服务器有非常大量的文件系统访问时,或者主要处理动态网页服务,关闭KeepAlive 后可以节省很多内存,而节省出来的内存用于文件系统Cache,可以提高文件系统访问的性能,并且系统会更加稳定。 补充1 关于是否应该关闭 KeepAlive 选项,我觉得可以基于下面的一个公式来判断。 在理想的网络连接状况下,系统的Apache 进程数和内存使用可以用如下公式表达: HttpdProcessNumber= KeepAliveTimeout * TotalRequestPerSecond / Average(KeepAliveRequests) HttpdUsedMemory= HttpdProcessNumber * MemoryPerHttpdProcess 换成中文意思: 总Apache进程数 = KeepAliveTimeout * 每秒种HTTP请求数 / 平均KeepAlive请求 Apache占用内存 = 总Apache进程数 * 平均每进程占用内存数 需要特别说明的是: [平均KeepAlive请求] 数,是指每个用户连接上服务器后,持续发出的 HTTP 请求数。当 KeepAliveTimeout 等 0或者 KeepAlive 关闭时,KeepAliveTimeout 不参与乘的运算从上面的公式看,如果 [每秒用户请求]多,[KeepAliveTimeout] 的值大,[平均KeepAlive请求] 的值小,都会造成 [Apache进程数] 多和 [内存]多,但是当 [平均KeepAlive请求] 的值越大时,[Apache进程数] 和 [内存] 都是趋向于减少的。 基于上面的公式,我们就可以推算出当 平均KeepAlive请求 <= KeepAliveTimeout 时,关闭 KeepAlive 选项是划算的,否则就可以考虑打开。 补充2 KeepAlive 该参数控制Apache是否允许在一个连接中有多个请求,默认打开。 但对于大多数论坛类型站点来说,通常设置为off以关闭该支持。 补充3 如果服务器前跑有应用squid服务,或者其它七层设备,KeepAlive On 设定要开启持续长连接 实际在 前端有squid 的情况下,KeepAlive 很关键。记得On。 Keeyalive不能随心所欲设置,而是需要根据实际情况,我们来看一个真实的在我工作中发生的搞笑一次事件: 当时我已经离开该项目了,该项目的TeamLeader看到了keepalive的概念,他只看到了关闭keeyalive可以节省web服务器的内存,当时我们的web服务器只有4gb内存,而并发请求的量很大,因此他就把这个keepalive设成了off。 然后直接导致脱机客户端(脱机客户端用的是.net然后webservice连接)的“login”每次都显示“出错”。 一查代码才知道,由于这个脱机客户端使用的是webservice访问,.net开发团队在login功能中设了一个超时,30秒,30秒timeout 后就认为服务器没有开启,结果呢由于原来的apache设的是keeyalive和timeout 15秒,现在被改成了off,好家伙,根本就没有了这个timeout概念,因此每次.net登录直接被apache弹回来,因为没有了这个 timeout的接口了。 ## MaxKeepAliveRequests 100 最多保持多少个活动的长链接 ## keepalivetimeout 5 连接的保持时间,超过时间就回收 apache进程在使用内存时,是“渐长”的。也就是说,直到这个进程死掉,使用内存的数量是一直增长而不会减少的。这样的话,apache进程使用内存的多少,就决定于你的应用程序最大使用内存量了。 keepalivetimeout 这个参数决定了,在什么都不做之前,一个http进程能够等待多长时间?设想一下,如果keepalive设置为on,而 keepalivetimeout设置为一个比较大的数字,apache占用内存会很快的增长。这是因为,一个apache进程完成了一个任务(并达到了一定的内存占用,想一下“渐进”模式),并不会马上退出,而是等待一个keepalivetimeout时间。假设用户的链接请求持续不断的到来,则积累起来的无用的apache进程就会相当多,直到timeout,这些进程才会被杀死。 但是,keepalive的确对于静态的文件,比如图像文件的传送是很有效的,因此,keepalive要设置为on,但是keepalvietimeout要设置的小些,比如5s ## UseCanonicalName Off 语法:UseCanonicalName On | Off | DNS 默认:UseCanonicalName Off 这个指令用来构造Apache的自引用URL(一个指回相同服务器的URL)。 UseCanonicalName On:会将ServerName设置的域名用于所有的自引用URL、SERVER_NAME、CGI中的SERVER_PORT。比如:如果你的web服务器有自己的域名,并且在DNS中有对应的NS记录,而且httpd.conf将ServerName设置了域名,那么你在浏览器中输入http://192.168.120.240/bbs,它会自动将这个IP地址变成其对应的域名,比如http://www.bob.com/bbs/ 。此时,如果其他客户端的电脑不能正确的解析web服务器的这个域名,那么在访问这个web服务器时将会出现问题。因为web服务器会自动将IP地址转变成域名。 UseCanonicalName Off:如果客户端提供了主机名和端口,Apache将会使用客户端提供的这些信息来构建自引用URL。这些值与用于实现基于域名的虚拟主机的值相同,并且对于同样的客户端可用。CGI变量SERVER_NAME和SERVER_PORT也会由客户端提供的值来构建。 UseCanonicalName DNS:本设置用于为大量基于IP的虚拟主机支持那些不提供“Host:“头的浏览器使用。使用这个选项时,Apache将对客户端连入的服务器的IP地址进行DNS反向解析,以构建自引用URL。 ## ServerTokens Full 语法:ServerTokens Major | Minor | Min[imal] | Prod[uctOnly] | OS | Full 默认:ServerTokens Full 这个指令用来控制服务器回应给客户端的“Server:”应答头是否包含关于服务器操作系统类型和编译进的模块描述信息。 注意:在使用ServerTokens指令时要先启用ServerSignature指令。 ## ServerSignature Off 这个指令用来配置服务器端生成文档的页脚(错误信息、mod_proxy的FTP目录列表、mod_info的输出)。使用该指令来启用这个页脚主要在于处于一个代理服务器链中的时候,用户基本无法辨识出究竟是链中的哪个服务器真正产生了返回的错误信息。http.conf中该指令默认是Off的,这样就没有错误行;使用On会简单的增加一行关于服务器版本和正在提供服务的ServerName; ## HostnameLookups Off 域名查找:这增加了处理每个请求的开销,首先,服务器会对dns系统做一个反向查询以找出客户系统的主机名,然后又进行正向查询看获得的主机名是否真实指向客户的ip。大多数情况下,你可以简单的关闭这个功能,如果你经常处理服务器日志,这个工作完全可以在以后进行。你可以通过在设置文件中加入指示hostnamelookups off来关闭这个功能。 ## options -followsymlinks 符号连接:当打开这个选项时,apache将检查每个请求中是否包含对符号连接的引用,这将对请求中包含的每个路径调用一次lstat()系统调用。除非你准备使用符号连接,否则用 options -followsymlinks 来关掉它。 ## sethandler server-status 服务器状态信息,默认已经关闭。该模块尽管这对测试与监控服务器很有用,但它也为服务器带来了额外的开销,你可以通过寻找任何类似sethandler server-status的指示来关闭,如果可能,你可以在安装apache时移除这个模块。 ## directoryindex index.php index.html 在可以更精确的时候尽可能不要使用通配符之类的灵活选项,删除不需要的选项,明确的指定设置文件列表,最常用的放在最前。 ## cgi模块 除非你有很好的理由否则就允许cgi的执行,将似有的cgi文件放到一个特定的目录并为之设定正确的权限,这避免了apache对每一个请求都要判断一次要求的是一个静态文件还是一个动态文件。 ## 写入日志 写入日志信息是一个很花费时间的工作,apache保持日志文件的打开状态以节省打开文件的时间,如果没有必要存储日志信息,你可以关闭这个选项以节省出更多的处理器时间,只需要在设置文件中把日志那一行注释掉就可以关掉它。 如果必须保留日志,你可以关闭hostnamelookups选项(见上文)然后把日志文件拷备到另一台机器上做进一步分析。 ## allowoverride none .htaccess文件可以极大的扩展apache的设置参数,而无需每次你改变设计都要编辑apache主设置文件,但对这个文件的使用也降低了服务器的性能。 如果使用这个文件,apache必需首先在当前目录中查找是否存在这个文件,如果存在就解析这个文件并在当前目录中应用文件中的设置。更坏的是,apache不仅要查看当前的目录,还要查看当前目录的所有上层目录是否包括htaccess文件以根据所有这些文件最终确定设置。 如果你想最优化服务器的性能,你应该禁止使用htaccess文件,任何基本目录的设置都可以在主设置文件中进行,而主设置文件仅在服务器启动时解析一次。为了禁用htaccess文件,在任何节里加上指示allowoverride none。 ## EextendedStatus Off 关闭对每个请求连接的扩展状态信息跟踪 ## 关闭ExecCGI 如果服务器没有CGI需要运行,从安全和性能方面都强烈建议关闭 <Directory /www> Options -ExecCGI ... </Directory>
顶部
收展
底部
[TOC]
目录
Apache 1:简介安装
Apache 2:配置虚拟主机
Apache 3:安全
Apache 4:性能测试工具ab的应用
Apache 5:并发调优(MPM)
Apache 6 : 性能调优
Apache 7 : 参数调优
相关推荐
Nginx