Apache作为大多数人接触的第一个webserver,一直以配置简单,安全稳定而著称。作为草鸟级运维的我们,经常被问关于web优化方面的问题,所以我们要提前准备些,今天就总结些关于apache优化的小知识点。虽然apache已经很完美了,但是还有些不足的地方需要我们结合环境,结合需求,手动的去做些相应的更改,让其为我们提供更好更优质的服务,手动的更改俗称优化,使用apache自带的ab命令可以让优化后与优化前的性能有一个明显的对比。

ab最常用的语法格式是这样的: 
           ab -n XXX -c YYY -k http://hostname.port/path/filename 
              其中: -n XXX: 表示最多进行XXX次测试。也就是下载filename文件XXX次。

                          -c YYY: 客户端并发连接个数。 

                                 -k: 启用HTTP KeepAlive功能。默认不启用KeepAlive功能。 
                   比如我们要对http://www.baidu.com/index.html下载10000次进行测试,并发访问为60,  启用keepalive,命令为:         
ab -n 10000 -c 60 -k http://hostname:port/file.htm

通用优化技巧:对于apache服务器来说,为了提高性能需要进行的某些参数的调整具有通用性,也就是活只要采用了就会变得更好。

1、关闭DNS跟名字解析 hostnamelookups on | off  1.3之前是打开的,后来默认是关闭的;UseCanonicalName on | off | dns : 打开这个是web服务器的标准做法。因为客户发送大部分请求是对本服务器的引用,阿凯该项设置就能使用ServerName和Port选项额设置内容构建完整的URL。如果这个参数设置为off,那么apache将使用从客户请求中获得服务器名字和端口值,重新构建URL。如过你不需要在apache中架设虚拟主机,建议设置为:on。

2、关闭多余模块: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等。

LoadModule deflate_module modules/mod_deflate.s 压缩模块

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。

 

<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>

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

* ServerLimilt

当设置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系列。

 服务器性能优化:

1、关闭daemous(后台服务),释放内存,减速启动时间,减少CPU处理的进程数。

2、关闭图形GUI