Cover

如何有效地提高 WordPress 博客的访问速度

· Technology

引言

WordPress 作为建站市场占比 40% 的庞然大物,确实可以称得上是一个时代之作。也正是因此,不少个人站长和企业都选择使用 WordPress 构建自己的站点。在本篇文章中,我便要简要叙述一下如何利用有限的服务器和网络资源提高 WordPress 站点的访问速度。

关于 WordPress

本章节将阐述有关 WordPress 的相关知识。

什么是 WordPress

WordPress 是一个以 PHP 和 MySQL

为平台的自由开源的博客软件和内容管理系统。WordPress 具有插件架构和模板系统。截至 2018 年 4 月,排名前 1000 万的网站中超过 30.6% 使用 WordPress。WordPress 是最受欢迎的网站内容管理系统。全球有大约 40% 的网站(7 亿 5000 个)都是使用 WordPress 架设网站的。WordPress 是目前 Internet 上最流行的博客系统。WordPress 在最著名的网络发布阶段中脱颖而出。如今,它被使用在超过 7000 万个站点上。

材料引用自 Wikipedia https://en.wikipedia.org/wiki/WordPress

更多关于 WordPress 的信息,请前往 WordPress 官网获取:https://wp.org

为什么要使用 WordPress

WordPress 在全球范围内具有非常良好的生态,你可以轻松地在 Google 等站获取有关 WordPress 的信息。WordPress 的开发者 AutoMattic 也开设了 wordpress.org 和 wordpress.com 以巩固其生态。

对比诸多国产 CMS 系统如 Typecho 等,WordPress 的生态可谓是全方位碾压。

尽管中国国内的 WordPress 生态可以算是烂的一塌糊涂,但不可否认的是它仍然在诸多 CMS(内容管理系统)中脱颖而出。

WordPress 具有 高可扩展性、简便快捷、易于开发、易于学习 等诸多优点,其函数 Hook 机制等极大地提高了开发的便利性。

声明

  1. 由于 WordPress 框架仍在持续更新,不少的主题、插件也都在更新,因此在本文实例的不锁死版本的不完全的生产环境中我们不会使用大量修改内核算法的优化方案。
  2. 本文仅供参考,优先适用于 个人博客 的搭建,即交互部分较少、文章修改较少、UGC较少的场景。对于大型的SNS、BBS等本文所提到的优化方法 大多是不适用的,甚至是减速。如果你对此方面的优化有需求,可以 联系 AHdark 获取付费支持。
  3. 由于部分读者白嫖文章,通过我的文章学习技术后便开展与我原有服务冲突的服务或产品,造成我个人的服务、产品受影响,或是* 从我博文取材但不加以引用或推广甚至违反本站博文发布时的 CC-BY-NC-SA 3.0 协议* ,令我心寒且愤怒,因此本文仅谈论概念而非实现,包括提到的个人编写的插件也不会提供。
  4. 本文不适用 SaaS 的 WordPress 服务。

优化 WordPress

为什么要优化

首先,我们都明确的是,WordPress 是一个前后端一体的服务端渲染(SSR)的框架,且使用 PHP 语言构建。

而 PHP 使用的 FastCGI 由于大部分是实时编译,因此无法取得良好的并发效果。即同配置服务器中,Java 或 Go 的 Web 程序的并发承载能力是远高于 PHP 的。

因此,我们要尽可能地弥补 PHP 语言效率低下所带来的缺陷,毕竟我们都很难找到比 WordPress 更好更强大的 CMS 系统了。

怎么优化

通常对于网页,我们会用到以下方法

  • 网页架构
    • 页面静态文件分离
    • 前后端分离
  • 网路架构
    • 静态文件内容分发网络
    • 动态文件快速回源链路
  • 数据库
    • 数据库查询语法优化
    • 数据库索引优化
    • 数据库查询缓存 (Memcached or Redis)
    • 数据库读写分离
    • 站库分离
    • 将 MySQL 更换为 PostgreSQL 或 Oracle
  • 文件系统
    • 文件缓存
    • PHP Opcode 缓存
    • 网页 html 缓存

此外,还有一条更加有效地优化方法:

使用更快速的语言重写网站

显然这并不现实。

网页架构优化

本段会主要说明对于网页的组成和架构的优化方案。

动静分离

在经我之手的 WordPress 中,按下 F12 ,你可以看到这种场景。

ahdark.com
ahdark.com
www.sourcegcdn.com
www.sourcegcdn.com
blog.zhksb.net
blog.zhksb.net

我本来还想放几个,但大多都被其原作者搞乱了,这里点名批评 Tkong Blog

这些站点的 Page Sources 都有一个共性,即访问的域名下只有页面文件。

将页面所引用的静态文件分离至对象存储或其他公共服务,以此提高静态文件的加载速度并减轻源站压力,这是一种可以有效提高用户体验的优化方式。

对于未备案的域名,无法使用中国大陆的服务器自然是个遗憾,大量的静态文件通过较慢的跨境网络加载也会降低用户页面渲染的速度,对于这类情况此方法也是很有效的。

你可以使用 source-global-cdn 插件将 WordPress 内核的静态文件分离,同时为 Gravatar 进行加速。

你也可以使用 Source Global CDN for WordPress 服务为发布在 WordPress.org 的插件和主题加速

前后端分离

对于 WordPress,前后端分离是很不现实的。把页面渲染交给用户可以减轻服务器压力,但自然对用户端有更大的负担。(不过通常我们不会去关心用户渲染有多慢,只会让他们换个浏览器。)

AlphaPic 就是利用程序功能,将静态的 JavaScript/CSS 文件和数据内容分离,通过 Ajax 获取数据并渲染到页面。

网路优化

关于网路优化的内容此处不会细讲,后续可能单开文章。(挖坑)

内容分发网络

CDN 通过缓存资源到边缘节点和二级节点中,降低资源回源率,让资源分布到各个节点中,以此提高访问速度和减轻源站压力。

想必诸位都听说过 西安一码通两次崩溃 的事件了,在解包小程序后可以看到其使用的静态文件并未使用 CDN(内容分发网络)而是直接提供,在 3.5 万 QPS 的访问量下单个机房的带宽出口是绝对不可能撑住的。

使用内容分发网络,不仅可以显著降低源站压力,而且可以加快访问速度,那我们又为何不用呢?

下面是一些推荐

  • 阿里云 CDN:全球速度较好且均有节点分布,节点数量多,国内需备案
  • 腾讯云 CDN:国内速度号节点多延迟低,国外质量一般,国内需备案
  • CloudFlare:国内节点需大客户,国外节点防御高,免费,速度一般,延迟一般,偶尔被运营商封,无需备案
  • CloudFront:AWS 家的 CDN,送 2TB 流量,速度优,国内无节点,速度良好,延迟一般,无需备案

这并不是全部已经我测试的 CDN,其他部分厂家甚至是一些小厂的部分节点质量都有较高的。

在上文的动静分离中,使用 对象存储 + CDN 也可以显著降低成本、提高速度、降低源站压力。

使用 腾讯云 COS + 腾讯云 CDN,可以得到一个腾讯的备案域名,这个对于无备案域名的站长是很友好的。

示例:WordPress 博客使用腾讯云对象存储 COS 进行静态资源 CDN 加速

动态链路优化

在广告的疯狂摧残下,想必诸位都听说过 “全站加速” 了。

它的本质意义就是让回源链路更短、更快,节点间大多使用内部协议提高响应速度,以最优的链路访问员站,以此减小动态内容的响应延迟。

我个人较为推荐 阿里云的 DCDN 和 腾讯云 CDN 的动静加速模式 ,且我自己也在使用。

数据库

查询优化

在服务器渲染一个页面时通常会进行 10~20 次数据库查询。

使用 WordFence 会提高到 30 次以上,同时安全性大幅提高。

而部分的查询是不需要每次更新的,因此我们可以使用 Redis 或 Memcached 等内存缓存器将其缓存。显然,数据库查询的速度是远低于直接从内存获取数据的速度的。

对于 Memcached,可以参考这篇文章:WordPress 如何启用 Memcached 内存缓存来提高网站速度

我个人是有更精细的同时使用 Redis 和 Memcached 进行缓存的方法的,但属于付费服务,因此不作公布。

站库分离

有时,当你打开自己的WordPress博客,发现致命错误:无法连接到数据库。然后,打开Linux终端,输入 service mysqld status

然后发现,MySQL 服务关闭了。

数据库作为服务持续运行的必要条件和基础,自然不应随意关闭。而你的数据库这样关闭,大概率是因为内存溢出。

MySQL 数据库可以配置占用的资源大小,但如果资源太小会导致响应慢,太大又会导致网页高并发时内存溢出。那,怎么让站点并发大时内存占用大时不会导致数据库内存溢出呢?

我采取的方案是 站库分离 ,即将数据库从 web 服务器移出。我目前在使用阿里云 RDS 数据库和腾讯云 TDSQL-C 数据库。

这可以有效降低数据库因内存溢出而关闭导致站点无法正常访问的概率。

PHP 优化

PHP 优化最高级的方法肯定是自己改 PHP 核心程序,但这实在过于困难,所以不予撰写。

Opcode 缓存

PHP 是一个脚本语言,他会将 php 文件编译为 Opcode 后执行。部分 php 文件不需要每次都重新读取后编译,因此我们可以缓存编译后的 Opcode ,来取缔编译过程消耗的时间。

例如使用 PHP 扩展:Zend OPCache / APC

总结

综上,WordPress 优化是一个较为复杂的过程。我个人对此研究了许久也才大致理解部分内容,动手实践又更加困难。 因此,摆烂或是找人协助也是个好选择。

我的所知并不局限于本文章中,为了防止某些人剽窃我的技术,我没有将自己全部关于 WP 优化的知识都写入文章中,更没有写任何实际操作方法。 但,花点小钱找我优化,或者和我混好关系白嫖我的优化(当然这比较困难),或许也是一种好的选择。

Comments

Send Comments

Markdown supported. Please keep comments clean.