前言:本文经过我对大多数网站的http头分析、自己做网站中的一些缓存设置、服务器的一些配置优化,后又阅读了RFC2616HTTP协议相关内容,以做此文。

原版下载

1、为什么要cache?

这是个经常提到但很多时候又无法突然准确回答的问题。粗略讲,就是要加速和减压。
加速:试想中国的网络,网通电信(就不提铁通之类)开创了互联互通新障碍,我们的用户在不多交钱的时候就得忍受奇慢的跨网速度。而作为互联网运营者,我们希望用户获得最好的用户体验,因此我们就要打破这个障碍。
很多互联网服务商已经用分布cache解决了这个问题,比如sina,把中心服务器的内容分发到各个省市的cache服务器,根据用户所在的网络(ip段)来确定用户拉去最近服务器上的内容,达到访问速度最快。
对于小型网站,页面静态化也是常用的cache方法,因为web服务器处理静态页面速度优于程序脚本,所以也起到了加速的作用,当然,也为了下一个原因-服务器减压。
减压:显而易见,动态脚本的输出速度比一个静态的页面要慢的多(解释、执行、数据库数据读取)。因此,如果我们让用户只是读取一个静态文件,那硬件成本就会很低。大量用户访问静态文件而很少访问动态脚本,如何以节约昂贵的硬件资源。
可以看出,cache还是有二利而无一害的。

2、目前流行的cache模型

可以看到,在数据库、web上,都做了相应的cache。至于生成静态文件,这个技术应该不是一个问题,所以,我在这里主要说一下通用的前端cache。

3、前端cache工作原理(apache mod_cache、squid)

Squid是一个linux下非常流行的代理服务器,当然,这里我们更多的是使用其缓冲(cache)的功能。
Apache mod_cache是从2.0版本开始加入的一个缓存模块,可以作为类似squid的缓存服务,我只尝试过在使用代理模块(mod_proxy)的时候使用,组合作为一个简易版squid,至于其他应用还没有深挖。
这里,首先提几个http协议里的头标志:
Last-Modified 文档最后修改时间,类似于php中的filemtime
Date 文档从服务器端发出的服务器端时间
Expires 文档过期时间
Cache-Control 这个指令我暂时不能用人类的语言表达清楚,大概就是,如果其他域缓存控制有冲突,一切听这个,优先级别比较高。
Pragma 一些特定指令,一般不用,但用的也很多。因为用其他几个参数就能实现目的了。

突然发现语言逻辑出了问题,居然不能表述cache的原理,故底下作图,简单说明。

这样就清楚多了,废话全省了。看不懂者请我吃饭,我给你们当面讲解。

4、实例

现在访问
http://www.sunboyu.cn/wp-content/themes/zen-in-grey-10/images/headerimage.jpg
第一次访问,我们用firebug网络标签查看:200 OK
然后刷新一下再看:304 Not Modified
综合一下其他域,分析为啥会这样
第一次访问:
请求信息

  1. Host www.sunboyu.cn
  2. User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)
  3. Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  4. Accept-Language zh-cn,zh;q=0.5
  5. Accept-Encoding gzip,deflate
  6. Accept-Charset GB2312,utf-8;q=0.7,*;q=0.7
  7. Keep-Alive 300
  8. Connection keep-alive
  9. Referer http://www.sunboyu.cn/
  10. Cookie __utma=100971139.746333267.1249527244.1253502591.1253523523.65; __utmz=100971139.1249527244.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); wp-settings-1=editor%3Dhtml%26align%3Dcenter%26m0%3Do%26m1%3Dc%26m2%3Dc%26m3%3Dc%26m4%3Do%26m5%3Do%26m6%3Do%26m7%3Dc%26m8%3Do%26hidetb%3D1%26urlbutton%3Durlfile%26imgsize%3Dlarge%26m9%3Do%26m10%3Do; wp-settings-time-1=1252910178; PHPSESSID=a9af3fbfa19442fe549227e1a355ac52; __utmc=100971139

第一次访问,发送基本的请求信息。

反馈信息:

  1. Date Mon, 21 Sep 2009 09:09:01 GMT
  2. Server Apache/2.2.11 (FreeBSD) mod_ssl/2.2.11 OpenSSL/0.9.8e DAV/2
  3. Last-Modified Wed, 22 Jul 2009 08:13:25 GMT
  4. Etag "797fe8-45a3-46f46f1fb1340"
  5. Accept-Ranges bytes
  6. Content-Length 17827
  7. Keep-Alive timeout=5, max=100
  8. Connection Keep-Alive
  9. Content-Type image/jpeg

服务器反馈了该文件的信息,其中包括date:反馈的时间;last-modified:最后修改时间;etag:页面的姆印信息。

第二次访问:
请求信息:

  1. Host www.sunboyu.cn
  2. User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)
  3. Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  4. Accept-Language zh-cn,zh;q=0.5
  5. Accept-Encoding gzip,deflate
  6. Accept-Charset GB2312,utf-8;q=0.7,*;q=0.7
  7. Keep-Alive 300
  8. Connection keep-alive
  9. Referer http://www.sunboyu.cn/
  10. Cookie __utma=100971139.746333267.1249527244.1253502591.1253523523.65; __utmz=100971139.1249527244.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); wp-settings-1=editor%3Dhtml%26align%3Dcenter%26m0%3Do%26m1%3Dc%26m2%3Dc%26m3%3Dc%26m4%3Do%26m5%3Do%26m6%3Do%26m7%3Dc%26m8%3Do%26hidetb%3D1%26urlbutton%3Durlfile%26imgsize%3Dlarge%26m9%3Do%26m10%3Do; wp-settings-time-1=1252910178; PHPSESSID=a9af3fbfa19442fe549227e1a355ac52; __utmc=100971139
  11. If-Modified-Since Wed, 22 Jul 2009 08:13:25 GMT
  12. If-None-Match "797fe8-45a3-46f46f1fb1340"
  13. Cache-Control max-age=0

由于信息浏览被缓存在浏览器cache中,所以向服务器请求的时候顺便带上了if-modified-sine信息,if-none-match的信息。

反馈信息:

  1. Date Mon, 21 Sep 2009 09:09:33 GMT
  2. Server Apache/2.2.11 (FreeBSD) mod_ssl/2.2.11 OpenSSL/0.9.8e DAV/2
  3. Last-Modified Wed, 22 Jul 2009 08:13:25 GMT
  4. Etag "797fe8-45a3-46f46f1fb1340"
  5. Accept-Ranges bytes
  6. Content-Length 17827
  7. Content-Type image/jpeg

此次访问,因为etag信息的比较,服务器确定浏览器本地缓存了此文件。并且在浏览器发送的信息 if-modified-since时间后,服务器的文件并没有发生变化,因此,服务器发送304指令使浏览器读取本地缓存,以减少http信息传输量,提高响应速度。

5、进阶(对缓存服务器的控制)

http关于缓存的控制不仅可以控制浏览器,针对代理服务器依然有效。比如我们使用squid进行反向代理服务,我们可以通过调整http头信息而确定用户是否要访问squid的缓存信息,或者不缓存而直接转发服务器的反馈。
假如现在,一台apache的server跑php,主要是cms,由于工期的问题,没工夫做生成静态了,但我们还希望负载不要太大,因此我们在前边加了一台squid服务器,希望能缓存html结果,这样实现项目快速推进。
当然,服务器部署好之后,还需要程序这边做一些配置,就是发送合适的http的头信息,程序做好修改即可。
首先,我们做一个规划:
网站首页希望缓存5分钟,因为不断有新网站发布。
列表页面缓存1小时,因为不断有新的文章发布,但比首页频度还是下降了一些。
文章最终显示页面缓存一天,因为发布要经过多人审核,一般不会修改,但也难免修改一两个字眼。
为了便于演示,我本地架设了apache和squid。当然鄙视一下自己,是用的windows版本,否则就不能玩剑三了。
言归正传,结构如下:

当访问http://127.0.0.1:8888的时候,squid转发请求至http://127.0.0.1:80获取内容,然后反馈给用户,抑或把缓存的内容直接发送给用户。
现在做首页的发布。
首页缓存5分钟,也就是300秒。
从squid访问apache时间算起,过期时间则为 time()+300
用php发送http头 header(”Expires: ” .gmdate(”D, d M Y H:i:s”,time()+300). ” GMT”);
验证:在仿真环境中模拟,我们用httpwatch来查看squid反馈,根据apache和squid的日志来验证缓存是否生效。
写一个文件

  1. < ?php
  2. header("Expires: " .gmdate("D, d M Y H:i:s",time()+300). " GMT");
  3. echo "Content test!!";
  4. ?>

部署完毕后访问 http://127.0.0.1 看是否顺利输出。然后访问 http://127.0.0.1:8888 看是否可以看到预期内容。
如果能顺利输出,则证明squid apache工作皆正常。
现在用httpwatch查看头信息
第一次访问:

  1. HTTP/1.0 200 OK
  2. Date: Wed, 23 Sep 2009 07:55:42 GMT
  3. Server: Apache/2.2.13 (Win32) PHP/5.2.6
  4. Accept-Ranges: bytes
  5. X-Powered-By: PHP/5.2.6
  6. Expires: Wed, 23 Sep 2009 08:00:42 GMT
  7. Content-Type: text/html
  8. X-Cache: MISS from squid.sunboyu.cn
  9. X-Cache-Lookup: MISS from squid.sunboyu.cn:8888
  10. Via: 1.0 squid.sunboyu.cn (squid/3.0.STABLE13-BZR)
  11. Connection: close

第二次访问:

  1. HTTP/1.0 200 OK
  2. Date: Wed, 23 Sep 2009 07:55:42 GMT
  3. Server: Apache/2.2.13 (Win32) PHP/5.2.6
  4. Accept-Ranges: bytes
  5. X-Powered-By: PHP/5.2.6
  6. Expires: Wed, 23 Sep 2009 08:00:42 GMT
  7. Content-Type: text/html
  8. Age: 28
  9. X-Cache: HIT from squid.sunboyu.cn
  10. X-Cache-Lookup: HIT from squid.sunboyu.cn:8888
  11. Via: 1.0 squid.sunboyu.cn (squid/3.0.STABLE13-BZR)
  12. Connection: close

比较两次访问,两次访问时间 07:55:42 相同,过期时间相同 08:00:42,跟之前设置的5分钟相符。第一次X-Cache显示为MISS,因为一次访问,squid缓存中并没有相关信息,所以从apache中获得,第二次缓存中存在缓存信息,直接读取缓存输出,为之“命中”。

根据这个实验,很容易得知第二和第三条要求的做法:

  1. < ?php
  2. header("Expires: " .gmdate("D, d M Y H:i:s",time()+3600). " GMT");
  3. ……
  4. ?>
  5. < ?php
  6. header("Expires: " .gmdate("D, d M Y H:i:s",time()+86400). " GMT");
  7. ……
  8. ?>

只需要给页面加上一个过期的http头,即可实现我们的缓存目的。这样做,比生成页面方便多了。当然,如果求seo效果,可以用重写来实现,缓存效果不变。
如何来显示一下缓存后的结果呢?我们可以写一个一般复杂的php脚本,其中运算数据库都使用,直接在apache运行,压力测试一下;然后使用squid访问,访问一次后,关闭apache,然后再压力测试,比较成绩。^_^,因为有了squid,apache跟mysql都不工作了,当然要非常节约资源。
Squid的合理使用,达到了快速网站开发,减轻服务器压力,提高用户影响的目的。
底下分析下squid在分布式加速方面的应用。
分析新浪的一些图片,发现http头中有这样的信息:

  1. http://i1.sinaimg.cn/blog/temp/1/2008/0306/U2725P503T1D169F1DT20090701101305.jpg
  2. HTTP/1.0 304 Not Modified
  3. Date: Fri, 28 Aug 2009 22:09:32 GMT
  4. Content-Type: image/jpeg
  5. Expires: Sat, 28 Aug 2010 22:09:32 GMT
  6. Last-Modified: Wed, 01 Jul 2009 02:13:05 GMT
  7. Age: 81943
  8. X-Cache: HIT from zjm-209.sina.com.cn
  9. Connection: keep-alive

可以发现是命中了zjm-209.sina.com.cn。
Sina在全国各地有好多服务器,其DNS根据用户访问的ip确定用户需要访问哪台服务器最快,则把请求转发到相应服务器,来提高用户访问速度。
大概结构如下:

总结
Cache的确是个好东西,使用好了,做事事半功倍。不过很多时候我们得cache和”非cache”共用。有些内容需要cache,有些页面却要避免cache。当然squid也给出了接口方面控制每个缓存元素。过度的cache也是不好的,在cache之前,对项目进行严谨的分析和大量的测试是我们创建缓存机制的一个前提。

网站Cache全分析相关推荐

  1. cache-control_网站 cache control 最佳实践

    有时,当第二次访问网站时,看起来比较怪,样式不正常. 通常,是因为 cache control 缓存控制策略定义不正确,导致服务端最新部署之后客户端没有接收到最新的更改. 本文将向您展示正确的缓存设置 ...

  2. 网站加载速度 优化_您肯定要优化网站的加载速度。 这是如何做。

    网站加载速度 优化 Do you remember this iconic scene from a very famous Star Wars Parody? 您还记得著名的<星球大战> ...

  3. clickinrefresh.php,IDCZE_v3.0 IDCZE商业导航系统全新仿照114la网址导航 - 下载 - 搜珍网...

    IDCZE商业导航网站/ IDCZE商业导航网站/#cache/ IDCZE商业导航网站/#cache/compile/ IDCZE商业导航网站/#cache/compile/%2Fadmin%2Fi ...

  4. 12306系统架构优化

    coolshell陈皓优化方案 原文:http://coolshell.cn/articles/6470.html 一.业务复杂度比对 (1)qq业务模型:只访问自己的数据 (2)秒杀业务模型:秒杀能 ...

  5. 面经 - OpenStack(Docker、Django、K8S、SDN)知识点

    文章目录 概述 OpenStack 虚拟化 kvm 网络虚拟化 基本技术 Memcached Etcd 消息队列 概念 交换机类型 缺点 重复投递问题 顺序投递问题 restful api Horiz ...

  6. 迅雷诉超级兔子侵权案9日开庭

    刚刚取得了对美国电影协会的侵权诉讼胜利,迅雷就立刻投入到了一场号称"维权"的新官司.近日,迅雷方面确认,已经正式就"迅雷超级兔子版"软件涉嫌侵权一事向" ...

  7. Wordpress优化:网站用nginx前端缓存+Redis Cache缓存提速网站

    本问转载:https://www.src1024.com/xy/seo/31780.html 新手站长搭建网站一般为了省钱没去选择大厂的云服务器,而小厂的服务器虽然便宜,但是访问速度也很感人,同时如果 ...

  8. 利用HTTP Cache来优化网站

    原文地址: http://www.cnblogs.com/cocowool/archive/2011/08/22/2149929.html 对于网站来说,速度是第一位的.用户总是讨厌等待,面对加载的V ...

  9. 使用nginx cache缓存网站数据实践

    Nginx本身就有缓存功能,能够缓存静态对象,比如图片.CSS.JS等内容直接缓存到本地,下次访问相同对象时,直接从缓存即可,无需访问后端静态服务器以及存储存储服务器,可以替代squid功能. 1   ...

最新文章

  1. 微软网站打不开_强烈建议收藏,微软出了自家「协作白板」应用
  2. ztree html写法,ztree.html
  3. composer安装fxp插件时候提示内存不足且没有交换空间的解决办法
  4. tcp3次握手,https加密,ca认证
  5. 海鸥表表带太长了怎么拆_表带安装,表带太长了,怎么拆解和安装?
  6. Taro+react开发(63) 修改蓝湖的样式
  7. 关于文件整理的一些心得
  8. 【python】python程序的输入输出以及标识符详细解读
  9. 进位和借位问题的研究
  10. 《解析几何》吕林根,徐子道第四版 习题 1.4.7,1.4.8,1.4.9
  11. JNI java.lang.UnsatisfiedLinkError
  12. Java中操作SFTP服务器上的文件下载上传
  13. 学习笔记1--汽车发展史及发展趋势
  14. 4星|《激荡十年,水大鱼大》:过去十年间国内商业简史
  15. Android使用Intent一键分享图片文字到腾讯、新浪、开心、微信等
  16. 【AI语音】九联UNT402A_通刷_纯净精简_免费线刷固件包
  17. Nacos中的@Value无法获取配置文件的值
  18. NRF51822-QFAC/NRF51822-QFAA/NRF51822-QFAB
  19. Windows CMD 常用命令指示符
  20. 网易考试大题知识盲区之B树、B+树、B*树

热门文章

  1. PostgreSQL树形结构的递归查询
  2. Unity-射线检测
  3. 云中网络的隔离:GRE、VXLAN
  4. VBA 字典嵌套字典 + 数组
  5. @Enumerated的使用
  6. (HDU - 3709)Balanced Number(数位DP)
  7. 单片机STM32入门——(1)程序结构
  8. 客户体验和营销:您需要了解的 5 个最佳实践
  9. pvqc计算机类专业英语,计算机 英文
  10. node.js读取文件中文乱码问题