

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 亚马逊 Lightsail 中 WordPress 实例的提示和最佳实践
<a name="amazon-lightsail-wordpress-tips-best-practices"></a>

本指南收集了在 Amazon Lightsail 上保持 WordPress 实例快速、稳定和安全的实用技巧。

## 确保您的网站安全并保持最新状态
<a name="wordpress-keep-secure-and-updated"></a>

### 保持 WordPress主题和插件的更新
<a name="wordpress-keep-updated"></a>
+ 及时应用 WordPress 核心、主题和插件更新。更新通常包括性能和安全补丁。有关更多信息，请参阅通过[更新管理保障 Lightsail 实例和容器的安全](amazon-lightsail-update-management.md)。
+ 移除你不使用的插件和主题。不活跃的插件仍然会增加维护开销和安全面，而写得不好的插件是导致内存使用率高的常见原因。
+ 在将主要更新应用到您的上线网站之前，先在快照启动的实例副本上对其进行测试。

### 在进行更改之前先进行备份
<a name="wordpress-back-up-before-changes"></a>

在编辑配置文件或安装插件之前，请拍摄实例的快照，这样您就可以轻松地从快照中恢复应用程序，以防出现问题：
+ 从 Lightsail 控制台创建手动快照，或者
+ 启用自动快照。

有关说明，请参阅使用快照[备份 Linux/Unix Lightsail 实例和[配置自动](amazon-lightsail-configuring-automatic-snapshots.md)快照](lightsail-how-to-create-a-snapshot-of-your-instance.md)。

## 监控和排查
<a name="wordpress-monitoring-and-troubleshooting"></a>

### 我如何知道我的实例是否已耗尽内存？
<a name="wordpress-detect-out-of-memory"></a>

常见症状包括：
+ 您的站点显示 **“建立数据库连接时出错”**（在公共站点和管理面板上）。这通常意味着MariaDB已经停止。
+ 网站加载缓慢或在流量适中的情况下超时。

要进行确认，请通过 SSH 连接到您的实例并检查当前的内存使用情况：

```
free -m
```

看看下面的`available`专栏`Mem:`。这是您的实例还能使用的内存量。如果低`available`于 **50 MB**，则您的实例将承受沉重的内存压力，并且存在 OOM-killing 进程风险。

你还可以检查内核是否因内存不足而终止了进程（“OOM kill”）：

```
sudo dmesg | grep -i "out of memory"
```

如果您看到提及`mariadbd`或的条目`mysqld`，则说明您的数据库在内存压力下被终止，而[提高内存性能](#wordpress-improve-memory-performance)中的步骤应该会有所帮助。

### 我的实例是否已经有自动内存调整功能？
<a name="wordpress-automatic-memory-tuning"></a>

较新的Lightsail WordPress 蓝图包括一项服务，该服务可检测实例的内存大小，并在每次实例启动时（包括启动或重启实例之后）自动应用本指南中描述的交换、MariaDB和 Apache/PHP 设置。要检查您的实例是否有它，请通过 SSH 连接并运行：

```
systemctl status lightsail-memory-config
```

如果服务存在，则您的实例已自动管理这些设置，您无需手动应用这些设置。如果命令报告找不到该单元，请按照[提高内存性能](#wordpress-improve-memory-performance)中的步骤进行操作。

## 优化性能
<a name="wordpress-optimize-performance"></a>

### 为您的工作负载选择合适的套装
<a name="wordpress-choose-bundle"></a>

提高 WordPress 性能的最有效方法是在具有足够内存容纳工作负载的实例捆绑包上运行。 WordPress 本身是轻量级的；但是插件、主题和数据库可能会消耗大量内存。
+ **512 MB — 1 GB RAM（Lightsail nano 和 micro 实例捆绑包）：**适用于插件最少的小型博客和低流量网站。这些实例最有可能承受内存压力，并且从下面的调整中受益最大。
+ **2 GB 及以上内存：**如果你运行页面生成器（例如 Elementor 或 Divi）或许多活跃的插件 WooCommerce，则推荐使用。

随着站点的增长和需要更多资源，您可以通过[创建快照并从中启动新的更大的实例来升级到更大的](how-to-create-larger-instance-from-snapshot-using-console.md)捆绑包。

### 提高内存性能
<a name="wordpress-improve-memory-performance"></a>

**注意**  
每次实例启动时，较新的 Lightsail WordPress 蓝图都会自动应用大小感知内存调整，因此，如果您要创建新的 Lightsail 实例，则本节中的大多数手动步骤都将由您处理。 WordPress

如果您的网站在您（或您的访客）尝试加载页面时显示 “建立数据库连接时出错”，或者您看到日志消息，表明MariaDB因内存不足而被终止（例如`Out of memory: Killed process ... (mariadbd)`在系统日志中），则您的实例很可能内存不足。在较小的实例中，当内存耗尽时，Linux 内核可能会终止 MariaDB 数据库进程（“OOM 终止”）。

以下三个步骤通过添加交换空间和限制允许数据库和 Web 服务器使用的内存量来减轻内存压力。每个步骤都有其自身的帮助，因此你可以只应用你需要的步骤，也可以全部应用三个步骤以获得最大的效果。在开始之前，请确保您拥有实例的最新快照。有关更多详细信息[，请参见更改前先进行备份](#wordpress-back-up-before-changes)。

**重要**  
这些步骤需要通过 SSH 连接到您的实例并使用运行命令`sudo`。重新启动数据库和 Web 服务器会短暂中断您的站点（几秒钟）；因此，请在流量较低的时段内进行更改。

要连接到您的实例，请在 Lightsail 控制台中使用基于浏览器的 SSH 客户端，或者参阅[连接到您的 Linux 或 Unix](lightsail-how-to-connect-to-your-instance-virtual-private-server.md) 实例。

#### 步骤 1：添加交换文件
<a name="wordpress-add-swap-file"></a>

交换文件为操作系统提供了将非活动内存卸载到磁盘的空间，这有助于防止内存小于大约 1.5 GB 的实例出现内存不足崩溃。我们建议在 nano 或 micro 捆绑包上添加交换，而对于较大的捆绑包，通常不必这样做。

首先，检查交换是否已处于活动状态：

```
cat /proc/swaps
```

如果唯一打印的行是标题（未列出交换条目），则未配置任何交换：

```
Filename                Type        Size       Used    Priority
```

创建一个 650 MB 的交换文件：

```
sudo dd if=/dev/zero of=/mnt/.lightsail.swap bs=1K count=665600 status=progress
sudo chmod 600 /mnt/.lightsail.swap
sudo mkswap /mnt/.lightsail.swap
sudo swapon /mnt/.lightsail.swap
```

要使交换文件在重启后保持不变，请将其添加到`/etc/fstab`：

```
echo '/mnt/.lightsail.swap none swap sw 0 0' | sudo tee -a /etc/fstab
```

确认交换现已激活：

```
cat /proc/swaps
```

交换文件现在出现在输出中：

```
Filename                Type        Size       Used    Priority
/mnt/.lightsail.swap    file        665596     0       -2
```

#### 第 2 步：调整 MariaDB 数据库
<a name="wordpress-tune-mariadb"></a>

`innodb_buffer_pool_size`是 MariaDB 中最大的单内存使用者。如果默认池大小与实例内存相比过大，则可能导致内存不足崩溃。

从推荐的[配置表中找到`innodb_buffer_pool_size`适合您的实例的推荐](#wordpress-recommended-memory-values)值，然后使用该值创建一个专用配置文件（在示例`16M`中用您的值替换）：

```
sudo tee /etc/mysql/mariadb.conf.d/90-lightsail-memory.cnf > /dev/null <<'EOF'
[mysqld]
innodb_buffer_pool_size = 16M
EOF
```

要执行更改，请运行以下命令来重新启动数据库：

```
sudo systemctl restart mariadb
```

#### 第 3 步：调整 Apache 和 PHP
<a name="wordpress-tune-apache-php"></a>

Apache 是处理您的 WordPress 网站传入请求的 Web 服务器。默认情况下，它允许多达 150 个同步工作进程 (`MaxRequestWorkers`)。在一个小例子中，每个 PHP 工作程序可以使用数十兆字节，这可能会在负载下耗尽内存。要限制与您的实例匹配的工作程序数量，并限制单个 PHP 请求可能使用的内存量，请设置 Apache `mpm_prefork` 限制（显示的值适用于微型实例；请查看您的实例的[推荐配置表](#wordpress-recommended-memory-values)）：

```
sudo tee /etc/apache2/mods-available/mpm_prefork.conf > /dev/null <<'EOF'
<IfModule mpm_prefork_module>
    StartServers            1
    MinSpareServers         1
    MaxSpareServers         3
    MaxRequestWorkers       5
    MaxConnectionsPerChild  5000
</IfModule>
EOF
```

设置 PHP`memory_limit`（512 MB 是所有大小的安全上限）。首先检测你的 PHP 版本，然后写下配置文件：

```
PHP_VERSION=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')
sudo mkdir -p /etc/php/${PHP_VERSION}/apache2/conf.d
sudo tee /etc/php/${PHP_VERSION}/apache2/conf.d/90-lightsail-memory.ini > /dev/null <<'EOF'
memory_limit = 512M
EOF
```

通过重新启动 Apache 来应用这两个更改：

```
sudo systemctl restart apache2
```

#### 按实例内存划分的推荐值
<a name="wordpress-recommended-memory-values"></a>

根据您的实例的总内存使用以下值。要检查您的实例的内存，请运行`free -m`并查看该`total`列，或者在 Lightsail 控制台中参考您的捆绑包大小。


**按实例 RAM 划分的推荐内存配置**  

|  实例内存 (RAM)  |  MariaDB `innodb_buffer_pool_size`  |  Apache `MaxRequestWorkers`  |  PHP `memory_limit`  |  交换文件  | 
| --- | --- | --- | --- | --- | 
| 最大 1.5 GB | 16M | 5 | 512M | 是的 (650 MB) | 
| 大约 1.5—3 GB | 256M | 10 | 512M | 否 | 
| 大约 3—6 GB | 256M | 25 | 512M | 否 | 
| 大约 6—13 GB | 2048 米 | 50 | 512M | 否 | 
| \~13—26 GB | 2048 米 | 125 | 512M | 否 | 
| 超过大约 26 GB | 4096M | 250 | 512M | 否 | 

### 使用缓存来减少负载
<a name="wordpress-use-caching"></a>

缓存减少了查询数据库和运行 PHP 的频 WordPress 率，从而降低了 CPU 和内存使用量：
+ **页面缓存：**安装缓存插件，例如 W3 Total Cache 或 WP Super Cache，以提供页面的静态副本。
+ **对象缓存：**如果您的网站有许多登录用户、[正在运行 WooCommerce或使用经常变化的动态内容（例如论坛或会员专区），则对象缓存插件（例如 Redis Object APCu-based Cache 或缓存](https://wordpress.org/plugins/redis-cache/)）会将经常使用的查询结果存储在内存中，并减少重复的数据库查找。
+ **内容分发网络 (CDN)：**[将静态资产（图像、CSS JavaScript）卸载到诸如 Lightsail Distribution 之类的 CDN，这样您的](amazon-lightsail-creating-content-delivery-network-distribution.md)实例就不会为它们提供服务。