WordPress 托管与插件
让WordPress既快速又安全:性能与插件检查清单
WordPress 的速度和安全性完全取决于运行在其之上的内容。以下是我们为托管的每一个 WordPress 网站所应用的事实核对表——包括该缓存什么、该保护什么,以及哪些插件物有所值,哪些插件会被该平台取代。
WordPress 的好坏取决于运行它的环境
WordPress 驱动着互联网的大半江山,因为它足够灵活,但这种灵活性也正是它变得缓慢且不安全的原因:默认安装在每个页面上会查询数据库数十次,向任何查看的人广播其版本和技术栈,并诱导你不断堆砌插件,直到性能和攻击面在悄无声息中急剧膨胀。这与其说是 WordPress 本身的缺陷,不如说是将其运行在毫无协助的基础设施上所带来的必然结果。
好消息是,只需做出少数几项决定就能解决大部分问题,而且这些决定关乎技术栈而非内容。在正确的层级上积极缓存,将数据库排除在热路径之外,只运行真正有价值的少数几个插件,保持所有组件打好补丁,并隔离网站以将问题控制在局部。这篇文章就是这份检查清单,按照我们在平台上对每个 WordPress 网站应用它的顺序排列。
在服务器端缓存,而不单单在插件中
对于WordPress速度而言,最显著的单一杠杆是对绝大多数访问根本不运行WordPress。标准请求会启动WordPress,运行您的插件并查询数据库,然后才发送第一个字节;而全页缓存则在下一次访问时直接从网络服务器提供已完成的页面,从而跳过整个启动过程。该缓存存放的位置至关重要:缓存插件位于PHP内部,因此PHP仍会在缓存响应之前启动,而服务器级缓存则在请求的更早阶段进行响应,并以服务器能够即时刷写(flush)的形式保存页面。
我们托管的每一个 WordPress 网站都运行在搭载服务器级 LSCache 的 LiteSpeed Enterprise 上,我们自己的缓存插件开箱即可将 WordPress 与之正确连接——预装且自动更新,让您少了一项需要配置或维护的事情。在非 LiteSpeed 源站上,该插件只是不发出整页标头并保持不干涉,同时对象 cache 继续工作,因此迁移后的网站绝不会处于半配置状态。针对您自己的检查清单的实用原则:在服务器端使用一个整页缓存,切勿在其之上堆叠第二个缓存插件——它们会发生冲突。
对象缓存与数据库
并不是每个请求都能成为静态页面。已登录的会话、管理后台、搜索、购物车以及任何个性化片段都必须运行PHP,对于这些请求,优化目标从跳过应用程序转变为跳过数据库。每个站点专用的对象缓存(在我们的案例中为 Redis)将重复的数据库读取结果保存在内存中,这样就不需要在每次访问时针对相同的选项、瞬态数据(transients)和查询去请求数据库。其效果恰好体现在全页缓存无法发挥作用的地方:更快的管理后台、更快的购物车,以及在流量高峰时大幅降低的数据库负载。
关键在于“逐站点”。共享对象缓存意味着一个繁忙或编写不良的站点可能会逐出其他所有站点的缓存数据,并耗尽邻近站点的数据库资源;而专用的逐站点缓存与逐站点数据库限制相结合,可将该影响范围控制在局部。在您的检查清单中,对于任何拥有登录用户或商店的站点,应将持久性对象缓存视为不可或缺的选项,并警惕在多租户之间共享该缓存的托管服务。
值得运行的插件,以及本平台可替代的插件
您添加的每个插件都是在请求时运行的代码,也可能是某天可能有人会通过的门,因此诚实的目标是用最少的插件实现最多的功能。一个好的主机消除了对整类插件的需求:借助服务器级缓存、托管对象缓存和平台备份,您不再需要缓存插件、单独的对象缓存插件或备份插件——这些工作在 WordPress 基层能完成得更好,而在其之上运行它们只会增加冲突和开销。
剩下的、值得运行的是一小套能真正增加功能的插件:您的网站运行实际需要的插件,以及——在我们平台上——我们为每个网站构建并随附的两款仓库级插件。我们的缓存插件将 WordPress 连接到服务器缓存并处理智能清除,以便编辑操作仅清除应清除的页面。我们的网络痕迹插件在每次部署时会剥离默认 WordPress 安装所广播的痕迹——版本和生成器标签、发现端点、XML-RPC、pingback 以及 powered-by 标头,因此插件或主题更新无法悄悄将其恢复。这两款插件均按照 WordPress.org 插件目录标准构建,免费且可自行更新。
保持 WordPress 安全与最新
大多数 WordPress 的被黑事件并不高明,而是手法陈旧。过时的核心、主题或插件存在已知的、公开的漏洞,这是网站遭到攻击压倒性地最常见原因,这使得保持更新成为最有价值的安全工作——也是最繁琐的工作,正因如此它才经常被忽略。托管主机应该为您分担这些工作:修补 WordPress 底层的软件栈,并通过为您提供用于测试的暂存副本以及用于回滚的备份,使核心和插件的更新能够安全应用。
除了省钱之外,您还可以指望系统为您强制执行安全底线:默认开启恶意软件扫描,以便在访客发现之前就拦截感染;隔离机制确保受损的网站无法波及其他网站;边缘 DDoS 防护;以及无处不在、证书自动续期的 TLS。这些都无法替代基本的安全卫生习惯——强密码、最小权限访问、移除不再使用的插件——但这意味着基础设施不会成为薄弱环节。在您的评估清单中,对于任何托管服务商,问题都很简单:安全是默认标配,还是需要付费购买的套餐?
WooCommerce 和您绝不能缓存的页面
商城是激进缓存策略收效最大,但如果策略幼稚也会造成最严重破坏的地方。目录页、产品页和分类页是您流量最高、最适合缓存的页面,通过全页缓存提供这些页面是提升商城速度最有效的方法。但购物车、结算和账户页是个性化页面,绝不能从共享缓存中提供——一旦这样做,购物者就会看到别人的购物车,这既是商城故障,也是隐私事故。
兼得两者的诀窍是缓存页面,并为实时部分预留孔洞。Edge Side Includes 会按请求渲染购物车片段、迷你购物车总计和账户状态,而页面的其余部分则从缓存中提供,同时购物车、结账、我的账户以及任何 nonce 或会话页面默认都会被排除。新鲜度由智能自动清理机制来处理,该机制会在产品、价格或订单发生更改时触发,因此绝不会残留陈旧的价格。如果您运行 WooCommerce,这就是检查清单中必须做到万无一失的部分:从缓存加载快速店面、针对每个用户的实时购物车、绝不缓存任何个人信息。
常见问题
我还需要像 WP Rocket 这样的缓存插件吗?
不是。全页缓存由网络服务器上的 LiteSpeed's LSCache 处理,我们自己的缓存插件将 WordPress 与之连接并处理智能清除,其后则是一个按站点运行的 Redis 对象缓存。在顶层再添加第二个全页缓存插件通常会与服务器级缓存冲突,而不是提供帮助,因此既不需要也不推荐这样做。
本平台让哪些插件变得不再必要?
这里不需要缓存插件、独立的对象缓存插件和备份插件,因为这些工作都在 WordPress 之外完成了——服务器级缓存、托管的每站点对象缓存以及平台备份。移除它们可以减少冲突和攻击面。真正值得运行的依然是您的网站功能确实需要的插件,再加上我们预装的两个免费缓存和 footprint 插件。
缓存会损坏我的 WooCommerce 购物车或登录页面吗?
默认情况下,购物车、结算页、我的账户以及任何 nonce 或会话页面均不参与缓存,同时 Edge Side Includes(边缘侧包含)确保购物车片段和总计在其他缓存页面上保持实时更新。购物者在店面从缓存加载的同时,始终能看到自己的购物车和正常工作的结算页,而智能自动清除功能则会在产品、价格或订单发生更改时清除受影响的页面。
在无需我管理的情况下,你们是如何保障 WordPress 安全的?
我们为 WordPress 底层软件栈打上安全补丁,通过暂存环境(staging)和一键还原让核心与插件更新更加安全,默认启用恶意软件扫描和 DDoS 防护,隔离每个站点以防止单点compromise扩散,并自动签发和续订 TLS 证书。这消除了基础设施作为薄弱环节的隐患;而强密码和清理未使用插件等基础安全措施仍需由您负责。