Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >shell脚本实现整站缓存和预缓存,进一步提升网站整体加载速度

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

作者头像
张戈
发布于 2018-03-21 07:00:34
发布于 2018-03-21 07:00:34
1.9K00
代码可运行
举报
文章被收录于专栏:张戈的专栏张戈的专栏
运行总次数:0
代码可运行

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 存放到网站根目录就可以了!比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#每天在网站根目录生成一个sitemap.xml diypath为sitemap.php的实际位置
0 1 * * * wget -O /home/wwwroot/zhangge.net/sitemap.xml http://zhangge.net/diypath/sitemap.php  >/dev/null 2>&1

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

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

三、全站预缓存

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

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

①、已有缓存功能的博客

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!bin/bash
#我博客使用的是数据别名,所以是select post_name,如果是固定链接是ID,那么就是select IDfor post in $(mysql -uroot -p数据库密码 -e "use 数据库名称;select post_name from wp_posts where post_type='post' and post_status='publish';"|sed -n '2,$p')
do
        #使用wget请求页面,并将数据丢到“黑洞文件”,也就是不保存,只是触发博客的缓存功能
        wget -O /dev/null  "http://zhangge.net/${post}.html"
        sleep 0.5 #暂停0.5s,避免带来高负载
done

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#/bin/bash
#进入到网站根目录,请按实际填写
cd /home/wwwroot/zhangge.net/

#从sitemap.xml中取出所有页面地址, 每隔0.5秒请求一次,触发缓存。
for url in $(awk -F"<loc>|</loc>" '{print $2}' sitemap.xml)
do
        wget -O /dev/null  $url
        sleep 0.5
done

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

bash /root/g_cache.sh

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#每天凌晨3点全站预缓存一遍 0 3 * * * bash /root/g_cache.sh  >/dev/null 2>&1

duang 的一下,就搞定了!

②、没有缓存的博客

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

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

安装缓存插件或开启其他缓存后,再用方法①实现 我就不开启缓存,但是我还是要用全站预缓存,你说怎么办吧!

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/bash
#网站根目录,请按实际填写
base_dir=/data/wwwroot/zhangge.net

#不缓存名单,填写不需要缓存的页面地址关键词,以分割号隔开
white_list="go.html|goto.html"

#定义缓存文件夹名称
cache_store=html_cache

#从sitemap.xml中取出所有页面地址
for url in $(awk -F"<loc>|</loc>" '{print $2}' $base_dir/sitemap.xml | sed '/^$/d' | egrep -v $white_list)
do
    #取出页面地址的request路径,比如cat/1.html
    cache_dir=${url#http*://*/}

    #判断首页并删除旧缓存文件
    echo $cache_dir | grep "http*://" >/dev/null
    if [[ 0 -eq $? ]];then
        cache_dir=$cache_store

        # 如果不带参数执行脚本,则跳过已有缓存,即若带任意参数则重建所有缓存
        if [[ -z $1 ]];then
            test -f $cache_store/index.html && continue
        fi
    else
        cache_dir=$cache_store/$cache_dir
        if [[ -z $1 ]];then
            test -f $cache_store/index.html && continue
        fi
    fi

    #创建缓存目录
    mkdir -p $cache_dir

    #将页面内容保存到对应缓存目录下的index.html文件,类似于wp-super-cache
    wget -O $cache_dir/index.html $url 
    
    sleep 0.5
done

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
location / {
    try_files $uri $uri/ /index.php?$args; #WordPress 默认伪静态规则,我在下面新增如下规则即可
        if (-f $request_filename) {
               break;
           }
           set $cache_file '';
           set $cache_uri $request_uri;
           if ($cache_uri ~ ^(.+)$) {
               #请注意:下面这行代码的路径对应缓存代码中的CACHE_ROOT定义的路径:
               set $cache_file /html_cache/$1/index.html;
           }
           # 只有当缓存文件存在时,才进行 rewrite
           if (-f $document_root$cache_file) {
               #rewrite ^(.*)$ $cache_file break;
               rewrite ^ $cache_file last;
           }
           # 所有其他请求,转给 wordpress 处理
           if (!-e $request_filename) {
               rewrite . /index.php last;
           }

    }

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 每周一凌晨3点点全站刷新预缓存(如脚本注释,带上任意参数则重建全站缓存)
0 3 * * * bash /root/g_cache.sh all >/dev/null 2>&1

# 每小时检查缓存,如果存在没有缓存的文章,则生成(针对新文章发布)
0 */1 * * * bash /root/g_cache.sh >/dev/null 2>&1

如此就实现了 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 的方案吧!为了不和上面的内容混淆,还是另起一页,有需求的可以看看,没需求的请忽略。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年04月16日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
WordPress免插件生成完整站点地图(sitemap.xml)的php代码
前言:站点地图(sitemap.xml)的作用,相信站长们都有所了解,我就不献宝了。而免插件生成 sitemap.xml,网络上也早就有了纯代码生成的方法。 一直以来,张戈博客都是用 DX-SEO 这个很好用的中文 SEO 插件生成的 sitemap。今天整理电脑文件时,看到了以前收藏的生成 sitemap.xml 的 php 脚本,就随手打开看了看,发现这个代码只能生成主页和文章页的 sitemap。果断百度了一下,发现网上分享的都大同小异,只有首页和文章页。感觉有点缺憾,反正今天也是闲着,就动手改造了一
张戈
2018/03/23
1.8K0
WordPress 免插件生成最安全的纯静态站点地图(sitemap.xml)
之前酷猫一直使用的是插件生成站点地图的方法,但是用来用去还是各种的不舒服,想了想还是免插件生成最好了,安全还高效!
叮当叮
2020/04/20
1.2K0
WordPress 免插件生成最安全的纯静态站点地图(sitemap.xml)
WP Super Cache静态缓存插件纯代码版(兼容多域名网站)
中午,小熊发来一篇来自歧路亡羊博客的精彩教程:《wordpress 利用代码来实现缓存》。粗略看了一下,发现这个代码在几个月之前我就用过,不过由于此代码无法区分多个域名,从而会导致移动站无法跳转的情况。 我利用午休的时间,仔细看了下这篇文章,发现博主在原代码的基础上,还加上了自动刷新缓存的机制,不过貌似是和 WP Super Cache 插件一样,只要更新文章,就会清除所有缓存,感觉不太适合我。 不过,这篇文章还是激发了我兴趣。折腾了几个月,我现在也能基本看得懂 PHP 了,所以决定把这个代码修改一下,让它
张戈
2018/03/23
2.2K0
WP Super Cache静态缓存插件纯代码版(兼容多域名网站)
启用WP Super Cache纯代码版本之后的一些优化措施
张戈博客在上个月 28 号启用了 WP Super Cache 代码版,几天下来,虽然小问题不断,但是总体感觉非常不错!不管是前台还是后台,速度都有质的提升,着实值得会折腾的人使用。 感兴趣的可以先看下 28 号的具体教程:《WP Super Cache 静态缓存插件纯代码版(兼容多域名网站)》. 下面,简单的说一下启用此功能后遇到的一些问题的解决办法或细项优化。 ①、发表评论时并未删除缓存,导致无法显示最新评论; ②、若主题有登陆状态显示,那缓存之后,无论谁打开都显示已登录; ③、WordPress
张戈
2018/03/23
1.3K0
启用WP Super Cache纯代码版本之后的一些优化措施
SEO技巧:Shell脚本自动提交网站404死链到搜索引擎
最近在折腾博客主题,通常来说大多数人认为换主题会影响 SEO,实际上只要你把工作都做到位了,是没有任何问题的。比如,换主题后你得仔细检查标题和描述等内容是否发生改变、换主题后是否带来了大量的 404
张戈
2018/03/23
1.3K0
SEO技巧:Shell脚本自动提交网站404死链到搜索引擎
利用Meta申明来做百度、谷歌、雅虎、微软等搜索的开放适配
前段时间分享过利用 Meta 申明来做百度开放适配,前几天在解决 sitemap 报错问题时,看到了谷歌、雅虎及微软等搜索引擎开放适配方法,感觉有点意思,就折腾了下代码,现在来分享下。虽然她被墙了,但是我们应该怀着一颗乐观向上的心,随时迎接谷姐归来。。。 一、谷歌开放适配规则 对应 URL 举例: pc:http://zhangge.net/ 移动:http://m.zhangge.net meta 申明方法: a)pc 页面添加 meta: <link href=http://m.zhangge.net"
张戈
2018/03/26
1.3K0
利用Meta申明来做百度、谷歌、雅虎、微软等搜索的开放适配
移动SEO分享:php自动提交复合型Sitemap到百度搜索
导读:本文分享的是移动 sitemap 协议说明及生成复合型 sitemap 的方法。所谓复合型就是指一个 sitemap.xml 既包含了 pc 页,也包含了 mobile 页!一旦提交,双管齐下,同时搞定了结构化数据和移动开放适配!而且此方法适用于任何 wordpress 建站的网站,包括响应式亦可提交带响应式标识的 sitemap!所以,网站是响应式的童鞋也就别在那“得瑟”你的响应式多么多么的高大上了!当然,如果你不在乎 SEO 那也可以不用浪费时间了。 ---- 不久前,张戈博客曾分享了《移动搜索
张戈
2018/03/23
1.3K0
移动搜索SEO分享:PHP自动生成百度开放适配及360移动适配专用的Sitemap文件
导读 随着智能手机的高速普及,人们将更多时间放到了手机上,麻利的做着以前只能在电脑上才能完成的购物、聊天、信息获取等事情。如此一来,站长们对移动端的 SEO 也就越来越关注。当然,也各大搜索引擎也开始发力移动搜索,比如百度近期推出的2014 网站移动化大赛和开放适配、360 推出的移动适配等。而张戈对于移动适配也是关注已久,写过不少相关文章,现在就来分享一个通过 php 自动生成百度开放适配和 360 移动适配的专用 sitemap 文件的方法。 先再次回顾下,张戈关于百度开放适配和 360 移动适配的历次
张戈
2018/03/26
1.5K0
移动搜索SEO分享:PHP自动生成百度开放适配及360移动适配专用的Sitemap文件
清点下博客的插件以及我对WordPress插件的看法
最近,群里又讨论到了关于插件数量的问题,张戈博客的插件不多不少,正好 9 个。个人认为这些插件是目前博客所必需的,或者功能性价比很高的,下面就来晒一晒: 一、SEO 相关 ①、DX-SEO(已用代码替
张戈
2018/03/23
9610
wordpress纯代码生成sitemap.xml网站地图
wordpress默认不带xml网站地图,钻芒博客之前一直使用的是Google xml插件,今天帖一下纯代码生成xml网站地图,能少用一款插件就少用一款插件。
AlexTao
2019/07/22
1.9K0
wordpress纯代码生成sitemap.xml网站地图
为网站开启Nginx缓存加速,支持html伪静态页面
上一篇文章分享了如何开启 Nginx 的缩略图功能,也提到了 Nginx 缩略图在完美替代七牛缩略图或 PHP 缩略图的同时,还会带来一定的 CPU 负载消耗。 因此,本文就来分享一下如何解决这个实时生成缩略图带来的 CPU 开销问题。 思路很简单,既然你要实时生成,那我就将你生成的缩略图缓存一份好了!在我测试期间发现,Nginx 的缓存也同样可以缓存伪静态的 html 页面,完全可以替代 WP-Super-Cache 这类缓存插件了。相信大部分 CDN 也是用的这个原理,比如百度云加速,我们可以在 hea
张戈
2018/03/23
4.2K0
为网站开启Nginx缓存加速,支持html伪静态页面
PHP制作百度站内搜索绿色通道的网页列表数据文件
用过百度站内搜索的朋友,都知道前不久推出了一个绿色收录通道,改善站内搜索的时效性和覆盖率,说明如下: 站内搜索结果数太少?最新的页面搜不到?您可以在本页面提交数据,提升您的站内搜索收录时效性和覆盖率。 方法 1:提交一个种子页面 URL,如网站首页,搜索引擎将从这个页面进行扩散,抓取站点的其他页面。 方法 2:提交网站列表(即 sitemap),列举您站点需要抓取的所有网页,该方法收录效果更好。 注:在此提交的数据将用于改善您的站内搜索质量,同时有机会被百度网页搜索收录,但并没有收录上的优待。 虽然,
张戈
2018/03/23
1.4K0
Nginx开启fastcgi_cache缓存加速,支持html伪静态页面
张戈博客不久前分享过 Nginx 开启缓存为 WordPress 加速的教程,其中分享了 2 种缓存模式:代理模式和本地模式。我一直以为单个 ngx_cache_purge 缓存模块只支持 proxy
张戈
2018/03/23
3.6K0
Nginx开启fastcgi_cache缓存加速,支持html伪静态页面
发现插件生成的robots.txt不能被谷歌和360识别
上次通过《正确的 Win 主机网站伪静态设置方法》重新设置了玛思阁的伪静态,当时由于使用 Rewrite robots 没有效果,就安装了一个生成 robots.txt 的插件,然后发现访问 robots 地址也有了指定的内容。几天却发现 360 全部被 K,仅剩首页,而谷歌也不再收录新页面,一直以为是我的 robots 内容有误,于是搜来搜去,改了无数次 robots 内容。谷歌在【已拦截的网址】选项中总是显示【语法有误】,在 sitemap 提交界面也用英文提示“所有内容被 robots 拦截...”云
张戈
2018/03/26
9810
发现插件生成的robots.txt不能被谷歌和360识别
php平滑重启nginx,彻底清除WordPress的静态缓存
每一次分享技术文章,都是基于自己的痛点,基于自己的需求。这次也一样,所以分享具体方法之前,我先说一下我这次的需求与痛点: 一、需求痛点 在博客集成了代码版缓存功能之后,为了方便在前台清理页面缓存,我特意写了ajax 清理缓存的功能(相关文章)。这个功能写好之后确实可以正常工作。 但是,为了让网站加载速度提升到极致,我还在 nginx 里面加了类似于 WP Super Cache 的 mod_rewrite 机制:当存在页面缓存时,会绕过 PHP 解析,而直接调取缓存在前台展示。 这样就发现了一个问题:当我在
张戈
2018/03/23
1.8K0
Nginx-helper纯代码版,文章评论发布自动清理Fastcgi缓存
摘 要 张戈博客之前分享过Nginx开启fastcgi静态缓存加速的教程,文中也提到了WordPress对应的最佳配套插件:Nginx-Helper。本文分享一个博客自用、原创的Nginx-Helper纯代码版本,帮你的网站再消灭一个插件。 Nginx-Helper 这款插件主要用于 Nginx 的 Fastcgi 缓存或 Redis 缓存清理,用起来确实不错,堪称绝配!感兴趣可以翻看博客之前的分享: Nginx 开启 fastcgi_cache 缓存加速,支持 html 伪静态页面 解决 Nginx
张戈
2018/03/21
1.2K0
Nginx-helper纯代码版,文章评论发布自动清理Fastcgi缓存
解决启用wp super cache缓存后,页面追加多个斜杠仍然可以访问的隐患
昨天一哥们在博客留言告知,启用缓存后,html 文章页面带上斜杠也还可以访问,试了下还真是这样。 其实,想想也是,wp-super-cache 生成的文章缓存本身是以【%post_id%.html/i
张戈
2018/03/23
1K0
WordPress的Robots协议怎么写?附最新Robots.txt文件下载
最近我发现搜索引擎收录了很多“夏末浅笑博客”的重复页面,当然了这跟我前一段时间,将站点根目录下的Robots.txt文件删除掉有直接的关系,Robots.txt文件是一个用来告诉搜索引擎执行Robots协议的文件,我们将Robots协议写在Robots.txt文件里面,告诉搜索引擎我的网站哪些页面可以收录,哪些页面不可以收录。
夏末浅笑
2020/05/16
2.6K0
解决Nginx Helper插件一键清理缓存功能导致网站打不开问题
5 月份,张戈博客分享了一篇《Nginx 开启 fastcgi_cache 缓存加速,支持 html 伪静态页面》的文章。文中也提到了 WordPress 有一款名为 Nginx Helper 的插件
张戈
2018/03/21
2K0
解决Nginx Helper插件一键清理缓存功能导致网站打不开问题
WordPress WP-Super-Cache 缓存插件 Nginx 规则
WP-Super-Cache 作为 WordPress 的老牌静态缓存插件,它在 WordPress.Org 的一个角落一直有一份 Nginx 伪静态规则(Nginx – WordPress.org Forums)。
Breeze.
2023/02/16
8930
推荐阅读
相关推荐
WordPress免插件生成完整站点地图(sitemap.xml)的php代码
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验