首先,如题所说,本文所说的优化是针对apache 2.2以上版本,及使用perfork MPM模式的。perfork是apache在linux下默认安装下的模式,如果使用apache作为服务器的放在,还是使用perfork模式比较好,worker模式下对php某些功能并不支持。如果你使用的是win系统或都没有使有和perfork,那么下面可以选择不看或抱着学习的态度看看咯。
以下内容均属个人见解,实际测试请根据你的服务器,程序及其他因素按需处理。
一般情况下,我们需要优化apache就是因为apache占用大量的内存,导致vps当机,因为perfork是多进程处理的,每个进程都会点用一定的内存数量。所以限制httpd进程的数量,从而达到优化apache的作用。影响单个httpd进程的内存大小,主要都是加载模块,至少什么模块是合适的,我也很难说,因为这个是按由你的需要而定的。网上有些人说,绝大部分都会用不上的模块列出来,我认为这个是有很大的误导作用,因为绝大部分人中,也许你就是其中一个。将有用的模块屏蔽掉,最坏的情况,就是重启apache出错,或部分功能无法使用。所以我也不会列出什么最少模块加载方案什么的。所以,我只会说出一些参考。
apache(perfork)下的模块加载,并不是模块加载列表,没有的模块并不是屏蔽掉了,只是我也不清楚它的实际作用。
(一)、对于apache2.2,模块名有cache的一般都是有用的,因为有不少的这类模板都是2.1以上的apache才支持的,所以这类的模块不会是无缘无缘而存在的。
(二)、很有可能或必用到的模块有:
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule include_module modules/mod_include.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule expires_module modules/mod_expires.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule mime_module modules/mod_mime.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
(三)、我粗略点了一下apache里面的模块约在50+以,要从中选择人人都适用的模块加载列表是不可能的,至少cgi模块我是不会用,但不排除你不会用。
模块加载这一块就说到这里,这个大家多百度,多用自然会识别出一些有用模块并渐渐屏蔽不使用的模块。
接下来,就是最为重要的perfork配置,也是困扰了我很久的问题,尽管参数就那么6个,那是却足以让你的vps当机。先列出需要修改的参数,修改位于httpd.conf的文件里面
Timeout 30
KeepAlive On
MaxKeepAliveRequests 80
KeepAliveTimeout 15
<IfModule prefork.c>
ServerLimit 150
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 4000
</IfModule>
上面的代码就是要修改的,实际上我们是要修改perfork里在的参数,之所以将Timeout,KeepAlive等也写出来,是因为这个也是影响apache性能的。
Timeout 是一个连接多少时间后断开,这个参数设置在30-60是一般的php程序都是适用的,至少要运行一些要占用大量时间的php程序,那么适当调高也是可以的,但请不要太高,否则会影响apache性能,本次优化我们使用30就很足够了。
MaxKeepAliveRequests 是一个连接最大的请求量,对于页面有较多的图片等元素,可以适当调高一点,对于一般的网页设置在80-120是足够的,我们就设置为100,如果设置太高会导致httpd长时间不能退出释放内存的。
KeepAliveTimeout 是当用户处理一次连接时,如果在该参数的时间内还有请求则会继续执行,不需要重新创建新的连接,直到达到MaxKeepAliveRequests的最大值才会退出。对于perfork模式下的,有人认为是将KeepAlive Off会比较好,但是对于绝大多数的网站都会不多不少有些图片元素,所以将该项打开,并将KeepTimeOut设置在2-5秒,不但有效提高服务器性能,也能加快页面打开速度。
接下来,就是正式进入perfork的参数设置了,不想服务器运行一会就内存占满的得看看哦。
首先是参数ServerLimit就是服务器最大支持同时连接的客户端,该值将决定下面参数MaxClient可以设定的值的范围。ServerLimit实际上只是起到一个限制的作用,并没有实际有作用,也许有,我就不知道了。实际上起到作用的是,MaxClient参数,但这个值又受ServerLimit的限制,等下会讲。
另三个参数StartServers,MinSpareServers,MaxSpareServers,为什么将这三个参数一起说呢,因为这三个数是联系在一起的。这三个数都是决定空闲进程数量,StartServers应该范围就是MinSpareServers和MaxSpareServers之间。否则,apache会自动将该值还原到两都之间,所以不要浪费不必要的资源。按照perfork默认的配置,这三个参数分别为:5,5,10。但是对于只有512M内存的vps来说,我认为还是有过大的负载。因此,我认为在这里应该退一步,将这三个参数设置为4,4,10,看起来和上面5,5,10并没有什么不同,最大值还是10,但在实际使用中4,4,10释放的内存速度会明显比5,5,10快很多。
接下来就是MaxClient最大支持多少客户端在同一时间连接服务器,简单说就是最大并发数支持,这个没有特别需要说的。对于512M的vps你也别想你的站能承受百万PV,使用默认的150已是超出负载的了。一般将ServerLimit和MaxClient设为一样值即可。
最后就是MaxRequestsPerChild参数,一个进程在处理多少次之后退出,设置为0则是无限次,也就是说不会退出,那么httpd进程也不会退出。那么,你就等着你的vps当机重启去吧。对于这个参数,我粗略地搜索了一下,不少人推荐在1000次,也有100次的。据我的测试,对于内存只有512M的vps来说,该值设置在500以上都会很快占满内存,但不至少于当机。而观察得知,一但内存占满,cpu的使用率几乎变为0了。由此可知,当机了那什么都干不了了,还不如消耗多一点cpu资源避免,提高稳定性。所以,我最后的决定是将该值定义在30-40之间。这样设定后,可以看出,内存释放速度得到很大的提升,但也可以看到cpu也在频繁上下跳动。这样设置,即使内存占满,也能在最短时间恢复正常。
所以对于512MB的vps,apache(perfork模式)最后的优方配置为:
Timeout 30
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 2
<IfModule prefork.c>
ServerLimit 150
StartServers 4
MinSpareServers 4
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 40
</IfModule>
这样,我们的配置基本完成,进行负载测试即可。负载测试,我们使用ab测试,先声明一点,是用你本地的虚拟机去测试服务器上的一个静态页面,而不是在服务器上测试。之前,我就是这样做,因为网速一样,效果都是比较好的,但别人都是不同网速的,所以服务器上测试是不准确的。
3、现在看看需要怎么优化:连接数理论上是越大越好,但是得根据硬件,服务器的CPU,内存,带宽等因素,查看当前的apache连接数:
ps aux | grep httpd | wc -l
计算httpd 占用内存的平均数:
ps aux | grep -v grep |awk '/httpd/{sum += $6;n++};END{print sum/n}'
这个只是做个参考。计算后要减去服务器系统本身所需要的资源。
比如内存2G,减去500M留给服务器,还有1.5G,那么可得到最大连接数:在8000左右。
根据情况修改后的httpd.conf的prefork的配置后为:
<IfModule prefork.c>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 5500
MaxClients 5000
MaxRequestsPerChild 100
</IfModule>
这里重点介绍下ServerLimit,必须放到MaxClients前,值要大于MaxClients。
该页面还没有任何评论,赶快占个沙发吧!