一、网站速度测试

测试网站的速度不能仅看自己电脑打开网站的速度,因为网站的访客通常来自五湖四海,所以我们需要通过第三方专业的工具来进行测试。

网上有不少在线测试网站速度的网站,利用这些网站就能测试不同地区打开网站的速度。测试的时候不妨多测试几次,以获得更准确的测试结果,特别是在您网站使用了 CDN 的情况下。

国内测速

国内的测速网站可以测试不同城市服务器连接网站的速度,但是不会告诉您加载资源的具体数据,以及优化建议。

测吧

17CE

国外测速

国外的知名测速网站有 Google PageSpeed Insights、GTmetrix、Pingdom 等,可提供详细的测速报告,以及优化建议。如果您的网站加载速度较慢,可通过这些测速网站来查找原因。

Google PageSpeed Insights

GTmetrix

Pingdom

我的网站在 Pingdom 上的评分只有 C,但是 Load time 却很低,表明加载速度还是很快的。主要原因有两项,Pingdom 认为我的网站没有使用 Gzip 压缩,但是实际上我通过 Cloudflare 使用了更先进的 Brotli 压缩;此外由于 Cloudflare 免费版并不支持 cookie-free,所以也减分不少。

所以,有时候我们并不需要太极致的优化,对于测速网站的建议,我们只需要根据自己实际情况调整即可。只要总体加载速度够快,对于细枝末节的优化,简单的就做一下,影响不大却又难以实现的,就没必要斤斤计较。

二、购买一台快速且稳定的服务器

服务器的重要性就不同多说了,一台好的服务器是一切优化的基础。

在选择服务器的时候,建议大家首选大厂商,不要一味的追求性价比,速度和稳定才是第一要务。小厂商确实有时候会有性价比不错的主机,有些速度也很不错,但是往往稳定性就很不如意。

我曾经用过不少主机,从小厂商到中型厂商都试过。小厂商就不说了,宕机频繁,在网站还没有盈利时我就决定弃用了。后来用了一个中型厂商的主机很不错,性价比极高,但是一年也会来几次宕机或者停机更新。每一次宕机对网站的伤害都是极大的,直接的经济损失就不说了,万一被搜索引擎降权那就是毁灭性的。

选择服务器之前,大家要先想好备案的问题。如果访客主要在国外,那就选择国外的服务器,可以免备案快速开通。如果访客主要在国内,那么能备案尽量备案,因为网站发展到一定程度,有些事情需要备案才能办,例如使用国内的 CDN。

1,阿里云(备案)

网址:https://www.aliyun.com优惠券

阿里云是国内云计算的先驱,在国内市场,占领了半壁江山。在国际云计算市场,阿里云也占据第三位,仅次于亚马逊 AWS 和微软 Azure,第四和第五位分别是 IBM 和谷歌云。(参考知乎:阿里云真的国内云计算第一吗?这是阿里领先百度和腾讯的地方吗?

我已使用阿里云 ECS 服务器超过一年,目前在线率 100%,从未出现过任何问题。无论是连接速度还是稳定性都无可挑剔。所以在续费的时候我直接续了 3 年(续费年限越长,优惠越多,一年¥1477.88,三年¥2608.02)。

日常资源使用情况:

由于开始建站的时候比较急切,所以我使用的是香港节点的主机,免除了备案的麻烦。但是这导致不能全站使用国内的 CDN,我只好另外备案了一个域名做动静分离。因此我需要额外做了许多优化工作,才能让网站在国内达到理想的访问速度。如果能够全站 CDN 加速,我的网站速度还能提升一个台阶。

我目前使用的服务器方案是“共享计算型 n4(ecs.n4.small)”,1 核心 CPU,2 G 内存,SSD 20G 云盘。每天应付数千流量毫无压力(有使用 CDN + OSS 做动静分离)。

如果您是建站新手,还可以选择“轻量应用服务器”。这种服务器的好处是即买即用,您不用再手动安装 WordPress 的各种服务器环境,只要购买时选择 WordPress 镜像即可。

轻量应用服务器的最低配置是 1 核 1 G、20 G SSD 云盘、1 兆带宽,价格 ¥60 元/月,¥612 元/年。

阿里云经常有各种各样的活动,购买之前记得先查看一下最新优惠活动页面,新用户经常都有很低的折扣,甚至低至 1 折。

2,SiteGround(免备案)

网址:https://www.siteground.com

SiteGround 是美国最受好评的知名服务器商,在 Facebook 上众多讨论小组的主机民意调查中屡获第一。

同时也是 WordPress.org 官方推荐的主机

SiteGround 提供很多简化 WordPress 网站管理的工具:一键安装,托管更新,WP-Cli,WordPress staging(预备测试环境) 和 git 集成。使 WordPress 的加载速度更快:基于 NGINX 的缓存,SSD 硬盘,PHP 7,CDN,HTTP / 2。 而且还可以主动保护 WordPress 网站免受黑客攻击。

目前 SiteGround 提供三种 WordPress 主机方案,首次购买会有很大的折扣,续费时按正常价格要贵许多,所以建议直接购买 3 年。

最低价格 StartUp 方案仅需一个月 $3.95 美元。提供:WordPress 一键安装、免费 SSL 和 HTTP / 2、免费每天备份、WordPress 自动更新、免费 CloudFlare CDN、免费电邮等等服务。

关于 SiteGround 的详细介绍请参考此文章:
SiteGround-排名第一的国外 WordPress 专用主机

三、升级到 PHP 7+

有很多人会遗忘掉自己服务器使用的是哪个版本的 PHP,特别是那些经营多年的网站,可能依然在使用 PHP 5。但是实际上您仅需简单的升级一下 PHP 版本,您的网站速度可能就可以提升 2-3 倍。

WordPress 5.3 PHP benchmarks

大多数情况下,主机商不会主动帮您更新 PHP 版本,因为您的主题或者插件可能不兼容,所以您需要自己来执行更新。这也导致很多人忘记了这一茬。如果您已经使用一台主机多年,那么是时候检查一下您的 PHP 版本了。

第 1 步:进入 WordPress 网站后台,在“工具”→“站点健康”中就能查看 PHP 版本。如果没有提示,代表 PHP 版本已经是最新的了。

第 2 步:安装 PHP Compatibility Checker 插件,检查新的 PHP 版本是否与主题/插件冲突。

第 3 步:进入服务器控制面板(如:Plesk、Cpanel、宝塔面板),通常都有提供不同 PHP 版本选择或者安装,升级至最新版本即可。如果你的主机商没有提供面板,可以联系客服升级。

Plesk ▼

四、安装缓存插件

缓存插件是提升 WordPress 网站速度的一把利器,效果立竿见影。缓存插件除了加速外,还能减轻服务器负担,节省资源,实在是居家旅行、杀人灭口,必备良药!

缓存插件的作用是,把 WordPress 的网站页面生成静态的 html 文件,当用户访问时,就不用再解析 PHP 脚本,并减少数据库的查询,从而提升网站速度。

WordPress 的缓存插件有很多,知名的有以下这些:

在 Facebook 上的一些民意调查中,WP-Rocket 是排名第一的缓存插件。

但是它是一款收费插件,而且还不便宜,每年 $49 美元,但是经常有低至 5 折续费优惠。

WP-Rocket 不仅仅是一款缓存插件,它还内置很多优化功能,例如:HTML、CSS 和 JS 的压缩和整合,优化数据库,DNS 预读取,CDN 整合、Heartbeat control、Lazyload、WebP 等等。

从我建站开始不久就一直使用 WP-Rocket,对其优化效果和稳定性都极其满意。它功能丰富,设置简单,节省了我很多优化工作时间,物有所值,极力推荐。

WP-Rocket 毕竟是收费的,对于大多数人来说还是倾向于使用免费插件。大家可以根据自己的需求来选择其他插件。

WP Super Cache 是 WordPress 官方出品,知名度很高,兼容性比较好,设置虽不简单,但也不太复杂。W3 Total Cache 虽然功能丰富,但是设置异常复杂,适合喜欢折腾的人,不建议使用。WP Fastest Cache 是后起之秀,设置简单,建议使用。

这些免费缓存插件我都使用过,但是与 WP-Rocket 相比还是差强人意,总会有各种莫名的问题或者功能缺失,建议配合 Autoptimize 一起使用。

五、定期清理数据库

WordPress 经过一段长时间运行后,数据库里会产生许多垃圾内容,例如:文章修订版本和草稿、垃圾评论、插件生成的临时数据、trackback 和 pingback 数据等等。时间久了,数据库将变得臃肿,降低网站运行速度。所以定期清理数据库时很有必要的。

您可以使用 WP-Optimize 插件来完成这些工作。注意:在清理和优化数据库时会直接修改数据库,所以务必在操作之前先备份数据库(推荐使用 UpdraftPlus 插件备份),以防万一。

如果您已经购买 WP-Rocket,就无须安装此插件,WP-Rocket 已经集成这些功能。

六、心跳控制(Heartbeat Control)

Heartbeat(心跳检测)是 WordPress 的一项功能,当您登录 WordPress 管理面板时,它可以在服务器和浏览器之间提供实时通信。它使用文件 /wp-admin/admin-ajax.php 从浏览器运行 AJAX 调用。默认情况下,AJAX 请求在文章编辑页面上每 15 秒发送一次,在仪表板上每 60 秒发送一次。

但是 Heartbeat 并非是必要的,通常需要使用到它的一些功能是:自动保存、文章修订、仪表盘实时提醒、文章锁定(多人同时编辑)、某些需要在仪表盘上显示实时数据的插件。

您可以使用 Heartbeat Control 插件来禁用此功能。

七、Lazyload(懒加载)

相信很多人都知道什么是 Lazyload,如果您的网站文章存在大量图片,那么使用 Lazyload 就能大大提升页面加载速度。例如微信公众号、知乎等网站都有使用 Lazyload 功能。

网上一直都有讨论 Lazyload 对 SEO 的影响,最主要的问题是导致搜索引擎无法索引图片。我的看法是,搜索引擎本来对图片的识别能力就有限,文章排名的好坏主要还是看文字内容和其他排名因素,图片的索引与否对文章的排名影响微乎其微。

所以如果您的网站不是图片分享型的网站,而且网站使用了大量图片,我建议还是尽量使用 Lazyload。

Lazyload 还有一个问题,如果您的文章中带有目录,因为图片只有在看到时才加载,导致点击目录无法准确定位。如果您像我一样使用的是目录插件,那么只要把“平滑滚动”选项去掉就可以了。

Lazyload 并不是什么复杂的技术,很多缓存插件或者图片优化插件都附带此功能,或者您可以单独安装一个 Lazyload 插件 – 使用人数最多的 a3 Lazy Load 插件

八、缓存或禁用谷歌字体

在编辑文章的时候,WordPress 后台会自动加载谷歌字体,由于众所周知的原因,国内是无法加载谷歌服务器资源的,因此导致后台加载速度很慢,甚至无法打开。如果您使用的是国外开发的 WordPress 主题,也有可能使用了谷歌字体,导致国内打开速度很慢。

通过 Chrome 的开发者工具可以看到,谷歌这些字体的域名通常是 fonts.gstatic.com,或者 fonts.googleapis.com,并以 woff 或 woff2 结尾。▼

由于 WordPress 在 2019 开始启用了古腾堡编辑器,网上很多禁用谷歌字体的代码已无法使用。下面是最新可用的代码,将以下代码添加至 WordPress 主题的 functions.php 里面就行了。

// 禁用 WordPress 后台古腾堡编辑器加载 Google 字体
function Disable_Google_Fonts($translation, $text, $context, $domain)
{
    if($context != 'Google Font Name and Variants' || $text != 'Noto Serif:400,400i,700,700i') {
        return $translation;
    }
    return 'off';
}
add_filter( 'gettext_with_context', 'Disable_Google_Fonts',10, 4);

上面的代码只能解决后台的问题,对于前台(主题)是无能为力的。网上有很多使用代码或者插件的解决方案,但是由于不同的主题可能需要使用不同的代码,逐一测试很麻烦,而网上推荐的很多插件又失效了。

经过一番查询后,我找到以下一些办法:

在 WordPress 后台通过关键字“Google Fonts”来查找插件,如果有保持更新的插件那就可以尝试使用。目前我找到的一款插件是:Disable and Remove Google Fonts

此外,您还可以安装 Autoptimize 插件,此插件有禁用或缓存谷歌字体的功能。Autoptimize 同时也是一款很优秀的 WordPress 优化插件,非常值得推荐使用。

或者还可以使用 OMGF | Host Google Fonts Locally 插件,把 Google 字体托管到本地。

九、使用 CDN 加速

使用 CDN 加速是提升网站速度最立竿见影的方法,建议有条件的都务必使用。

CDN 不仅能大幅提升网站访问速度,还能隐藏服务器真实 IP,提高服务器安全,降低服务器资源消耗,可谓一举多得。

1,已备案网站

已备案的网站通常访问对象在国内,所以理应购买国内的 CDN 服务。推荐使用阿里云 CDN,价格仅需每天每兆流量 0.54 元(按量付费)。

阿里云 CDN 可以流量包的形式购买,最低价格一年 ¥20 / 100 G(日流量 1 千左右的网站已经够用了)。如果是 https 网站,需额外购买 https 请求包,价格一年 ¥40 / 1000 万次。

购买地址:https://www.aliyun.com/product/cdn(购买前记得先领取代金券大礼包

阿里云 CDN 拥有国内节点 1000+,覆盖电信、联通、移动、铁通、教育、长宽等各运营商。带宽储备 80T 。海外节点 300+,部署在全球 70 多个国家和地区,覆盖六大洲。

主要特色功能包括:

  • HTTPS 安全加速 – 防劫持、防篡改、防泄密,享受企业级可靠 HTTPS 加速服务。
  • 高性能灵活缓存策略 – 智能对象热度算法,分层缓存热点资源,让您的资源精准加速。
  • 访问控制 – 提供多重访盗链功能,refer 防盗链、UA 头防盗链、IP 防盗链、URL 鉴权校验,完美解决盗链危害。
  • 性能优化 – 页面优化、智能压缩功能,为您减少传输内容节约开销的同时提升加速效果。

2,未备案网站

未备案网站的访客主要在国外,虽然阿里云也提供国外的 CDN 服务,但是在国外就没必要了。因为国外有一个大名鼎鼎的 CDN 服务商:CloudFlare!最重要的是完全免费!

有人可能要问了,那国内的网站可以用 CloudFlare CDN 吗?答案是可以,但是结果不是提速而是降速。因为 CloudFlare 在国内没有节点,节点都在国外。国内的访客访问到国外的节点上去了,速度自然更慢了。

关于 CloudFlare 的设置网上有很多教程,这里就不再赘述了。接入方式推荐使用 cname 方式,网上有很多第三方 cname 接入的网站,例如:笨牛网。此外再安装 CloudFlare 官方插件,当文章更新时可以及时刷新缓存。

但是有一个地方需要设置正确才能大幅度提升速度,就是设置 Page Rules。因为 CloudFlare 默认情况下只会缓存图片、css、js 等文件,html 等文章页面是不会缓存的,通过 Page Rules 建立规则就能调整 CloudFlare 缓存哪些页面,甚至整站缓存,这样速度就能大幅提升。

上图是在 CloudFlare 后台添加的一条 Page Rules。网址替换成您的网站,Browser Cache TTL(浏览器缓存时间) 和 Edge Cache TTL(回源周期)按照您的需求设置即可。回源周期就是 CloudFlare 多久缓存一次您网站的内容。

十、图片优化

图片是拖慢网站速度的一个很重要的原因,尤其是当网站使用了大量图片的时候,例如这篇文章中就使用了很多图片,除了使用 Lazyload,我还通过插件来解决图片优化的问题。

我尝试过 WordPress 的很多图片优化插件,其中做得最优秀的当属 Smush 和 imagify

图片优化插件可以自动压缩和优化您上传的图片,而且还能根据您设置的最大尺寸, 自动缩小尺寸过大的图片。图片的体积减小了,自然加载速度就更快了。

图片的最大宽度建议设置为和文章的宽度一样,除非您想让访客能点击放大。因为访客能看到的宽度也就那么大,图片再大也只是浪费资源。查看方法如下图(点击放大):

如果您不想使用插件,网上也有很多网站可以利用,搜索:“在线压缩图片”就能找到,例如 yasuotu.com。您可以设定宽度、高度、压缩比率来优化图片。

图片优化的方法还不止这些,例如禁用 WordPress 缩略图功能以节省服务器空间。此外还有更优雅的解决方案,就是利用阿里云 oss 图片处理服务实时压缩和缩放图片。

十一、异步加载 JavaScript

有时候,我们的网站无可避免要加载一些第三方资源,例如前面提到的谷歌字体,或者统计代码。但是这些外部资源存在于第三方服务器,加载的速度是不可控的,有时候会减慢网站的整体速度。

通常最常见的外部资源是加载第三方 js 文件,此时我们可以通过异步加载来解决问题。异步加载可以使得外部 js 放在最后加载和执行,这样访客就无须等待这些外部 js 加载完毕就能看到页面,提升用户体验。

异步加载 js 很简单,如果您可以编辑代码,那么只需要添加“async”或“defer”属性即可,例如:

<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

您还可以安装 Async JavaScript 插件,这个插件可以让您控制每个外部 js 是否需要异步加载。或者使用 Asset CleanUp 插件,这个插件不仅可以异步 js,还可以控制在哪些页面禁用 js 脚本(有些脚本并非所有页面都必须使用)。

此外,针对 Google Analytics 您可以使用 CAOS 插件把代码托管到自己的服务器。

十二、DNS Prefetch

DNS Prefetch 是一种 DNS 预解析技术。当你浏览网页时,浏览器会在加载网页时对网页中的域名进行解析缓存,这样在你单击当前网页中的链接时就无需进行 DNS 的解析,减少用户等待时间,提高用户体验。

例如淘宝网站上就使用了 DNS Prefetch:

大部分网站都无可避免要使用到第三方网站的资源(例如百度统计),或者跳转到其他网站的链接。此时通过 DNS Prefetch 就能省去 DNS 解析的时间,提升访问的速度。

您可以安装插件 Pre* Party Resource Hints 来实现 DNS Prefetch,或者在 functions.php 中添加代码,例如:

function wp_dns_prefetch() {
  echo '
  <meta http-equiv="x-dns-prefetch-control" content="on" />
  <link rel="dns-prefetch" href="//bdimg.share.baidu.com/" />
  <link rel="dns-prefetch" href="//api.share.baidu.com/" />
  <link rel="dns-prefetch" href="//hm.baidu.com/" />
  <link rel="dns-prefetch" href="//www.google-analytics.com" />
  ';
}
add_action( 'wp_head', 'wp_dns_prefetch');

十三、禁用无用的功能

WordPress 有一些不必要的功能,如果您不需要这些功能,那么可以禁用掉,这样就能节省服务器资源。

例如:文章修订版本、自动保存、Emoji 表情、Pingback 和 Trackback、XML-RPC、REST API 等等。

您可以使用插件 Clearfy 或者 WP Disable 来禁用这些功能。

十四、避免安装过多插件

为什么那么多人喜欢使用 WordPress,其中一个原因就是有大量的插件,可以实现各种各样的功能。但是由于插件作者的水平不一,导致插件的性能各异,还有兼容性等问题,所以安装过多的插件反而会拖慢系统。有些人觉得 WordPress 臃肿,其中一个原因就是不当使用插件。

插件是要消耗服务器资源的,每多安装一个插件就代表多消耗一份资源,所以务必要控制插件的数量。如果一个插件能实现多个功能,就不要安装一个独立功能的插件。

此外,如果两个插件功能相仿,要尽量使用安装量大的插件,这表明插件更实用,而且兼容性更好。安装量过低的插件尽量不要使用,安装后导致系统崩溃的事情并不少见。

十五、有选择性的禁用插件

每个插件都有相应的一些功能,但是并非网站上所有页面都需要使用到这些功能。实际情况却是,很多插件在安装后,都会在网站的每一个页面中加载自己的 js 和 css 文件,这样页面中就加载了很多没必要的资源,白白浪费带宽资源。

Asset Cleanup 非常适合于禁用在特定页面上不使用的插件。特别是如果您安装了许多插件,或者仅安装了几个资源密集型插件,但是仅需将它们加载到所使用的页面上。这意味着整个 WordPress 网站可以加载得更快。类似的插件还有 Plugin Organizer

利用 Chrome 的开发者工具,在 Network 中搜索“plugins”,您就能看到页面中加载了哪些插件的资源。检查网站上各种类型的页面,特别是文章页面,如果有哪些 js 或 css 是当前页面没有使用到的,那么就用 Asset Cleanup 禁用掉吧。

十六、限制搜索引擎爬虫

搜索引擎爬虫是消耗服务器资源的大户,特别是一些勤快的爬虫,例如 Googlebot。此外还有一些专门四处抓取网站数据的网络爬虫,例如 AhrefsBot。为了避免服务器资源浪费,我们很有必要对这些爬虫做些限制,甚至禁止访问。

Wordfence 是一款非常强大的 WordPress 安全插件,推荐所有人安装使用。在 WordFence 的「Tools → Live Traffic」中您可以实时查看所有访问者信息,包括真实访客、爬虫、网络攻击等等。

找到那些您不希望抓取您网站数据的爬虫,然后在 robots.txt 中禁止掉。例如:

User-agent: AhrefsBot
Disallow: / 
User-agent: MJ12bot
Disallow: /
User-agent: YandexBot
Disallow: /

有些爬虫可能不遵守 robots 协议,那么您可以在「Firewall → Blocking」中设置规则来禁止访问。

此外,Wordfence 还有一项 Rate Limiting 功能,可以限制访问频率,及禁止虚假 Google 爬虫。大家可以根据自己的实际情况,限制真实人类或蜘蛛爬虫的访问频率。

十七、限制文章修订版本

在您编辑文章的过程中,每保存一次就会增加一个文章修订版本。日积月累下,这些文章修订版本的数量将达到一个恐怖的数量,实际上我们并不需要如此多的修订版本,这只会增加数据库的体积,降低数据库的性能。

有很多插件都有限制文章修订版本的功能,例如前面提到的 Clearfy。但是其实我们只需在网站根目录 wp-config.php 文件中增加一行代码就能解决问题:

define('WP_POST_REVISIONS', 3); //保存 3 个修订版本
define('WP_POST_REVISIONS', false); //不保存任何修订版本