Apache是目前Internet上使用最为普遍的Web服务器。它具备比商业Web服务器不遑多让的功能与速度,同时安装与设置也十分简单,正是这些特性让它成为市场占有率最高的Web服务器软件。不过Apache安装简单,并不意味着简单地安装就能够适用于绝大多数应用环境,在高负荷的Web站点,Apache还须要进行调整、优化...... php
优化方法
Apache的配置文件是httpd.conf。Windows下该文件位于Apache安装目录的Conf子目录下,RedHat Enterprise Linux AS 3.0 Update 2位于/etc/httpd/conf。经过调整该文件的某些参数,能够优化Apache的运行效率。
为了验证后文Apache参数的调整是否起做用,咱们一般用Apache附带的ab(Apache Bench)对其进行压力测试。
ab最经常使用的语法格式是这样的:
ab -n XXX -c YYY -k http://hostname.port/path/filename
其中:
-n XXX:
表示最多进行XXX次测试。也就是下载filename文件XXX次。
-c YYY:
客户端并发链接个数。
-k:
启用HTTP KeepAlive功能。默认不启用KeepAlive功能。
好比咱们要对http://hostname:port/file.com下载10000次进行测试,并发访问为60个,启用HTTP KeepAlive功能,则访问指令为:
ab -n 10000 -c 60 -k http://hostname:port/file.htm
测试平台
在本次优化过程当中。笔者采用了两台电脑进行压力测试。其中一台为客户端,运行ab发送请求,另一台为服务器,安装有Apache提供Web服务。
1.服务器配置
服务器端,笔者采用了较低端的配置。这样更容易经过ab测试看来调整参数后的效果:
CPU: Intel Celeron 1.0GHz
内存: 512MB SRAM 100MHz
硬盘: Maxtor 4D040H2
网卡: D-Link DFE 530TX
服务器端笔者安装两种操做系统:Windows Server 2003 Enterprise Edition并升级到最新的Hotfix。Apache服务器版本为2.0.50;或者RedHat Enterprise Linux AS 3.0 Update 2。
2.客户端配置
为了使评测的瓶颈不在客户端,笔者客户端配置要比服务器端好,具体硬件配置以下:
CPU: P4 3.0GHz 533MHz 打开了HT支持
内存: 512MB DDR 400
硬盘: WD1200JB-00CRA1
网卡: D-Link DFE 530TX
客户端安装有RedHat Enterprise Linux AS 3.0 Update 2。并利用其中的ab来进行性能测试。
通用优化技巧
对于Apache服务器来讲,为了提升性能须要进行的某些参数调整具备通用性,也就是说只要采用了就可使其性能更好。
1.关闭DNS和名字解析
* HostnameLookups on | off | double
Apache 1.3以前HostnameLookups默认是打开的。这样客户端在访问服务器时,服务器将要解析客户端的主机名,并将其保存在日志文件中。对客户端进行域名反向解析会大幅下降服务器速度,因此最好将其设置为Off。关闭指令以下:
HostnameLookups off
* UseCanonicalName on | off | dns
打开UseCanonicalName是Web服务器的标准作法。这是由于客户发送的大部分请求都是对本服务器的引用,打开该项设置就能使用ServerName和Port选项的设置内容构建完整的URL。若是将这个参数设置为Off,那么Apache将使用从客户请求中得到服务器名字和端口值,从新构建URL。
若是你不须要在Apache中架设虚拟主机,建议设置为:
UseCanonicalName on
2.关闭多余模块
Apache采用了模块化设计,管理员能够有选择地加载一些模块来增强服务器的功能。这些模块,能够在建立服务器时静态编译到服务器的二进制代码中,也能够编译成一些独立服务器程序的Dynamic Shared Objects(DSO)文件,在Apache启动的时候根据须要,动态加载。事实证实,不加载多余的模块老是能够提升Apache的性能。
Apache的DSO模块是在httpd.conf中以:
LoadModule access_module modules/mod_access.so
方式加载。当不须要某个模块时,只要在其前添加“#”,注释掉该行。
通常来讲,不须要加载如下模块:
mod_include.so:
服务器端包含,是一种已通过时的技术。
mod_autoindex.so:
若是不但愿Apache列目录显示,能够删除。
mod_access.so、mod_auth.so:
若是你不须要进行安全验证,也没有必要加载。
最好加载如下模块:
mod_dir.so:
用于定义缺省文档index.php、index.jsp等。
mod_log_config.so:
用于定义记录文件格式。
mod_mime.so:
定义文件类型的关联。
最后须要说明一点的是,并非加载全部的模块都会下降Apache性能。好比mod_zip能够把文件压缩以后再传给客户端,这样就能够减小40%左右的网络流量,而mod_expires则能够减小10%左右的重复请求。
3.取消.htaccess验证
除非你肯定须要使用.htaccess文件来控制客户端对相应目录的访问权限,不然设置“AllowOverride None”,能够免除Apache在每一个目录搜索.htaccess文件之苦。
4.取消符号连接
FollowSymLinks容许使用符号链接,这将使用浏览器有可能访问文档根目录(DocumentRoot)以外的内容,而且只有符号链接的目的与符号链接自己为同一用户所拥有时(SymLinksOwnerMatch),才容许访问,这个设置将增长一些安全性,但将耗费Apache大量的资源。
笔者建议:
Options FollowSymLinks
可是不要启用SymLinksOwnerMatch。
5.打开KeepAlive支持
在HTTP 1.0中和Apache服务器的一次链接只能发出一次HTTP请求,而KeepAlive参数支持HTTP 1.1版本的一次链接,屡次传输功能,这样就能够在一次链接中发出多个HTTP请求。从而避免对于同一个客户端须要打开不一样的链接。不少请求经过同一个TCP链接来发送,能够节约网络和系统资源。
在Apache的配置文件httpd.conf中,设置:
KeepAlive on
KeepAliveTimeout 15
这样就能限制每一个链接的保持时间是15秒。在咱们的评测中发现,打开KeepAlive以前,ab测试的数据为:
Requests per second: 201.32 [#/sec] (mean)
Time per request: 298.031 [ms] (mean)
Time per request: 4.967 [ms] (mean, across all concurrent requests)
Transfer rate: 839.49 [Kbytes/sec] received
而打开KeepAlive支持以后,ab测试数据为:
Requests per second: 341.70 [#/sec] (mean)
Time per request: 175.594 [ms] (mean)
Time per request: 2.927 [ms] (mean, across all concurrent requests)
Transfer rate: 1437.04 [Kbytes/sec] received
最能反应Apache服务器性能的Requests per second,即每秒完成的请求次数从201.32提高到341.70,提高幅度为70%。虽然在现实环境中,不可能有这么多的同一链接发出的请求,但启用KeepAlive确实在必定程度上能够提升Apache服务器的吞吐量和反应速度。
另外,能够设置:
MaxKeepAliveRequests 100
把MaxKeepAliveRequests设置的尽可能大,能够在一次链接中进行更多的HTTP请求。但在咱们的测试中还发现,把MaxKeepAliveRequests设置成1000,则评测的客户端容易出现“Send requesttimed out”的错误,因此具体数值还要根据本身的情形来设置。
参数决定性能
Apache除了能够经过一些常规方式进行优化外,还须要调整其运行参数,这样才能构建一个适合相应网络环境的Web服务。这些指令从两个级别对Apache进行了优化。
* 进程级(Process-level)
进程级的参数用来控制Apache相应的客户端请求的进程数Process(在Windows下称之为线程数,threads)。
* 协议级(Protocol-level)
协议级的指令则用来控制Apache与客户端的链接多久才自动断开。
因为Windows和Linux/UNIX设计原理的不一样,因此进程级的指令根据Apache是工做在Linux/UNIX或者Windows下,而分红两种。
1.Linux下Apache性能优化
Linux下的Apache预设工做在prefork模式下(由每一个进程处理链接请求),这种工做模式也是Apache 1.3系列的工做模式。若是你须要其工做在其余模式下,则须要手工编译源代码来实现:
./configure --prefix=/usr/local/apache-2.0.50 --with-mpm=worker --enable-include && make && make install
Linux下进程级的Apache调整参数包括如下五个。
* StartServers
该参数决定Linux启动时,自动打开的Apache服务器的数目。它对Apache服务器的性能没有太大的影响。由于若是MinSpareServers设置的比较大,Apache服务器进程数会立刻调整到不小于MinSpareServers的数目。
在Linux下,咱们能够经过:
ps aux |grep httpd
来查看当前打开的Apache服务进程数。
* MinspareServers
该参数用于配置在任什么时候候可用的最小Apache进程个数。通常状况下,当目前可用的Apache进程数不能知足需求时,Apache会自动打开新进程以服务客户。因此设置MinspareServers为较大的值只是为了让在比较繁忙的Web环境,让Apache能够尽快地知足客户端的访问需求。对于天天有百万访问量的网站来讲,下面的数值是比较合适的:
MinspareServers 32
* MaxSpareServers
较大的MinSpareServers能够保证Apache有较快的反应速度,过大的MinSpareServers又会占用更多的系统内存。若是你的系统内存不是很充足或者运行有其余的服务,把MaxSpareServers设置小一些能够为其余服务空出一些内存。当空闲Apache进程超过MaxSpareServers指定的数值时,Apache主进程会杀掉多余的空闲进程而保持空闲进程在MaxSpareServers指定的数值。
对于天天百万访问量的网站来讲,配置大容量的内容,而且设置以下的值是比较合适的:
MaxSpareServers 64
* MaxClients
服务器的处理能力毕竟是有限的,不可能同时处理无限多的链接请求。参数MaxClients就用于规定服务器支持的最多并发访问的客户数。
若是MaxClients设置得过大,系统在繁忙时不得不在过多的进程之间来回切换为更多的客户服务。这样对每一个客户的反应就会变慢;若是设置得太小,系统繁忙时就会拒绝客户链接请求。
咱们的设想原则是,当服务器性能较高时,能够适当增长这个值的设置。若是繁忙出现拒绝访问现象,说明须要升级服务器硬件了。
若是你不在乎访问速度,或者认为反应速度慢也总比拒绝链接好,能够把该值设置大一些。
* MaxRequestsPerChild
当设置KeepAlive为off时,Apache服务器是用单独的子进程为一次链接服务,这样,每次链接都须要生成、关闭子进程,这些额外的操做浪费了计算机的大量处理能力。最好的方式是一个子进程能够为屡次链接请求服务。
但子进程在接受访问请求时,须要不断地申请和释放内存,次数多了就会形成内存垃圾,影响系统稳定性。为了解决这个问题,能够规定每个子进程处理的最大请求数,超过此数值,就让该子进程退出,再从原始的httpd进程中从新复制一个干净的副本,从而提升系统的稳定性。
第个子进程可以处理服务请求的最大次数由MaxRequestsPerChild定义。RedHat Enterprise Linux AS 3.0 Update 2缺省的设置值为1000这个值比较适合(设置为0支持每一个副本进行无限次的服务处理)。
在咱们的测试过程当中发现,RedHat Enterprise Linux AS 3.0 Update 2下默认配置的Apache并不能很好地应付大负荷站点。咱们须要打开KeepAlive,并加大StartServers、MinSpareServers、MaxSpareServers和MaxClients的数值。这些参数对于Apache性能的改善有很大的影响。
小知识:
RedHat Enterprise Linux AS 3.0 Update 2最大MaxClients只能设置到256。若是你须要设置其为更高,须要在MaxClients前面添加:
ServerLimit xxx
其中xxx不能少于MaxClients的数值。该设置方法适用于Apache 2.0系列。
2.Windows下Apache优化
Windows下,Apache 2.0通过了全新的设计,采用多线程的方式(work)运行。这种运行方式,理论上比Linux/UNIX的Perfork运行模式有更好的性能。
Work模式下由单个控制进程负责子进程的创建。每一个子进程能够创建由ThreadsPerChild指定的固定数量的线程。由独立的线程监听并处理到来的链接。
在Windows下能够执行“Apache -l”。查看当前工做模式,若是显示“mpm_winnt.c”,则表示Apache工做在多线程模式下;在Linux下执行“httpd -l”看到“prefork.c”表示工做在子进程模式下。
其配置语句是:
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
Apache力图维持一个备用的服务线程池,让客户端无须等待线程/进程的创建便可获得处理。最初创建的进程数由StartServers指定。而后Apache会不停地检测全部Apache进程中空闲线程的总数,并新建或结束进程使总数维持在MinSpareThreads和MaxSpareThreads所指定的范围之内。但同时能够获得处理的客户端的最大数量又取决于MaxClients指令,而进程创建的最大数量取决于ServerLimit指令。三者之间的关系为:
ServerLimit*ThreadsPerChild >=MaxClients