刚买主机的时候兴奋异常,测试速度也快感爆棚。安装 WP,折腾各种主题,折腾各种插件,写各种博文。一段时间之后,当初的爆棚感变成了蛋疼感,主机速度似乎越来越慢,当初瞎了眼?做了小白鼠?甚至有些人选择了更换主机。

以上是我曾经遇到的疑惑,很多人或许都有过类似的悲剧。大多数人会把问题往主机商身上扣,认为其服务越来越不稳定,赚了咱们 100 元/年的血汗钱。当初给蛋糕现在给窝头。而河对岸的主机商却委屈流泪喊冤发狂。

不错,主机自身的速度的确是影响网站速度最重要的一点,但除此之外,还受到其他很多方面的影响。这就是为什么刚刚安装 WP 的时候感觉很快,用了一段时间后却变慢的原因。 Willin Kan 曾经写过一篇 《WordPress 真的飞不起来》,有些人似乎对这文章产生了误解。全文其实并没有说 WP 自身程序设计的性能问题,而主要提到了插件,数据等对于 WP 速度的影响。这就好比 Windows 系统,其实挺好用,但因为各种各样的应用软件设计得比较坑人,导致电脑越用越慢,用户反倒给比尔盖茨扣上了二百五的帽子。再回头看 Willin Kan 想要表达的内容或许是: WordPress 并没错,罪魁祸首是在各种各样的附加功能所导致。 (个人 YY 。)

那该怎样做?先看张图片,这是百度网站速度诊断工具对于网站速度载入中的各项指标进行的分析与权重

如果把这些内容放到 WP 上面来,可以归纳为以下更为直观的方法:

减少插件的使用

这是首要的一点。有句流行的话说过 「能用代码解决的决不用插件」,但实际情况是大部分的人往往都没足够的代码知识,更不可能做到对吗,每个插件的代码化,所以这是典型的站着说话不蛋疼。而更好的选择是能不用的插件就不用,一了百了,落个清净。大部分的插件都会进行数据查询与生成,这在页面生成过程中将耗费时间。如果刚好你的主机限制比较严格的话 (为了均衡资源使用率),这个时间甚至会变得比较长长长长长长。

WP 插件大多都会在页面中载入各种各样犀利的 CSS 和 JS,而网站优化中有 2 条内容是:

1 、减少 HTTP 请求,每一次对于 JS,CSS 等文件的访问都是一次 HTTP 请求。插件用得少,HTTP 请求数自然就更少。

2 、合并 CSS 和 JS 文件:减少 HTTP 请求的首要办法是合并 CSS 和 JS 。 1 个 10kb 的 js 和 2 个 5kb 的 js 载入所耗费的时间是不一样的,而且明显后者会长一些。特别是文件都在同一域名下这样的情况更为明显。而插件的 js 和 css 都是独立的,如果 10 个插件每个都生成 1 个 js+1 个 css,再加上主题的话,css 和 js 的数量可能会超过 30 个。这…。太有才了。

虽然也可以自己手动合并这些插件的 CSS 和 JS 到主题中,但这样的做法明显很繁琐很笨搓。

许多人还听过那句 「删除不使用的插件 「,但大家都不知道为什么。这样做是有好处的,因为 WP 在每一次的页面访问时,都会判断插件的使用情况。让 WP 做更少的判断就等于做更少的数据查询。解放它的负担吧。

谨慎的选择主题或手动优化

如今 WP 主题越来越绚,面对这些精美诱惑的同时需要保持谨慎。许多主题虽然漂亮但在优化方面做得并不算好,各种 JS,各种 CSS,各种背景图片,各种空行,各种冗余,这些都会影响到载入速度。不过这并不意味着不能选择绚丽的主题,而是主题应该要基本满足以下要求,或者你手动修改它使其满足以下要求:

1 、合并 CSS 和 JS:将多个 CSS 合并为 1 个。将多个 JS 合并为一个,这样做可以减少 HTTP 请求,加快渲染时间和载入速度。

2 、合并背景图片:使用 CSS Sprites 将大部分的背景图片合并为 1 个文件,同样是减少 HTTP 请求,减少文件体积,加快渲染时间。

3 、减少数据查询:能用 HTML 直接输出的地方就不要搞个数据查询。

4 、合理的 JS 和 CSS 位置:合理的将一些 JS 和 CSS 放置到网页底部。

5 、优化主题的背景图片:打个比方,画面同样为纯灰色的 PNG 图片和 JPG 图片相比较的话,PNG 图片明显体积更小。又比如说,一个质量为 70 的 jpg 图片和一个质量为 90 的 jpg 图片从视觉上看差距并不大,但 90 质量的体积却可能高出 50% 甚至更多,这在大图片上尤为明显。通常来说,色调单一或者需要透明背景的图片使用 PNG,相反则使用 JPG 或者 GIF 。而每一种格式又可以有不同的质量选项,做在质量和体积相平衡的选择。

减少外部资源的使用

外部资源就是不在自己服务器上的资源。使用太多的外部资源会遇到以下问题:

1 、解析 DNS 的时间变长

每一个域名都是需要 DNS 解析才能够正常工作。如果网站上的内容同时需要加载 a.com,b.com,c.com,d.com 这些网站的资源,那就需要更多的时间去分别解析每个域名的 DNS,建立连接。而同样的,如果自己的站点是 a.com,如果同时加载 1.a.com,2.a.com 这些类似的域名,也同样会加长 DNS 解析时间。外部资源是不可能完全避免的,但能少则少。

2 、外部资源的加载速度不可控制

这主要是针对一些国外站点的内容而言,比如 fickr,twitter 等,因为众所周知的原因,加载它们的资源会明显减慢载入速度。而国内的站点相对来说速度还算是比较快。

减少数据库查询,或使用数据库缓存插件

数据库查询时间就像是在问数据库:「帮我在那堆动作片里找张苍老师去年 10 月出演的片子」 。数据库就开始找,找到了之后拿给你。如果同时向它要 100 个,那么这个找和反馈的时间就明显拉长了。

而许多的插件都需要数据库查询,上面关于插件和主题的部分也提到了优化代码尽量减少数据库的查询次数。如果不懂,可以考虑使用数据库缓存,它能够将数据库的查询内容缓存起来,就好像提前知道我要找什么,然后把这些东西提前整理好,当我需要的时候就不用再去那堆动作片里面瞎翻,而是可以立即给我。比如有名的数据库缓存插件 DB Cache Reloaded,但这个插件早已停止更新。国外网友在它原有的基础上开发了另一款 DB Cache Reloaded fix,效果还是不错的。

但需要注意的是,数据库缓存插件不要和静态化缓存插件一起使用。因为两者都是数据缓存内容减少查询,如果一起用就等于重复劳动。

使用页面静态化缓存插件

静态化缓存插件和数据库缓存插件的原理差不多,都是将内容提前整理好并生成静态的文件,当需要的时候直接拿出来,而不需要再去查找、生成,浪费时间。缓存过的静态文件基本上可以等同于一张静态图片,不需要执行太多复杂的内容。我个人推荐的页面静态化缓存插件是 WP Super Cache,我爱水煮鱼曾经力荐过它,功能很强大 (水煮鱼的介绍),操作也很简单。大猫有写有使用教程之含笑五步颠。

使用 GZIP 压缩网页

使用 Gzip 压缩可以减少网页体积 20% 甚至更多 (静态资源除外) 。通常大部分的 WP 主机都能够支持服务端的 Gzip 并且可以自动压缩。如果服务器没有自动进行页面压缩,就需要自行开启。上面提到的 WP Super Cache 包含了这项功能。

优化博客文章图片

就和优化主题背景图片一样,博客的文章图片也是需要进行优化的。如果会 Photoshop 自然是最好,调整图片合适的尺寸,然后输出 web 格式为合适的质量,基本上可以减少 30% 的体积。如果不会 PS,一些在线图片压缩网站也是额外选择,或者使用 Smushit 这类的图片压缩插件,虽然效果不如 PS 直接调整图片质量那么给力,但总归能少点儿体积。

以我自己的博客为例,我使用的是 media temple 美国主机,在未优化之前,完整页面的加载速度为 13 秒。而尽可能的优化之后加载速度降到 6 秒左右。基本上快了一倍。不过实话实说,最重要的还是主机自身速度 (各类主机商开始喊冤中。),但个人博客往往不可能投入大量的金钱用于购买高科技主机,有心情折腾博客的大多身处水深火热之中。。所以平民化的国外主机成为了普遍的选择。国内主机虽然够快,不过需要备案,这是个很坑爹的事实。在如此的环境之下,尽可能的从自身的内容部分去优化,是个好选择。

使用 CDN 分布式网络加速静态文件

这是奢侈的选择,没必要但可尝试。国外主机的速度相国内主机而言速度肯定略满,美国主机这种远在大洋彼岸的就更不用说了。如果有米,可以考虑使用国内的 CDN 服务来加速静态文件 (比如文章里的图片之类),CDN 就等同于把同一个文件实时缓存到 N 个服务器中,当访问博客中的某个图片时,CDN 会自动分析访客的网络线路,并选择最近最快的服务器返回图片。而静态资源在博客中的页面比例中大概占了 60-90%,使用 CDN 分布式网络能够有效的提速。目前国内有 Webluker 和又拍云存储、又拍图片管家这三种 CDN 比较适合普通站长,价格也相对便宜。比较推荐又拍云或者又拍图片管家,因为国外主机往往都没有备案,而又拍云可以提供 upyun 的 3 级域名。 webluker 因为原理不同,这必须源站绑定已备案的域名 (丫的我备案了还找你干鸟) 。使用 CDN 服务的时候,可以这样做:选择空间较小的国外主机 (300M 空间,10G 流量以内)+图床类型的国内 CDN 服务,这样总体的搭配价格在 200 元以内,价格不贵,但提速效果绝对明显。

至于又拍图片管家和又拍云存储 2 者相比较,我个人更倾向于又拍云存储,自定义方面更强 (比如绑定域名免费、可存储 HTML/JS 等非图片文件、支持 FTP/API 、 404/403 提示图片等、 Token 防盗链等) 。而又拍图片管家更适合纯粹的图片存储,不过流量和存储空间相对要略大些。最近华为网盘有出了个直链服务,价格貌似比较低,但个人不是特别看好,毕竟还是基于网盘的功能类型,即便是有了 API,但左看右看都有点蛋疼。

有人会骂街:那我不如选择个国内主机或大流量的香港主机,干嘛还要额外花钱用 CDN 。这是正确的,但其实这又不是完全正确的。

1 、国内备案现在很麻烦 (邮寄身份证,材料啥的,折腾无止境,随时被喝茶。由于现在备案都是直接接入主机商备案系统,最坑爹的是现在有些主机商居然还要求付钱备案。)

2 、国内主机价格偏贵,质量却不一定好。

3 、即便是国内主机或香港主机,线路速度和 CDN 分布线路速度相比还是有很多差距 (特别是对于单线主机而言)

4 、如果你真的选择国内主机,那么国内主机+CDN 才是帅气的日天手法。

优化的效果

假如你问我:「我只是一个小博客,访问流量也很小,有必要这么折腾吗?」 但据我所知,用 WP 做独立博客的大多都是折腾+蛋疼狂,再引用大猫的一句话:搞这些纯粹为了自 High,和流量没关系,打开自己的网站快个 6 、 7 秒不是一件很爽的事咩?

以我自己的博客 (acora.cc) 为例,减少了插件的使用和优化了主题之后,再配合香港主机 + MT ProCDN + 又拍云存储 CDN + WP Super Cache 插件,页面的载入速度从以前的 15 秒到现在的 2.2 秒 (4M 电信测试),减少了 80% 以上的载入时间,基本达到高 chao 了。国内的高价低质主机们去死吧。

Yslow测试优化结果