shell脚本实现整站缓存和预缓存,进一步提升网站整体加载速度

在Linux中,shell脚本结合系统任务计划crontab,非常简单就能实现一些复杂程序才能完成的工作,开发成本低,且简单易学。

张戈博客之前也分享过不少shell在网站运营方面的妙用,比如:

CCKiller:Linux轻量级CC攻击防御工具,秒级检查、自动拉黑和释放

SEO技巧:Shell脚本自动提交网站404死链到搜索引擎

Linux/vps本地七天循环备份和七牛远程备份脚本

nginx日志切割及7天前的历史日志删除脚本

Shell+Curl网站健康状态检查脚本,抓出中国博客联盟失联站点

感兴趣的可以挑选看一看。

本文继续分享一个shell的实用案例:全站缓存和定时预缓存,进一步提供网站速度。shell脚本实现整站缓存和预缓存,进一步提升网站整体加载速度

一、何为预缓存

用过WP-Super-cache插件的站长肯定都知道,这个插件有一个预缓存功能,开启此功能后,插件会对全站预先缓存一遍,并且后面还会定期更新缓存。

显而易见,全站预缓存的好处就是在用户访问之前,就已经生成了静态缓存,而不是被用户访问触发才生成缓存,那么所有用户来访问几乎都是静态缓存,不管是平均还是总体速度都会有质的提升!当然,最重要还是优化了蜘蛛抓取的速度!

大家去百度站长平台查看那个抓取频次的时候,可以看到蜘蛛的平均耗时数据,我博客做了静态缓存,按理说每个抓取都不会超过500ms,但是依然会出现一些十几二十秒的请求:

shell脚本实现整站缓存和预缓存,进一步提升网站整体加载速度

排除蜘蛛抓取的时候存在网络延时或并发负载等情况,还有一个很可能的原因就是蜘蛛正好抓取了一个缓存过期或缓存不存在的页面,也就是说蜘蛛抓取的时候,这个页面缓存正好过期被删除了,那么它抓取的时候就是动态页面,所以耗时就上去了!

因此,全站预缓存还是有必要的。

二、预缓存前身

见识到预缓存的重要性,那么就该想办法实现了。分享方法之前,先说一下灵感来源吧!

记得博客之前分享过各种Wordpress缓存方案,有php代码版本、有nginx的 fastcig缓存等等,当时有人问,有没有办法让sitemap也静态缓存(纯代码版本sitemap)?

当时是对sitemap.php伪静态成sitemap.xml的,所以是动态数据的,而且就放在根目录,所以直接访问sitemap.php也是可以的,由于是全站数据,所以这个文件跑起来很慢!

后来,我用linux命令+crontab就解决了这个需求:将sitemap.php放到某个不为人知的目录,然后定时使用wget去请求这个文件,并将数据保存为sitemap.xml存放到网站根目录就可以了!比如:

Ps:使用这个方法,注意sitemap.php里面的 require('./wp-blog-header.php'); 要改成 require('../wp-blog-header.php'); 也就是注意相对位置!

这样一来,就解决了sitemap.xml是动态数据问题了!

三、全站预缓存

有了上面的案例,如果实现全站预缓存真的太简单了。

可以有如下多种实现形式:

①、已有缓存功能的博客

对于已有缓存功能的博客,比如安装了缓存插件,或使用了nginx缓存,那么只需要从数据库拉出所有文章id或别名,然后组成页面地址,最后使用wget或curl全部请求一遍即可实现缓存,比如:

但是,各个博客的固定地址可能不一样,所以这样拼接ID或别名,不能照搬,而且分类、tag等都没覆盖到位,甚是遗憾。

我也懒得研究如何从数据库弄出所有页面,最后用了一招偷懒的办法:从sitemap.xml中获取页面地址!

几乎每个网站都会有一个sitemap.xml文件,如果你网站没有,那么还是先参考前文弄一个吧!

所以脚本可以改成如下代码:

将此代码按实际修改后保存为 g_cache.sh ,上传到Linux系统,比如就放到 /root 目录,先手工执行看看是否成功:

bash /root/g_cache.sh

shell脚本实现整站缓存和预缓存,进一步提升网站整体加载速度

如图,如果没有报错(图中的骇人速度无需在意,和磁盘IO有关),最后新增一个任务计划即可:

duang的一下,就搞定了!

②、没有缓存的博客

没有缓存的博客,说明你不喜欢缓存,可能也没必要开启缓存,所以下面只是为了保持文章的完整性而写的,大家选择性看看就好!

没有缓存的博客,要全站预缓存有2个途径:

安装缓存插件或开启其他缓存后,再用方法①实现

我就不开启缓存,但是我还是要用全站预缓存,你说怎么办吧!

第1个途径就没必要啰嗦了,简单分享第2种如何实现吧。

从第①步中可以看到,我们只请求页面,但是不保存数据,全部扔黑洞了。那如果我将数据保存为对应的html文件,并存放在网站对应的目录下呢?那不就实现了和cos-real-html插件一样的静态缓存了吗?

很明显还是可以的!代码如下:

按照实际情况,修改代码中的网站根目录和缓存白名单,保存为 g_cache.sh 上传到服务器,接着我们需要新增一个Nginx 伪静态,其实就和之前wp-super-cache的一样:

保存之后,reload 重载 nginx 以生效。

最后,如下新建计划任务,定时执行 g_cache.sh:

如此就实现了wp-super-cache预缓存和cos-real-hmtl的静态缓存功能了。

四、最后的啰嗦

其实,个人觉得本文最大的亮点是最后一个脚本,及实现了缓存,也实现了预缓存,神马缓存插件、神马伪静态都可以丢一边了!而且,只要网站有sitemap.xml文件,那么就可以实现静态缓存,而且不局限与建站程序是什么!

但是,除了爽,我们还是有一些要注意的细节,请务必仔细看看。

①、hosts解析

由于是在服务器本地全站抓取,为了提高速度,缩短路径,强烈推荐在hosts中将网站域名解析到服务器IP,不在走外部DNS解析,以减少解析时间,或者CDN消耗。

很简单,编辑 /etc/hosts 文件,在里面插入一条解析即可,比如:

127.0.0.1  zhangge.net

最后,保存即可。

②、生成间隔

文章中分享的计划任务都是1天一次,如果你觉得有必要缩短间隔,可以自行修改crontab语句,具体可以搜索下crontab配置,了解crontab中 分 时 日 月 周得定义,此处不再赘述。

③、缓存删除

本文只分享了如何生成缓存,并没有说如何自动删除缓存。整体上来说,反正crontab会定期重新生成缓存的,原则上并不用去理会自动刷新缓存。

但是,往往一些强迫症看到评论不刷新,文章修改了也不刷新,就抓耳挠腮,好不舒服。所以这里还是指明一条出路。。。

对于已有缓存功能的网站,使用这个预缓存脚本,实际上不会有任何影响,之前有自动刷新缓存的话,现在依然会刷新,无需操作。

对于使用最后一个脚本的网站,也就实现了和之前分享的php生成html缓存同样的功能,如果想更新文章或提交评论的时候删除这个缓存,可以参考博客之前的文章,修改下缓存路径即可搞定:

WP Super Cache静态缓存插件纯代码版(兼容多域名网站)

哦了,分享到此,有事留字。。。


最新补充:偷懒用sitemap.xml的方法感觉有点Low,所以还是提供一下没有sitemap.xml的方案吧!为了不和上面的内容混淆,还是另起一页,有需求的可以看看,没需求的请忽略。

发表评论

gravatar

:?::razz::sad::evil::!::smile::oops::grin::eek::shock::???::cool::lol::mad::twisted::roll::wink::idea::arrow::neutral::cry::mrgreen:

刷新评论

目前评论:54   其中:访客  42   博主  12

  1. 黑苹果乐园 3 来自天朝的朋友 谷歌浏览器 Mac OS X 10_11_4 浙江省金华市 电信

    神奇的张戈!

    太好用了,速度杠杠的!

  2. 小C博客 4 来自天朝的朋友 QQ浏览器 Windows 7 浙江省杭州市 电信

    你的速度是很666的,我最近也在想折腾下服务器提升下速度!!

  3. 热腾网 4 来自天朝的朋友 谷歌浏览器 Windows 10 河北省石家庄市 电信

    难怪模仿不到张戈的网站速度,原来整站缓存。

  4. 奋斗之路 1 来自天朝的朋友 谷歌浏览器 Windows 7 湖北省荆州市 电信

    你的网站打开有一种冰桶的感觉 哈哈

  5. 颜羽夕。 0 来自天朝的朋友 谷歌浏览器 Mac OS X 10_11_4 广东省东莞市 电信

    还是张大哥脑子灵光,哈哈哈哈

  6. 心系与她 2 来自天朝的朋友 QQ浏览器 Windows 7 山西省太原市 联通

    张哥问下,会占用内存吗?

    • 张戈 [博主] 来自天朝的朋友 谷歌浏览器 Linux 广东省深圳市南山区 电信

      脚本执行的时候可能会带来一定负载,基本影响不大。可以通过控制usleep降低请求速度。

      • 心系与她 2 来自天朝的朋友 QQ浏览器 Windows 7 山西省太原市 联通

        赞一个

      • lizhini.com励志你 2 来自天朝的朋友 谷歌浏览器 Windows 7 北京市 教育信息网

        你的博客是纯技术类型博客啊!和我用的模版是一样的

  7. 微部落博客 4 来自天朝的朋友 谷歌浏览器 Windows 10 江苏省常州市 电信

    我还是一直用的虚拟主机,用的是百度云缓存,不过感觉不够流畅

  8. 回梦博客 2 来自天朝的朋友 Safari浏览器  Android 5.0.2 MI 2S Build/LRX22G 广东省广州市 电信

    我打开你的站点老是会弹框提示什么超时重试,电脑和手机都会提示

    • 张戈 [博主] 来自天朝的朋友 Safari浏览器  Android 5.1.1 Redmi Note 3 Build/LMY47V 广东省深圳市 电信

      应该是百度分享问题

  9. 洋洋洋博客 1 来自天朝的朋友 QQ浏览器 Windows 7 山东省菏泽市曹县 电信

    顶下 真不错 有学会了一手

  10. 群贤书法 0 来自天朝的朋友 谷歌浏览器 Windows XP 湖北省武汉市 电信

    很厉害的样子

  11. 龙笑天 4 来自天朝的朋友 火狐浏览器 Windows 7 广东省深圳市 联通

    完全看不懂0.0 :shock:

  12. 张戈 [博主] 来自天朝的朋友 Safari浏览器  Android 5.1.1 Redmi Note 3 Build/LMY47V 广东省深圳市 电信

    脚本用的是sitemap.xml的磁盘物理路径,不是url地址。

    • CC 3 来自天朝的朋友 Internet Explorer Windows 10 浙江省金华市 电信

      那你的意思,我要先建一个定时任务,让他生成一个xml 在引用 这个地址了。

    • CC 3 来自天朝的朋友 谷歌浏览器 Windows 10 浙江省金华市 电信

      我按照你的第二页的方法,也实现不了,郁闷了!
      方便加一下QQ:75656768
      说一下吗?这里面回复了,我怎么看不到,是 不是 缓存了?

    • CC 3 来自天朝的朋友 谷歌浏览器 Windows 10 浙江省金华市 电信

      代码更新了哦。今天谢谢你了哈!搞了半天。。

  13. 丁春华 1 来自天朝的朋友 谷歌浏览器 Windows 10 四川省达州市 电信

    我又发现一个技术型人才,佩服。

  14. 纯洁博客 3 来自天朝的朋友 火狐浏览器 Windows 10 重庆市 电信

    可以可以,我也去试试看

  15. 动漫那些事 3 来自天朝的朋友 谷歌浏览器  MX4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.76 Mobile Safari/537.36 广东省广州市白云区 电信

    每次收到你回复的邮件,但是来你网站一看我的评论和你的回复都还没刷出来?为什么不迅速删除缓存换新的?

    • 动漫那些事 3 来自天朝的朋友 谷歌浏览器  MX4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.76 Mobile Safari/537.36 广东省广州市白云区 电信

      在留言板的时候,文章页又不会了。
      请问你使用fastcgi cache的代理还是本地模式

    • 张戈 [博主] 来自天朝的朋友 QQ浏览器 Windows 7 广东省广州市 电信

      理论上是立即清除的,右下角也有手动刷新按钮

  16. 连衣裙 1 来自天朝的朋友 谷歌浏览器 Windows 7 北京市 星光数据中心IDC机房

    本人不是搞技术的!但是很膜拜技术大神!!!来支持下!

  17. CC 3 来自天朝的朋友 谷歌浏览器 Windows 10 浙江省温州市 电信

    按你的第二页的方法,我自己试了下,但是 我用GG浏览器查看缓存的时候。显示没有缓存,但是我在root目录下,已生成html页面了,这个是什么问题, ?

    • 张戈 [博主] 来自天朝的朋友 QQ浏览器 Windows 7 广东省广州市 电信

      有个变量是网站根目录的,需要调整到自己网站的实际目录,否则就生成在脚本相同目录了

      • CC 3 来自天朝的朋友 谷歌浏览器 Windows 10 浙江省金华市 电信

        那个地址我修改了的。
        按第二种方法,是不是要修改Nginx 规则,还有在indxe.php 添加一段代码。才能正常的调用html页面。
        你的帖子,我看了好多次,一步一步的在操作,我准备把你的帖子,全部重写一次,让小白们 一看就明白的。
        现在就有很多问题要麻烦你了,好多问题要问你的。如果有时间就回复一下。谢谢!

  18. 百易吧 2 Philippines 谷歌浏览器 Windows 7 菲律宾

    我缓存了之后发现,点击下一页会出现 404?这个是什么原因?

    • 张戈 [博主] 来自天朝的朋友 Safari浏览器  Android 5.1.1 Redmi Note 3 Build/LMY47V 广东省广州市 电信

      确实会有这个问题,晚上我看看如何兼容。

    • 张戈 [博主] 来自天朝的朋友 QQ浏览器 Windows 7 广东省深圳市 电信

      如果加入了nginx规则应该不会404,有判断了。

      • 百易吧 2 Philippines 谷歌浏览器 Windows 7 菲律宾

        能否告知是哪个nginx呢?我尝试了一下,我使用的是第一种,也使用了!wp-super-cache作为缓存,是否多此一举?

        • 张戈 [博主] 来自天朝的朋友 QQ浏览器 Windows 7 广东省深圳市 电信

          有插件可以忽略本文。

          • 百易吧 2 Philippines 谷歌浏览器 Windows 7 菲律宾

            我把代码缓存版弄掉了,但是我发现速度还是上不来,使用了本文全站缓存。但是我不知道是否调用了啊。理论上我使用了CDN 不至于那么慢才对!

      • 百易吧 2 Philippines 谷歌浏览器 Windows 7 菲律宾

        终于找到了原因了,因为我在nginx里面有一句:

        • CC 3 来自天朝的朋友 谷歌浏览器 Windows 10 浙江省金华市 电信

          为什么 我缓存了,怎么没有调用HTML呢。郁闷。

          • 百易吧 2 Philippines 谷歌浏览器 Windows 7 菲律宾

            你是怎么查看有没有调用的呢?

  19. 七支剑 4 来自天朝的朋友 火狐浏览器 Windows 7 江苏省苏州市 联通

    又是一个好办法

  20. 回梦 2 来自天朝的朋友 搜狗浏览器 Windows 7 广东省广州市天河区 电信

    经测试。usleep 5000并不是0.5秒,usleep 500000才是0.5秒

    • 张戈 [博主] 来自天朝的朋友 Safari浏览器  Android 5.1.1 Redmi Note 3 Build/LMY47V 广东省广州市 电信

      确实,数学学的太差。

  21. 微商 3 来自天朝的朋友 火狐浏览器 Windows 10 天津市 联通

    速度很快啊

  22. 装满幸福的漂流瓶 3 来自天朝的朋友 谷歌浏览器 Windows 7 广东省广州市天河区 电信

    张哥,我网站的sitemap.xml是http://zhangge.net/4554.html这个,伪静态的,
    我把代码改为

    即增加了下下载sitemap.xml到本地,也是可以正常执行的,请问有没不良的影响?或者有没其他办法

    • 装满幸福的漂流瓶 3 来自天朝的朋友 谷歌浏览器 Windows 7 广东省广州市天河区 电信

      还有个问题就是我使用了verycloud的云分发,在后台看到hit命中率很低,(我理解的云分发是,当第一个用户访问了http://www.xxxx.com/1.html文件前,这时时没有缓存到verycloud中的,header的信息是MISS。再次访问1.html则是访问verycloud云分发的,header的信息是:HIT,不知道我理解是否有错。)我现在就是想用你的这个功能实现将整站访问一遍,但是经我测试,用你这个shell实现访问整站后,当我访问2.html,查看header状态还是MISS,再次访问才是HIT

      • 张戈 [博主] 来自天朝的朋友 Safari浏览器  Android 5.1.1 Redmi Note 3 Build/LMY47V 广东省深圳市 电信

        是不是弄了本地解析?绕过了CDN

        • 装满幸福的漂流瓶 3 来自天朝的朋友 谷歌浏览器 Windows 7 广东省广州市天河区 电信

          最开始我是没有弄本地解析的,隔了一两天,发现命中率还是一样
          后来才弄了本地解析加快速度

  23. 蚂蚁博客 0 来自天朝的朋友 谷歌浏览器 Windows XP 广东省珠海市 联通

    学习了,不过脚本对于我等小白还是太专业了~

  24. CC 3 来自天朝的朋友 谷歌浏览器 Windows 10 浙江省金华市 电信

    这个伪静态,生成了HTML页面后。
    还要不要去wp-config.php 去添加 ? 这个要添加吗?
    define(‘WP_CACHE’, true); //Added by WP-Cache Manager
    define(‘CACHE_ROOT’, dirname(__FILE__).’/data/wwwroot/ccmsn.com/html_cache/’.$_SERVER[‘HTTP_HOST’])

    我添加了之后,首页就空白了,执行脚本也是显示500. 没有生成HTML。
    这个是我的conf
    #请注意:下面这行代码的路径对应缓存代码中的CACHE_ROOT定义的路径:
    set $cache_file /data/wwwroot/ccmsn.com/html_cache/$1/index.html;

  25. 装满幸福的漂流瓶 3 来自天朝的朋友 谷歌浏览器 Windows 7 广东省广州市天河区 电信

    我的用是cdn
    用张哥的代码,发现部分解析到的cdn会连接超时,然后就卡在那里蛮久的,我改为以下代码可以吗?尝试连接2次,3秒后退出

    • 张戈 [博主] 来自天朝的朋友 Safari浏览器  Android 5.1.1 Redmi Note 3 Build/LMY47V 广东省广州市 电信

      用了cdn可以在/etc/hosts中本地解析网站到127.0.0.1 ,绕过cdn

  26. 五冶大学 3 来自天朝的朋友 QQ浏览器 Windows 7 四川省成都市 联通

    博客不错,常来逛。

  27. 唐情 0 来自天朝的朋友 谷歌浏览器 Windows 7 广东省深圳市 电信

    缓存后 提交评论提示405 错误

  28. seonoco 0 来自天朝的朋友 火狐浏览器 Fedora Linux 重庆市 电信

    get了一个简单好用的新方法!

  29. 禅猫 3 来自天朝的朋友 Safari浏览器 iPad OS 5_1 like Mac OS X) AppleWebKit 江苏省徐州市 联通

    曾经我也和你差不多喜欢没事找事的折腾 :sad:
    甚至把Wordpress用几台vps做负载均衡玩。。倒是忘了最初建博客是干嘛滴了 :arrow:

    • 张戈 [博主] 来自天朝的朋友 QQ浏览器 Mac OS X 10_11_3 广东省深圳市 电信

      在折腾中学习、进步

加载中,请稍候...