在Linux中,shell脚本结合系统任务计划crontab,非常简单就能实现一些复杂程序才能完成的工作,开发成本低,且简单易学。 张戈博客之前也分享过不少shell在网站运营方面的妙用,比如: CCKiller:Linux轻量级CC攻击防御工具,秒级检查、自动拉黑和释放 SEO技巧:Shell脚本自动提交网站404死链到搜索引擎 Linux/vps本地七天循环备份和七牛远程备份脚本 nginx日志切割及7天前的历史日志删除脚本 Shell+Curl网站健康状态检查脚本,抓出中国博客联盟失联站点 感兴趣的可以挑选看一看。 本文继续分享一个shell的实用案例:全站缓存和定时预缓存,进一步提供网站速度。 一、何为预缓存 用过WP-Super-cache插件的站长肯定都知道,这个插件有一个预缓存功能,开启此功能后,插件会对全站预先缓存一遍,并且后面还会定期更新缓存。 显而易见,全站预缓存的好处就是在用户访问之前,就已经生成了静态缓存,而不是被用户访问触发才生成缓存,那么所有用户来访问几乎都是静态缓存,不管是平均还是总体速度都会有质的提升!当然,最重要还是优化了蜘蛛抓取的速度! 大家去百度站长平台查看那个抓取频次的时候,可以看到蜘蛛的平均耗时数据,我博客做了静态缓存,按理说每个抓取都不会超过500ms,但是依然会出现一些十几二十秒的请求: 排除蜘蛛抓取的时候存在网络延时或并发负载等情况,还有一个很可能的原因就是蜘蛛正好抓取了一个缓存过期或缓存不存在的页面,也就是说蜘蛛抓取的时候,这个页面缓存正好过期被删除了,那么它抓取的时候就是动态页面,所以耗时就上去了! 因此,全站预缓存还是有必要的。 二、预缓存前身 见识到预缓存的重要性,那么就该想办法实现了。分享方法之前,先说一下灵感来源吧! 记得博客之前分享过各种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 如图,如果没有报错(图中的骇人速度无需在意,和磁盘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 zhang.ge 最后,保存即可。 ②、生成间隔 文章中分享的计划任务都是1天一次,如果你觉得有必要缩短间隔,可以自行修改crontab语句,具体可以搜索下crontab配置,了解crontab中 分 时 日 月 周得定义,此处不再赘述。 ③、缓存删除 本文只分享了如何生成缓存,并没有说如何自动删除缓存。整体上来说,反正crontab会定期重新生成缓存的,原则上并不用去理会自动刷新缓存。 但是,往往一些强迫症看到评论不刷新,文章修改了也不刷新,就抓耳挠腮,好不舒服。所以这里还是指明一条出路。。。 对于已有缓存功能的网站,使用这个预缓存脚本,实际上不会有任何影响,之前有自动刷新缓存的话,现在依然会刷新,无需操作。 对于使用最后一个脚本的网站,也就实现了和之前分享的php生成html缓存同样的功能,如果想更新文章或提交评论的时候删除这个缓存,可以参考博客之前的文章,修改下缓存路径即可搞定: WP Super Cache静态缓存插件纯代码版(兼容多域名网站) 哦了,分享到此,有事留字。。。 最新补充:偷懒用sitemap.xml的方法感觉有点Low,所以还是提供一下没有sitemap.xml的方案吧!为了不和上面的内容混淆,还是另起一页,有需求的可以看看,没需求的请忽略。
