← 返回博客

博客

Docker for WordPress:为什么隔离容器改变一切

一个客户无法破坏另一个客户。一个站点无法感染另一个站点。这就是 PAGEnza 托管平台的架构。

传统的 WordPress 托管将多个站点放在同一个服务器上。它们共享 PHP,共享文件系统访问,并且经常共享数据库服务器。这在正常情况下没问题——但一旦出现问题,就会成为一个严重的问题。

PAGEnza 在其自己的 Docker 容器中配置每个 WordPress 站点。本文将解释这在实践中意味着什么,以及它对于管理多个客户站点的代理机构来说为什么很重要。

共享托管问题

在典型的共享托管计划或甚至带有多个 WordPress 安装的基本 VPS 上:

资源争用:一个站点流量激增会导致服务器上的所有其他站点变慢。站点 A 上一个优化不佳的插件会降低站点 B 的性能。

安全泄露:如果一个 WordPress 安装被攻破——通过易受攻击的插件、弱密码或过时的核心版本——攻击者一旦获得文件系统访问权限,通常就可以读取同一服务器上其他站点的文件。

PHP 版本冲突:站点 A 需要 PHP 7.4 来运行一个旧插件。站点 B 需要 PHP 8.2 来运行一个新插件。在共享托管上,你只能选择一个。

数据库暴露:共享数据库服务器意味着一个配置错误的权限可能会暴露其他站点的数据。

Docker 容器在基础设施层面解决了所有这些问题。

容器到底是什么

Docker 容器是一个轻量级的、隔离的进程,它拥有自己的:

  • 文件系统(容器无法看到其边界之外的文件)
  • 网络堆栈(自己的 IP 地址,自己的端口)
  • 进程空间(无法看到其他容器的进程)
  • 资源限制(CPU 和内存上限)

它与其他容器共享主机内核,但内核之上的所有内容都是隔离的。它不是一个完整的虚拟机——它在几秒钟内启动,而不是几分钟,并且消耗的资源要少得多。

对于 WordPress,单个容器运行:Nginx、PHP-FPM 和 WordPress 文件。数据库运行在单独的容器中,仅连接到该特定的 WordPress 容器。

PAGEnza 如何配置站点

当你在 PAGEnza 中创建一个新的客户站点时,会发生以下情况,耗时不到 45 秒:

  1. 从基础 WordPress 镜像启动一个新的 Docker 容器
  2. WordPress 配置一个在共享 MariaDB 实例上的新数据库(该数据库仅限于该容器的凭据)
  3. PAGEnza 插件自动安装并激活
  4. 使用客户的子域配置 Nginx 虚拟主机
  5. 通过 Let's Encrypt 颁发 SSL 证书
  6. 在反向代理中注册容器并设置正确的路由规则

客户将获得一个类似 clientname.pagenza.com 的 URL,该 URL 在点击“创建站点”后的 45 秒内即可上线。无需手动服务器配置,无需 SSH,无需等待 DNS(针对子域——自定义域 DNS 传播是分开的)。

容器隔离的实践

内存限制:每个容器都有可配置的内存上限。如果一个失控的插件导致一个客户站点的内存激增,它无法消耗分配给其他容器的内存。该站点可能会变慢或返回 503 错误——但不会影响其他客户。

文件系统隔离:客户 A 的 WordPress 文件对客户 B 的容器完全不可见。客户 A 站点上的一个被攻破的插件无法访问客户 B 的文件。

网络隔离:容器仅通过定义的网络桥接进行通信。客户 A 的数据库容器仅接受来自客户 A 的 WordPress 容器的连接——而不是来自系统上的任何其他容器。

每个容器的 PHP:由于每个容器运行自己的 PHP-FPM 实例,因此你可以为不同的客户运行不同的 PHP 版本。需要 PHP 7.4 的客户 A 的旧插件可以与需要 PHP 8.2 的客户 B 的现代堆栈并行运行。

自定义域

默认设置会为每个客户提供一个 *.pagenza.com 子域。对于希望使用自己域名的客户,流程如下:

  1. 客户将其域名的 A 记录指向 PAGEnza 服务器 IP
  2. 在 PAGEnza 仪表板中,输入自定义域名
  3. 反向代理配置会自动更新
  4. 通过 Let's Encrypt 为自定义域名颁发 SSL 证书

WordPress 的 siteurlhome 选项会更新以匹配。从客户的角度来看,他们的站点在自己的域名下正常运行——没有重定向,访客看不到子域。

这对代理机构意味着什么

对于运行多个客户站点的代理机构来说,实际的好处是:

入驻速度:配置新客户站点不到一分钟。无需服务器设置,无需 cPanel,无需手动安装 WordPress。

客户隔离:每个客户的站点都是真正隔离的。安装了有问题插件的客户只会影响他们自己的站点。

可扩展性:添加新客户不需要配置新服务器。容器基础设施会根据主机的容量进行扩展,而增加容量只是添加更多主机节点的问题。

灾难恢复:由于每个站点都经过容器化,备份和恢复在容器级别进行。恢复单个客户的站点不会影响任何其他客户。

权衡是容器托管的每个站点的成本高于共享托管。但对于那些站点可靠性和客户隔离是不可谈判的代理机构来说,经济效益是可行的——尤其是考虑到配置时间的节省。