网站缓存设置:老站长踩坑总结的实战干货
前阵子帮一个刚做电商的朋友调网站,他说斥巨资买了顶配服务器,打开还是卡得要死,点半天出不来,用户说付款都付半天,已经跑了好几个单了。查了一圈,差点笑出声。缓存设置完全错了。静态资源全没缓存,每次打开都重新拉,动态页面反倒开了永久缓存,用户登录都能看到别人的购物车,差点出大事。
这不扯吗?很多新手站长买完服务器传完程序,开了缓存就完事,根本不管怎么设,结果要么卡到爆,要么出大乱子。
先搞清楚:你的网站到底需要缓存哪些东西?
缓存本质就是把常用的内容提前放到离用户更近的地方,不用每次都从源服务器重新生成拉取。原理就这么简单,很多人就是搞反了缓存对象。
不变的静态资源,一定要强制长时间缓存。css、js、图片、字体、图标库这些,你一年改几次?我见过很多网站一年换一次logo都了不起了,这些东西不缓存,用户每次打开都重新下载,那不卡才怪。
会变的动态内容、用户个人相关内容,绝对不能乱缓存。购物车、个人中心、提交表单后的页面、后台管理界面,这些你缓存了,下一个用户进来直接看上个用户的隐私,轻则出错重则赔钱,真不是吓唬人。
哪怕是首页这种公共内容,也别开永久缓存,设个几十分钟到几小时的缓存足够,既能扛流量,更新文章也能很快看到新内容。
https://obgeo.oss-cn-beijing.aliyuncs.com/pvc-articles/8d632256-5830-4c4c-9e4f-d143ed80ce54.jpg
Nginx网站静态资源缓存配置示例图
不同层级缓存怎么调?实战参数直接拿去用
缓存不是开一个开关就完事,分好几个层级,从CDN到服务器端,再到浏览器端,一层一层设对才有用。
先说CDN缓存,现在大部分站长都用CDN对吧?CDN把你的资源放到全国各地的节点,用户就近获取,本身就是加速的核心。
我自己做站,CDN上静态资源缓存时间一般设7天到30天,别设几个小时,那等于没开。改了资源怎么办?现在CDN都有一键刷新,改完手动刷一下对应资源就行,花不了10秒钟。要是怕忘,就给静态资源改文件名的时候加个版本号,比如原来叫style.css,改成style.v2.css,不管缓存设多久,自动拉新的,根本不用刷。
动态页面CDN我一般不开缓存,只有流量特别大的站,首页才开10到30分钟的缓存,列表页开1小时,详情页直接关掉,就是怕内容不更新。
再说服务器端缓存,用Nginx的话,我对静态文件的设置就是expires 30d,直接30天缓存,配上刚才说的版本号方法,从来没出过问题。哦对,PHP网站一定要装OPcache,这个真的是被很多新手忽略的神器。
OPcache会把PHP编译后的字节码存在内存里,不用每次请求都重新编译,我之前有个小站没开,CPU动不动跑到80%,开了之后直接稳定在10%以内,就这么夸张。很多虚拟主机默认是不开的,你去面板找一下开关,找不到就问服务商,开了立竿见影。
用WordPress这类建站程序的,别瞎开缓存插件的所有功能。我见过好多人开了全页面缓存,结果用户发了评论看不到,还以为发不出去,其实就是缓存没更新。我用缓存插件一般只开静态资源缓存和浏览器缓存,页面缓存只开首页,列表页开1小时,详情页流量不大就直接关,流量大就开个2小时自动过期,稳得很。
https://obgeo.oss-cn-beijing.aliyuncs.com/pvc-articles/961b7d43-ac79-4742-a42b-c930ce1685ea.jpg
WordPress网站缓存插件核心设置截图
最后说浏览器缓存,很多人忽略这个。浏览器缓存就是告诉浏览器,哪些东西存在用户本地多久,不用每次都问服务器有没有更新。设对了,用户第二次打开你的网站,真的秒出。你不设置,浏览器每次都请求服务器验证,哪怕资源没改,也要多花几百毫秒,慢就是这么一点点堆出来的。
那些踩过的坑,给你拎出来避坑
https://obgeo.oss-cn-beijing.aliyuncs.com/pvc-articles/6ee942af-f7d8-4239-a94b-bf8fa2a85407.jpg
那些踩过的坑,给你拎出来避坑
说几个我自己踩过,身边朋友也栽过的大坑,都是真金白银换出来的教训。
第一个坑:缓存时间设太长,改了内容用户看不到。之前我改官网的banner,半个月后还有老用户找我说怎么还是旧的,哦原来我图省事CDN缓存设了半年,忘了刷新,尴尬得要死。解决方法就是我刚才说的,静态资源改了就换带版本号的文件名,一劳永逸,根本不用记着刷新。
第二个坑:全页面缓存搞乱用户信息,出大事。之前那个做电商的朋友,为了扛大促流量,开了全页面永久缓存,结果一堆用户反应下单买到了别人选的商品,因为打开的是缓存的别人的购物车,最后赔了不少优惠券才搞定,亏大了。记住,只要带用户个人信息的页面,一定要加进缓存排除列表,流量再大也不能碰这个底线。
第三个坑:缓存开太多,开发改代码半天不生效,急死个人。我刚做站的时候,改了个js功能,刷新五六遍还是旧代码,抓着头发找了半小时问题,最后才发现,CDN有缓存,服务器有缓存,浏览器还有缓存,清了三遍才出来新代码。所以记住,开发调试的时候一定要把所有缓存都关掉,上线再开,别给自己找罪受。
还有个隐蔽的坑,缓存吞了统计数据。我之前就碰到过,开了全页面缓存之后,统计数据掉了一半,吓得我以为被搜索引擎降权了,结果查了半天才发现,统计代码存在静态缓存里,每次都不重新加载,数据自然不对。解决也简单,把统计代码改成异步加载,或者放到不缓存的模块里就行。
说实话,很多人觉得我网站流量小,只有几百IP,用不着搞缓存。不对,哪怕你流量小,缓存设对了,打开速度快,用户愿意留,搜索引擎也喜欢,排名还能涨,花十分钟调一下,稳赚不赔。
哪怕你用的是虚拟主机,也能弄,面板有设置就改面板,没有就装个程序缓存插件,都能搞定,不是只有独立服务器才能玩缓存。
缓存这东西,核心逻辑就一句话:不变的使劲缓存,常变的少缓存,带用户信息的别缓存。就这么点事,很多人非要反着来,所以越弄越慢还出问题。你按这个思路调一遍,网站速度至少提一倍,不信你去试试。 支持理性讨论,反对无脑争吵,楼主带了个很好的头。 这个话题确实很值得讨论,我也有类似的经历,非常认同楼主的观点。 之前一直半知半解,看了你的解释一下子就明白了,讲得通俗易懂。 虽然有些地方不太懂,但整体看完还是收获很多,慢慢消化一下。 已经推荐给朋友来看了,好东西就应该一起分享一起学习。 支持楼主继续更新,这么好的内容值得让更多人看到和学习。 看了这么多帖子,还是觉得你这篇最实在,条理清晰又容易理解。 内容全面又细致,几乎把相关问题都覆盖到了,非常用心。 看完之后深有感触,有些话真的说到心坎里了,很有共鸣。 非常有建设性的意见,对解决实际问题有很大的参考意义。
这个问题困扰我很久了,看了你的帖子终于有思路了,非常感谢。 很多点我之前都没想到,楼主一提醒才恍然大悟,收获很大。
页:
[1]