有很多朋友留言问张戈博客的服务器配置如何,为什么能这么快?当知道张戈博客用的是阿里云最低档的 ECS 的时候,都觉得不可思议,因为他们用的更好的配置却没有达到张戈博客一半的速度。所以,我觉得自己有必要分享一些低配服务器下的 WordPress 优化方案,让更多人少花冤枉钱。
一、先晒配置
分享之前先贴一下张戈博客和中国博客联盟 2 个网站共用的服务器的配置以及负载情况。
①、基本配置
从下图可以看出,张戈所用 ECS 是阿里云最低的档次,而且是最便宜的青岛区域,多加了一块云磁盘用于数据容灾,整体资费为 52¥/月:
②、负载情况
很多朋友抱怨 WordPress 非常耗配置,经常 CPU 飚的很高!不得不承认,不做任何缓存的情况下,WordPress 多并发几个请求,负载就上去了!下面是张戈博客和中国博客联盟一天的 CPU 和网络负载:
很明显,不管是 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 缓存,效果非常不错!推荐有个人云主机的朋友使用:
③、带宽尴尬
众所周知,国内服务器和国外服务器有个很鲜明的区别:国内的服务器出口带宽都是小水管,而且升级还特贵,不像国外动不动就是 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 缓存有没有生效,可以查看如下报表:
很明显,大部分是加速请求,访问流量只有少部分到了源站,所以我 1M 带宽算是给自己和搜索引擎用了,绰绰有余。顺便贴一下百度云加速文章页面的缓存设置:
遗憾的是,百度云加速只能设置 3 条规则,自己参考设置吧。
额外解析搜索引擎线路
很多朋友质疑,用这些 CDN 会不会影响 SEO?因为 CDN 节点 IP 经常变动!其实这个
问题很好解决,额外解析一条搜索引擎线路即可!完全没必要被这个问题所困扰。
张戈博客选择百度云加速的原因也就是这个,我主要在意百度的 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 代码,完全就没必要装插件版。
又比如,禁止谷歌字体,明明还有非常简单的代码,偏偏有人就是喜欢用插件。。。
说了这么多,就是要告诉各位,你网站装的每一个插件,你是否去搜索过,是否有纯代码版本?是否有更好的替代方案?
好了,啰嗦了大半天了,最后再次总结一下张戈博客目前在用的主要优化方案:
当然,我们还可以做更细的优化,比如合并 CSS、JS 等,就不赘述了,希望本文对你有所帮助!
我想说,为什么都是linux系统,可是我是win sever2012 ,有没有啥办法,我不会玩linux。
两年前我也是这么说的!
学习了,收益匪浅。谢谢张老师
签到成功!签到时间:下午2:57:23,每日签到,生活更精彩哦~
还有dns预拉取DNS Prefetching优化,ssl证书优化
嗯,写的挺好,一般来讲,这样的文章够新手看了
张老师,我有个企业站经常内存消耗达80%以上,导致网站经常卡死,提示数据库连接错误,怎样才能解决这个问题?用的是阿里云ecs一核1GB内存,Linux系统。 :?:
企业站一般访问量不会太大,考虑是不是被人攻击。
//指定cookies的域名为网站主域名
define('COOKIE_DOMAIN', 'www.aabb.net');
这种带www就不需要启用其他顶级域名的二级了是吧,用 image.aabb.net就可以了吧? 张哥
是的
网站不带www 安装了七牛插件把cdn域名换成别的顶级域名还需要在functions.php文件添加那段替换代码吗
如果用的是鸟哥的BEGIN的话,那这个用来访问静态资源的域名是不是也要跟主题绑定?
看了一篇关于cookie-free domain的说明,上面说道Cookie 有两个重要的属性:domain 和 path。当浏览器访问一个网站时,只有 domain 和 path 都满足条件时,才会发送相应的 Cookie 到这个网站的服务器。那么在wp-config.php中加入指定cookies的域名为网站主域名那一行代码后,其实应该就能达到目的了。
如果首选域名和我博客一样是 zhang.ge,如果指定cookie path为 zhang.ge ,其他所有二级域名将全部带上cookies,你可以试试。也就是说网站使用顶级域名的时候,这个优化无效。
嗯,貌似确实是这样子!
然后你的中国博客联盟zgboke.com使用的也是祼域,博客站静态文件请求是用res.zgboke.com,这样子的话请求res.zgboke.com下的静态资源时不会带上zgboke.com传递过来的cookie吗?
zgboke.com 那个站没有用到res.zgboke.com
博主,请问,用了以上这段代码,文章缩略图全部不显示了,url全变成以下形式了
同是begin主题,cdn域名是image.xxxx.com,主域名是www的,怎样变成你博客缩略图的这种url
好神奇,代码发不出来,剪裁缩略图的timhtumb.php的url也会变成image的,本来应该是www的
随手写的,把包含timhtumb.php关键词的URL再替换回来即可,留言不留网址,谁知道你网站什么情况。
这样
最近网站速度越来越不行,逼得我做静态
我的天哪! 没想到1M 带宽都可以跑起来你的网站,太厉害了!看来以后还是在于优化,用有限的资源优化无限的可能啊!
开了又拍云,不知道怎么写后台跟评论的不缓存规则,搞得后台都进不去了,评论也不显示了,唉
原来不做静态化就用CDN不会加快网站速度啊 :mrgreen:
评论者旁边出现 博主 两字 是怎么实现的啊?
Jetpack+jsdelivr把整站的静态资源几乎都做了CDN处理了 :mrgreen:
Batcache+MemcacheD,Nginx fastcgi_cache,wp super cache,这些缓存方案可以同时用么,还是只能用其中一种,哪种好呢?