网站的前台页面进行了优化,后端的数据库服务器也进行优化,cgi程序也根据服务器的配置进行了相关的优化,剩下的就是对应用的服务器进行相关的优化了。
这些web服务器如果按照默认的配置来运行的话,可以满足大部分的需求,如果只需要根据业务的特性来更改几项配置就能获得较好的性能,用户能够得到更加良好的用户体验,那还是很值得的。
常用的web类服务器有如下几个方面的:
1 负载均衡类:haproxy nginx
2 cgi服务器类:apache lighttpd nginx
3 前端cache类:varnish squid
本文主要讲讲apache 2.0的配置优化。
1 apache
apache1.3支持prefork进程模式,apache2.0支持multi thread模式。
进程模式和线程模式的却别在于进程模式重量级一些,所以性能稍微低一些;但是,稳定一些,一个进程core掉不影响其它的进程。
线程模式轻量级,性能较高;但是多个线程共享一个进程空间,一个线程的core就会影响当前的所有线程,稳定度低一些。
至于选择线程模式还是进程模式需要根据自己的业务需要的选择了,还有就是开发写的程序是不是足够的稳定。
httpd.conf中下面的几个参数需要注意:
MaxClients:缺省值是256,描述了最多接受的客户端的数量,如果并发超过256个客户端的话,就会被阻塞住,放到等待的队列里,所以对大并发的网站将这个值设置大一些,如1024,不过这个值需要根据你的硬件的配置,如cpu和内存以及带宽来定,而且2.0的环境下还需要在这个值之前设置ServerLimit 2000,否则启动时会报错
StartServers:缺省值5,意义是apache启动的时候创建的控制进程数目。
这个值也可以设置大一些,这样的话,就可以从容处理一开始的大并发MinSpareServers:缺省值5,至少保留的空闲进程数目,如果空闲进程小于这个数目,然后创建1个,1秒后创建2两个,然后1秒后4个直到32个。
MaxSpareServers:缺省值10,最多的空闲进程的数目,如果超过这个数目的进程数,将会被kill掉
MaxRequestsPerChild:缺省值0,每一个子进程能够处理的请求数,设置为0表示从不终止子进程,不过最好设置为10000或稍大一点值,从而避免内存泄漏,尽早的释放占用的一些资源。
SendBufferSize:缺省值为操作系统的设置,设置tcp中的缓冲区的大小,以字节为单位,设置这个值需要根据自己的应用来定,对于网络比较拥塞的情况,将值设置为下发包的最大的大小,不过需要注意,这个值会影响每个tcp链接;如果网络情况良好,可以将这个值设置小一些,从而浏览器这边可以较早的得到数据,尽早的开始渲染。
KeepAlive:缺省值是On,http1.1的协议为了减少以前每次请求都要连接的情况,设置了keepalive这个属性,从而可以减少网络连接的负载;对于cgi的服务器建议将这个值设置为off,由于请求相对不连续,可以提高并发量;然而对于静态文件服务器,如js、css、图片等,由于请求频繁,数据量小,建议打开这个选项,减少网络的开销。
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)KeepAliveTimeout:缺省值15,服务器保持连接存活的时间,对于大并发,建议关小一点这个值,从而可以接受更多的请求。建议设置为3~5秒。
MaxKeepAliveRequests:缺省值100,如果服务器打开的连接接受的请求已经达到这个数目,连接将会被关闭,这个值的优先级高于MaxClients和ThreadsPerChild。
TimeOut:缺省值300,连接空闲的时间,如果空闲时间大于这个值,连接会被关闭。对于网络延迟比较小,并发比较大,建议将这个值设置小一些,如10。
LimitRequestBody:缺省值0,PUT或者POST模式请求时的最大包的大小,0值表示没有限制。根据自己的业务来设置这个值,避免一些恶意的过大的请求包导致服务器瘫痪。
HostnameLookups:缺省值on,输出日志时是否吧用户的IP地址转换为域名,建议关闭这个值,设置为off,dns比较费时间的。
AllowOverride:缺省值为打开,这样apache会对每个子目录检查htaccess文件,对性能有一定的影响,如果有必要,建议关闭这个值,设置为none
Options:对于目录的操作设置,建议关闭SymLinksIfOwnerMatch,从而减少lsstat的调用,打开FollowSymLinks
ServerTokens Prod,减少返回给客户端浏览器的包的大小
在httpd.conf中注释掉你不需要的的module,一方面可以减少apache的内存占用,毕竟每个module需要一定的内存来保存其信息;另一方面,可以较少一些回调时的不必要的处理流程。
如果并发很大的话,还需要调整apache服务器的listenbacklog数量。
listenbacklog=511,缺省值是511(具体也要参考操作系统的相关设置),用于设置apache的等待连接队列的最大数量,如果并发很大,或者遭遇了SYN攻击,需要将这个值设置大一些,如4096,避免一些用户的连接在队列满后被丢弃。
apache服务器尽量的开启压缩功能,由于传输的基本上都是一些html等文本数据,压缩比是很高的,开启压缩功能,能够将网络传输的字节数降到最少,一方面节约了带宽,毕竟带宽是要花钱的,一方面可以加速下载的时间,提升用户的体验
通过添加mod_deflate模块,并进行最基本的压缩设置
AddOutputFilterByType DEFLATE text/html text/plain text/xml后,通过httpwatch观察的测试结果如下:
GET /test.htm HTTP/1.1Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, */*Accept-Language: zh-cnAccept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Foxy/1; WPS; TencentTraveler 4.0; Foxy/1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)Host: localhostConnection: Keep-AliveVary: Accept-EncodingContent-Encoding: gzipContent-Length: 565Keep-Alive: timeout=5, max=100Connection: Keep-AliveContent-Type: text/html
1.5K大小的页面test.htm,传输到浏览器时的大小是565字节。压缩比例相当高!
apache的配置与业务的类型有很大的关系的,所以我们在修改了配置后,最好能够进行一下并发和压力测试,从而能够得到一个较好的值:
性能测试客户端工具:
1 ab
ab -n10000 -c100 http://****/php/my.php
-n总共发起的请求数
-c并发的请求数
2 loadrunner
3 服务器性能查看命令:
1)iostat
2)vmstat
3)top
4) netstat
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)如Php的CGI这边也需要进行一下自身的性能统计,如果cgi性能已经很差了,apache的优化是很难看到。
性能测试CGI:
1 XDEBUG工具的使用
2 CGI代码开启性能测试代码
function getmicrotime(){list($usec, $sec) = explode(" ",microtime());return ((float)$usec + (float)$sec);}$time = getmicrotime();//业务代码echo "p所用时间: ",getmicrotime() - $time, " seconds";