网站建设

分享张戈博客的WordPress优化方案,缓解国内云服务器配置低下的问题

Jager · 6月12日 · 2015年 · · 7540次已读

有很多朋友留言问张戈博客的服务器配置如何,为什么能这么快?当知道张戈博客用的是阿里云最低档的 ECS 的时候,都觉得不可思议,因为他们用的更好的配置却没有达到张戈博客一半的速度。所以,我觉得自己有必要分享一些低配服务器下的 WordPress 优化方案,让更多人少花冤枉钱。

分享张戈博客的WordPress优化方案,缓解国内云服务器配置低下的问题

一、先晒配置

分享之前先贴一下张戈博客和中国博客联盟 2 个网站共用的服务器的配置以及负载情况。

①、基本配置

从下图可以看出,张戈所用 ECS 是阿里云最低的档次,而且是最便宜的青岛区域,多加了一块云磁盘用于数据容灾,整体资费为 52¥/月:

分享张戈博客的WordPress优化方案,缓解国内云服务器配置低下的问题

②、负载情况

很多朋友抱怨 WordPress 非常耗配置,经常 CPU 飚的很高!不得不承认,不做任何缓存的情况下,WordPress 多并发几个请求,负载就上去了!下面是张戈博客和中国博客联盟一天的 CPU 和网络负载:

分享张戈博客的WordPress优化方案,缓解国内云服务器配置低下的问题 分享张戈博客的WordPress优化方案,缓解国内云服务器配置低下的问题

很明显,不管是 CPU 还是网络负载,都非常低!我想说,这种情况下我在跑几个网站也没有什么问题。

二、优化方案

①、有无必要

上文也提到了,再不开缓存的情况下,WordPress 多并发几个请求就要卡出翔,确实这玩意非常臃肿!当然,很多建站前辈都会温馨提示,访问量不大不建议开启缓存啥的,否则各种蛋疼问题。确实也是这样,如果你不清楚缓存原理,网站访问量也很低,那么确实不推荐。

但是,如果你了解并能够轻松驾驭所用缓存,那么推荐你把缓存用好,用到极致!不要去信什么访问量不高就不用开缓存的建议,良好的网页加载速度,也是带来流量的基本因素!至少,我在百度搜索教程,如果那个网页好几秒还没出现第一屏,我就回头点开其他搜索结果了!

②、缓存方案

说了那么多,那么我简单总结一下 WordPress 的缓存优化方案,目前主流方案,大致有如下 2 类:

  • 数据缓存:只缓存一些动态查询,第二次查询将有几率命中缓存,无需再次计算;
  • 静态缓存:将页面直接缓存,并保存为文件存放,第二次访问直接调用。

数据缓存:根据缓存程度,我个人理解为轻度缓存,适用于流量中低等的网站。主要是缓存 php 的动态查询,减少直接访问数据库和 PHP 实时计算的次数,从而加快页面数据的生成。

数据缓存方案,张戈接触并用过的大概有如下几个做法:

1). 安装插件:比如 DB Cache Reloaded、Hyper Cache、WP Super Cache 等

2). 缓存组件:Redis、memcache、oqcache 等

Ps:当然,Hyper cache 和 wp super cache 也可以实现静态缓存。

静态缓存:这种做法是直接生成静态文件,甚至直接通过 WEB 服务器调用,而不再通过 PHP 计算。这样页面就是真正的纯静态,加载速度不言而喻!

静态缓存方案,依然有多种方法实现:

1). 插件缓存:WP Super Cache、cos-html-cache、Hyper Cache 等

2). 代码缓存:直接通过 PHP 代码,将数据流保存为 html 文件

3). WEB 缓存:直接通过 Nginx 或 Squid 来缓存数据

插件缓存,就不多说了,圈子里用的最多的方案,推荐入门级玩家使用。当然,张戈博客也分享过不少相关文章,感兴趣的童鞋可以凑合看看:

代码缓存,这个方案张戈博客就分享过不少相关改进文章,这里就不赘述了:

WEB 缓存,我主要接触过 Nginx 和 Squid,目前在用的是 Nginx 缓存,效果非常不错!推荐有个人云主机的朋友使用:

Nginx 开启 fastcgi_cache 缓存加速,支持 html 伪静态页面

③、带宽尴尬

众所周知,国内服务器和国外服务器有个很鲜明的区别:国内的服务器出口带宽都是小水管,而且升级还特贵,不像国外动不动就是 G 管!唉,升级带宽性价比低下,那么该如何解决?

比如,张戈博客所用服务器只有 1M 带宽,从外部全速下载服务器上的一个文件,速度峰值也就 120kb/s 左右(某博客写文章说 1MB 带宽服务器对外下载速度可以达到 1M/s,我也是醉了)!而通过 CNZZ 不权威统计,张戈博客经常达到 30 人同时在线,如果不做优化,根本无法应付十多人同时访问!

该如何解决这个尴尬问题呢?张戈分享 2 个方案:

1). 动静分离、静态资源托管 CDN

所谓动静分离的做法就是,将网站的静态资源,比如图片、JS、CSS 等文件托管到 CDN,采用二级域名或第三方域名的方式来加载。这样的好处就是,打开网页时,只有 HTML 代码是从我们服务器上下载的,而相比 html 体积更大的静态文件都是从 CDN 请求出去的,那么我们的服务器也就只要承受很小一部分带宽占用了。

目前国内免费的 CDN 主要有七牛云和又拍云,对于中低等流量的网站已基本够用。但是,对于每日流量过万,然后文章存在不少图片的网站来说,免费额度肯定不够用!

2). 使用国内免费的 CDN 缓存服务

目前国内用的比较多的是百度云加速、360 网站卫士、加速乐和安全宝等。前 2 个我都用过,都很不错!使用此类 CDN,要注意以下 2 个问题:

动态网页会越用越慢

很纳闷吧?但事实的确是这样!我们先要弄清楚这些 CDN 加速的原理:当用户请求我们网页时,请求会发到 CDN 节点上,如果是动态数据,那么 CDN 节点将回源站拉数据,返回给用户!也就是说数据是经过了多次转发,加上 CDN 节点和源站的延迟,肯定是效果不明显,而且更慢!

这就不难解释,总是有人抱怨百度云加速越用越慢,而有人却说很快了。区别就是,快的人开启了云加速的整站缓存,而慢的人只是弄了一个 CDN 代理转发而已。

所以,如果使用此类 CDN 加速,那么建议先开启网站静态化缓存,然后到 CDN 那开启缓存即可!

CDN 缓存有没有生效,可以查看如下报表:

分享张戈博客的WordPress优化方案,缓解国内云服务器配置低下的问题

很明显,大部分是加速请求,访问流量只有少部分到了源站,所以我 1M 带宽算是给自己和搜索引擎用了,绰绰有余。顺便贴一下百度云加速文章页面的缓存设置:分享张戈博客的WordPress优化方案,缓解国内云服务器配置低下的问题

遗憾的是,百度云加速只能设置 3 条规则,自己参考设置吧。

额外解析搜索引擎线路

很多朋友质疑,用这些 CDN 会不会影响 SEO?因为 CDN 节点 IP 经常变动!其实这个
问题很好解决,额外解析一条搜索引擎线路即可!完全没必要被这个问题所困扰。

分享张戈博客的WordPress优化方案,缓解国内云服务器配置低下的问题

张戈博客选择百度云加速的原因也就是这个,我主要在意百度的 SEO,所以我用百度云加速,理由就是百度云加速有搜索引擎线路,而且是自家的产品,肯定是准确无误的。

④、更多优化

都已经纯静态化了,其实能继续优化的项目已经少之又少了。但是作为强迫症,还是有下手的地方的,那我简单的分享几个吧!

Cookies 优化

这也是百度站长平台页面优化时提示的项目:cookie 越小越好,而且对于静态文件需要避免设置 cookie。很多人纳闷百度的这个提示是什么意思?

其实简单的理解就是:网页中的 cookies 也是一种数据,也需要和服务器建立通信,占用流量带宽,cookies 虽然很小(几十字节到几 KB),但是如果一个页面有很多 cookies,总量就很可能达到几十 k!一个页面才几十上百 k 数据,你 cookies 就有几十 k,这是很恐怖的事情!极大的拖慢了整体加载速度!

而实际上,很多 cookies 是没必要的,尤其是网页中的静态文件!如果像张戈博客这样使用顶级域名,WordPress 默认会给所有文件带上 cookies,也就是将 cookies 写到了 .zhang.ge 这种通配域名上了,导致域名污染:当浏览器向服务器请求一个静态资源时,会先发送同域名下的 cookie,服务器对于这些 cookie 不会做任何处理。因此它们只是在毫无意义的消耗带宽。所以你应该确保对于静态内容的请求是无 coockie 的请求。

所以,对于静态资源,我们要用单独的域名,以减少无用请求,提高网页性能。下面说一下具体做法:

2016 年 12 月 11 日更新:当网站首选域名是顶级域名的时候,主站的 cookies 将写到所有的二级域名。比如张戈博客这样不带 www 的域名,则需要使用其他域名托管静态文件,比如张戈博客现在使用的是 res.zgboke.com,否则同一个域名下的二级、多级域名都会带上主站的 cookies,比如之前用的 res.zgboke.com!

因此,需要分带 www 和不带 www 的 2 种情况。

①、网站不带 www 的形式

在 wp-config.php 中加入如下代码:

//指定 cookies 的域名为网站主域名
define('COOKIE_DOMAIN', 'zhang.ge');

准备一个不同于主站的静态域名,可以用七牛的 CDN 域名,也可以自己新建一个域名,比如张戈博客使用的是 res. zgboke.com,总之不能和主站共一个顶级域名.

最后在主题 functions.php 里面添加如下代码,将静态资源全部更换成这个域名:

/**
* CDN/静态域名替换函数(可用于七牛等 CDN)
* 相关文章:https://zhang.ge/5047.html
**/
ob_start("Static_Switch");
function Static_Switch($buffer){
     $buffer_out = preg_replace('/http:\/\/zhangge\.net\/wp-([^"\']*?)\.(jpg|png|gif|css|js|woff|woff2|ttf|svg|eot)/i','http://res.zgboke.com/wp-$1.$2',$buffer);
     return $buffer_out;
}

②、网站带 www 的形式

这种情况下就简单多了,在 wp-config.php 中加入如下代码:

//指定 cookies 的域名为网站主域名
define('COOKIE_DOMAIN', 'www.zhang.ge');

然后参考上述 CDN 更换函数的代码,将静态文件更换成其他二级域名即可。

Ps:怎么添加二级域名,这里就不赘述了,请自行研究。实在不会可以使用七牛的 CDN 域名。

精简插件

这个问题不用多说,用 WordPress 的都知道,插件多了就会拖慢速度!但是,张戈并不是要大家把插件都给删了,而是能省则省!明明可以用简单代码实现的功能,你硬是要用插件来解决就不好了。

比如,WordPress 网站的 sitemap.xml,明明分享了WordPress 免插件生成完整站点地图(sitemap.xml)的 php 代码,完全就没必要装插件版。

又比如,禁止谷歌字体,明明还有非常简单的代码,偏偏有人就是喜欢用插件。。。

说了这么多,就是要告诉各位,你网站装的每一个插件,你是否去搜索过,是否有纯代码版本?是否有更好的替代方案?

好了,啰嗦了大半天了,最后再次总结一下张戈博客目前在用的主要优化方案:

  • 整站前台开启 Nginx 的 fastcgi 静态缓存(相关文章
  • 使用百度云加速,并开启节点缓存
  • 动静分离,并去掉静态文件的 cookies
  • 利用 Nginx 将 avatar 头像缓存到本地(后续分享)
  • 集成 QPCACHE,缓存某些不能静态缓存的数据
  • 前台页面代码压缩优化(相关文章

当然,我们还可以做更细的优化,比如合并 CSS、JS 等,就不赘述了,希望本文对你有所帮助!

92 条回应
  1. wuyifan 2016-12-30 · 17:19

    我想说,为什么都是linux系统,可是我是win sever2012 ,有没有啥办法,我不会玩linux。

    • 缙哥哥 2018-3-1 · 20:43

      两年前我也是这么说的!

  2. 知宝堂|观常态 2017-1-12 · 15:04

    学习了,收益匪浅。谢谢张老师

  3. 知宝堂|观常态 2017-1-12 · 15:04

    签到成功!签到时间:下午2:57:23,每日签到,生活更精彩哦~

  4. 禅猫 2017-1-16 · 14:44

    还有dns预拉取DNS Prefetching优化,ssl证书优化

  5. 拂晓 2017-1-21 · 16:51

    嗯,写的挺好,一般来讲,这样的文章够新手看了

  6. Mr柒 2017-3-4 · 14:46

    张老师,我有个企业站经常内存消耗达80%以上,导致网站经常卡死,提示数据库连接错误,怎样才能解决这个问题?用的是阿里云ecs一核1GB内存,Linux系统。 :?:

    • avatar
      Jager 2017-3-4 · 18:59

      企业站一般访问量不会太大,考虑是不是被人攻击。

  7. 简单生活 2017-3-5 · 15:24

    //指定cookies的域名为网站主域名
    define('COOKIE_DOMAIN', 'www.aabb.net');
    这种带www就不需要启用其他顶级域名的二级了是吧,用 image.aabb.net就可以了吧? 张哥

    • avatar
      Jager 2017-3-5 · 15:41

      是的

  8. 堆爱博客 2017-4-18 · 21:32

    网站不带www 安装了七牛插件把cdn域名换成别的顶级域名还需要在functions.php文件添加那段替换代码吗

  9. 悟空 2017-4-25 · 18:04

    如果用的是鸟哥的BEGIN的话,那这个用来访问静态资源的域名是不是也要跟主题绑定?

  10. 悟空 2017-5-3 · 10:11

    看了一篇关于cookie-free domain的说明,上面说道Cookie 有两个重要的属性:domain 和 path。当浏览器访问一个网站时,只有 domain 和 path 都满足条件时,才会发送相应的 Cookie 到这个网站的服务器。那么在wp-config.php中加入指定cookies的域名为网站主域名那一行代码后,其实应该就能达到目的了。

    • avatar
      Jager 2017-5-3 · 20:25

      如果首选域名和我博客一样是 zhang.ge,如果指定cookie path为 zhang.ge ,其他所有二级域名将全部带上cookies,你可以试试。也就是说网站使用顶级域名的时候,这个优化无效。

      • 悟空 2017-5-4 · 7:43

        嗯,貌似确实是这样子!
        然后你的中国博客联盟zgboke.com使用的也是祼域,博客站静态文件请求是用res.zgboke.com,这样子的话请求res.zgboke.com下的静态资源时不会带上zgboke.com传递过来的cookie吗?

        • avatar
          Jager 2017-5-5 · 10:33

          zgboke.com 那个站没有用到res.zgboke.com

  11. yszar 2017-6-29 · 12:52
    /**
    * CDN/静态域名替换函数(可用于七牛等CDN)
    * 相关文章:https://zhang.ge/5047.html
    **/
    ob_start("Static_Switch");
    function Static_Switch($buffer){
         $buffer_out = preg_replace('/https:\/\/www\.xxxx\.com\/wp-([^"\']*?)\.(jpg|png|gif|css|js|woff|woff2|ttf|svg|eot)/i','https://image.xxxx.com/wp-$1.$2',$buffer);
         return $buffer_out;
    }

    博主,请问,用了以上这段代码,文章缩略图全部不显示了,url全变成以下形式了

    
    

    同是begin主题,cdn域名是image.xxxx.com,主域名是www的,怎样变成你博客缩略图的这种url

    • yszar 2017-6-29 · 12:54

      好神奇,代码发不出来,剪裁缩略图的timhtumb.php的url也会变成image的,本来应该是www的

      • avatar
        Jager 2017-6-30 · 11:48

        随手写的,把包含timhtumb.php关键词的URL再替换回来即可,留言不留网址,谁知道你网站什么情况。

        /**
        * CDN/静态域名替换函数(可用于七牛等CDN)
        * 相关文章:https://zhang.ge/5047.html
        **/
        ob_start("Static_Switch");
        function Static_Switch($buffer){
             $buffer_out = preg_replace('/https:\/\/www\.xxxx\.com\/wp-([^"\']*?)\.(jpg|png|gif|css|js|woff|woff2|ttf|svg|eot)/i','https://image.xxxx.com/wp-$1.$2',$buffer);
            $buffer_out = preg_replace('/https:\/\/image\.xxxx\.com\/([^"\']*?)/timhtumb\.php([^"\']*?)\.(jpg|png|gif|css|js|woff|woff2|ttf|svg|eot)/i','https://www.xxxx.com/wp-$1.$2',$buffer);
             return $buffer_out;
        }
  12. yszar 2017-6-29 · 13:08
    
    

    这样

  13. 在线看小说 2017-8-8 · 12:37

    最近网站速度越来越不行,逼得我做静态

  14. 筑楼 2017-9-5 · 17:09

    我的天哪! 没想到1M 带宽都可以跑起来你的网站,太厉害了!看来以后还是在于优化,用有限的资源优化无限的可能啊!

  15. 米粒博客 2018-4-2 · 9:01

    开了又拍云,不知道怎么写后台跟评论的不缓存规则,搞得后台都进不去了,评论也不显示了,唉

  16. 导航狗 2018-5-8 · 13:29

    原来不做静态化就用CDN不会加快网站速度啊 :mrgreen:

  17. 双双对对爸爸 2018-5-10 · 15:27

    评论者旁边出现 博主 两字 是怎么实现的啊?

  18. 寻梦 2019-3-5 · 14:36

    Jetpack+jsdelivr把整站的静态资源几乎都做了CDN处理了 :mrgreen:

  19. 2019-8-30 · 16:23

    Batcache+MemcacheD,Nginx fastcgi_cache,wp super cache,这些缓存方案可以同时用么,还是只能用其中一种,哪种好呢?