apache性能优化
通过修改apache的配置文件,能对apache的很多特性进行控制和优化
一、AllowOverride
尽量不要使用.htaccess文件,重写该文件所在目录的apache配置信息,尤其是在这个目录或其下级所有目录访问量比较大的位置,应关闭该选项(AllowOverride none),并把这些配置信息直接写在apache的配置文件里,如httpd.conf。
如果该选项被打开 AllowOverride AuthConfig | FileInfo | Indexes | Limit,那么apache会对对被打开该选项的目录及其所有子目录的访问进行.htaccess文件检查。
例如:
<Directory /var/www/>
AllowOverride All
</Directory>
假现在有一个对 /var/www/htdocs/images/201003/bg.jpg 的访问,那么apache会对以下目录进行.htaccess文件检查:
/var/www/
/var/www/htdocs/
/var/www/htdocs/images/
/var/www/htdocs/images/201003/
这需要一定的系统消耗,特别是在一个访问量较大的系统中,系统消耗更加明显。
性能最佳配置是:
<Directory /var/www/>
AllowOverride none
</Directory>
二、与DNS相关的优化
1、关闭HostnameLookups(HostnameLookups Off)
打开该选项会使apache对每个访问请求的client IP地址进行反向解释并对反向解释结果进行正向解释,以验证该名称的正确性。这无疑会增加apache对请求的响应时间。
2、不要用域名进行访问控制配置,而是直接使用IP,例如:
<Directory /var/www/>
Deny from all
Allow from 127.0.0.1 # 这里使用IP,而不是域名
</Directory>
如果使用域名,同样会造成apache进行反向及正向两次解释,apache文档原文如下:
you will pay for two DNS lookups (a reverse, followed by a forward lookup to make sure that the reverse is not being spoofed).
性能最佳配置是:
HostnameLookups Off
<Directory /var/www/>
order deny allow
Deny from all
Allow from 127.0.0.1 # 这里使用IP,而不是域名
</Directory>
三、FollowSymLinks 和 SymLinksIfOwnerMatch
1、尽量打开FollowSymLinks,如:
<Directory /var/www/>
Options FollowSymLinks
</Directory>
该选项是控制是否充许用户请求符号连接的文件,如果关闭该选项,如:
<Directory /var/www/>
Options -FollowSymLinks
</Directory>
则会导致apache对每个请求,检查从/var/www/目录开始的所有目录及其下级目录与最终的文件进行检查,判断每一级目录和所指向的文件是否为符号连接,与AllowOverride类似,这将是一笔可观的开销。
2、应尽量关闭SymLinksIfOwnerMatch,如:
<Directory /var/www/>
Options -SymLinksIfOwnerMatch
</Directory>
因为FollowSymLinksIfOwnerMatch 的选项打开,会在文件所有者与连接所有者相同时使用符号连接,其它情况不充许,会引起符号连接检查。
性能最佳配置是:
<Directory /var/www/>
Options FollowSymLinks -SymLinksIfOwnerMatch
</Directory>
四、MPM(Multi-Processing Module)优化
apache具有三种MPM,但每次只能有一个MPM是活动的,必须使用 --with-mpm=(worker|prefork|event) 静态编译。
prefork——传统MPM,每个请求使用一个进程;
worker——较新的MPM,它使用多个进程,每个进程又有多个线程,这样就能以较低的开销获得更好的性能。
event——最新的MPM,是一种实验性的模型,为不同的任务使用单独的线程池。
选择使用何种MPM取决于许多因素。在event MPM 脱离实验状态之前,不应考虑这种模型,而是在使用prefork和worker之间作出选择。表面上看来,如果所有底层模块(包括 PHP 使用的所有库)都是线程安全的,线程要优于分叉(forking)。而 Prefork 是较为安全的选择;如果选择了 worker,则应该谨慎测试。
1、确定你的apache使用的是哪种MPM
httpd -l
在ubuntu linux中,可用下面两种方法查看:
方法1、
################
apache2 -l
Compiled in modules:
core.c
mod_log_config.c
mod_logio.c
prefork.c
http_core.c
mod_so.c
#################
方法2、
#################
dpkg -l |grep apache
ii apache2 2.2.16-1ubuntu3 Apache HTTP Server metapackage
ii apache2-mpm-prefork 2.2.16-1ubuntu3 Apache HTTP Server - traditional non-threaded model
ii apache2-utils 2.2.16-1ubuntu3 utility programs for webservers
ii apache2.2-bin 2.2.16-1ubuntu3 Apache HTTP Server common binary files
ii apache2.2-common 2.2.16-1ubuntu3 Apache HTTP Server common files
ii libapache2-mod-php5 5.3.3-1ubuntu9.1 server-side, HTML-embedded scripting language (Apache 2 module)
#################
2、prefork配置实例
######################
<IfModule mpm_prefork_module>
StartServers 50
MinSpareServers 15
MaxSpareServers 30
MaxClients 225
MaxRequestsPerChild 4000
</IfModule>
#######################
StartServers:Web 服务器启动时,预先启动 50 个进程
MinSpareServers及MaxSpareServers:apache尽力保持 15 到 30 个空闲服务器运行。
MaxClients:充许启动的最大进程数,如果这个数量超过256,必须设置 ServerLimit,大于或等于MaxClients。由于内存容量有限,这个数值过大会引起过多的内存交换(swap),从而降低整体服务质量,如果过小又不能充份利用服务器资源,所以要视具体情况而定。
MaxRequestsPerChild:尽管一个进程能够处理许多相继的请求,但这里Apache 还是会取消连接数超过 4,000 以后的进程,这降低了内存泄漏的风险。
实际的配置要根据你的服务器的硬件资源及访问量而定,没有一个绝对的优化数值。