在众多的网站优化手册中,你会听到很多这样的说法,有的说要开启服务器的etag,有的说不要。
但是很少有人说不开启 Last-Modified,这是为什么呢,ETAG和Last-Modified之间又有什么关系呢。
Etag和Last-Modified都是有服务器端生成,并且随着文件的改变而改变,这样浏览器端就会只重新请求时,服务器会根据之前返回的etag值和last-modified的值来判断请求的文件是否发生变化,
如果没有变化的话,就给请求的agent(一般理解为浏览器)一个304的http头部,not modified的回应,告诉agent说你本地的文件还是新的,目前服务器还没有变更,你就拿本地的来用吧。从而减少浏览器端和agent端数据的流量(想想如果每次请求都返回完整的内容,当访问量大的时候,流量的有多大),加快浏览器的反应速度;另一方面,也减轻服务器端的压力,提高了服务器并发的能力。所以服务器端Etag和last modified配置上都比较重要。
呵呵,那么etag和last modified之间有什么不同点呢?
任何东东的出现都是有原因的,last modified只能精确到秒,如果一个文件1秒内被改了好些次,那么last moidfied就没有用了;再或者分布式部署的时候,由于机子的时钟有可能不一样,用户从一台机子到另外一台机子的时候,last modified就没有用了。于是etag这个类似基于文件唯一标识的hash的就出现了,这样的话,不管你服务器怎么变化,不管你1秒变化多少次,只要唯一标识的hash不变,文件不变。
一般而言,etag是根据文件的innode(文件的索引节点值)以及mtime(文件修改时间)以及size(文件大小)三个部分组成。但是这里也还是有点问题的,因为不同的服务器上,文件的innode节点有可能是不一样的,所以在配置的时候需要小心,根据自己系统的特点选择唯一的标识。但是在集群服务器上,这个是很难实现的,于是乎就有的网站优化手册里建议你关闭etag这个选项,也是有道理的。不过明晰事情的真相后,自己也可以根据自己的业务特点来使用了。
呵呵,有的服务器etag和last modified都使用了。那么web服务器处理这两个条件的优先级如何呢?(这个估计很少人去追究了)
通过跟踪了一下apache1.3的源码,得知etag的优先级高于last modified。呵呵,所以yahoo的优化法则上说关闭etag,不无道理晒。
看看apache的源码,让你来个明白:
关注加黑部分,其它的都是一些参数检查和配置检查。
int set_last_modified(request_rec *r, time_t mtime)
{
char *etag, weak_etag[MAX_STRING_LEN];
char *if_match, *if_modified_since, *if_unmodified, *if_nonematch;
time_t now = time(NULL);
if (now < 0)
now = r->request_time;
table_set(r->headers_out, "Last-Modified",
gm_timestr_822(r->pool, (mtime > now) ? now : mtime));
/* Make an ETag header out of various pieces of information. We use
* the ...
网站优化之web服务器配置优化
网站优化之web服务器配置优化,web服务器作为一个web运营的后台使者,一般而言,默认的配置就可以用使用了,但是如果你的站点的访问量很大,并发程度很高的时候,根据业务适当的调整能够得到不一样的效率。其实服务器配置优化的核心就是让web服务器尽快的处理完一个请求,从而减少服务器资源的使用,从而能够到达一个性能的优化
网站的前台页面进行了优化,后端的数据库服务器也进行优化,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、图片等,由于请求频繁,数据量小,建议
打开这个选项,减少网络的开销。
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.1
Accept: 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-cn
Accept-Encoding: gzip, deflate
User-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 ...