

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

# AL2 教程
<a name="al2-tutorials"></a>

 以下教程向您展示了如何使用正在运行的 Amazon EC2 实例执行常见任务 AL2。有关视频教程，请参阅 [AWS 教学视频和实验](https://www.aws.training/)。

有关 AL2023 说明，请参阅*亚马逊 Linux 2023 用户指南*中的[教程](https://docs.aws.amazon.com/linux/al2023/ug/tutorials-al2023.html)。

**Topics**
+ [教程：在上安装 LAMP 服务器 AL2](ec2-lamp-amazon-linux-2.md)
+ [教程： SSL/TLS 开启配置 AL2](SSL-on-amazon-linux-2.md)
+ [教程：在上发布 WordPress 博客 AL2](hosting-wordpress.md)

# 教程：在上安装 LAMP 服务器 AL2
<a name="ec2-lamp-amazon-linux-2"></a>

以下过程可帮助您在 AL2 您的实例（有时称为 LAMP 网络服务器或 LAMP 堆栈）上安装支持 PHP 和 M [ar](https://mariadb.org/about/) iaDB（社区开发的 MySQL 分支）的 Apache 网络服务器。您可以使用此服务器来托管静态网站或部署能对数据库中的信息执行读写操作的动态 PHP 应用程序。

**重要**  
如果您尝试在其他发行版（例如 Ubuntu 或红帽企业 Linux）上设置 LAMP Web 服务器，则本教程不适合。有关信息 AL2023，请参阅[在上安装 LAMP 服务器 AL2023](https://docs.aws.amazon.com//linux/al2023/ug/ec2-lamp-amazon-linux-2023.html)。[对于 Ubuntu，请参阅以下 Ubuntu 社区文档：SQLPHP。ApacheMy](https://help.ubuntu.com/community/ApacheMySQLPHP)有关其他发布版本，请参阅特定于该版本的文档。

**选项：使用 Automation 完成本教程**  
要使用 AWS Systems Manager 自动化而不是以下任务来完成本教程，请运行 [AWS Docs-Install-ALAMPServer](https://console.aws.amazon.com/systems-manager/automation/execute/AWSDocs-InstallALAMPServer-AL2) A AL2 utomation 文档。

**Topics**
+ [步骤 1：准备 LAMP 服务器](#prepare-lamp-server)
+ [步骤 2：测试 LAMP 服务器](#test-lamp-server)
+ [步骤 3：确保数据库服务器的安全](#secure-mariadb-lamp-server)
+ [步骤 4：（可选）安装 phpMyAdmin](#install-phpmyadmin-lamp-server)
+ [故障排除](#lamp-troubleshooting)
+ [相关主题](#lamp-more-info)

## 步骤 1：准备 LAMP 服务器
<a name="prepare-lamp-server"></a>

**先决条件**
+ 本教程假设您已经使用 AL2一个可从互联网访问的公有 DNS 名称启动了一个新实例。有关更多信息，请参阅*《Amazon EC2 用户指南》*中的[启动实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-instance-wizard.html)。您还必须配置安全组，以便允许 SSH (端口 22)、HTTP (端口 80) 和 HTTPS (端口 443) 连接。有关这些先决条件的更多信息，请参阅 *Amazon EC2 用户指南*中的[安全组规则](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules.html)。
+ 以下过程将安装当前可用的最新 PHP 版本`php8.2`。 AL2如果您计划使用本教程中所述的 PHP 应用程序之外的 PHP 应用程序，则应检查其与 `php8.2` 的兼容性。<a name="install_apache-2"></a>

**准备 LAMP 服务器**

1. [连接到您的 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-to-linux-instance.html)。

1. 为确保您的所有软件包都处于最新状态，请对您的实例执行快速软件更新。此过程可能需要几分钟的时间，但必须确保您拥有最新的安全更新和缺陷修复。

   `-y` 选项安装更新时不提示确认。如果您希望在安装前检查更新，则可以忽略该选项。

   ```
   [ec2-user ~]$ sudo yum update -y
   ```

1. 安装 `mariadb10.5` Amazon Linux Extras 存储库，以获取 MariaDB 程序包的最新版本。

   ```
   [ec2-user ~]$ sudo amazon-linux-extras install mariadb10.5
   ```

   如果您收到指示 `sudo: amazon-linux-extras: command not found` 的错误，则表示您的实例未与 Amazon Linux 2 AMI 一起启动（也许您可以改用 Amazon Linux AMI）。您可以使用以下命令查看 Amazon Linux 的版本。

   ```
   cat /etc/system-release
   ```

1. 安装 `php8.2` Amazon Linux Extras 存储库以获取最新版本的PHP软件包 AL2。

   ```
   [ec2-user ~]$ sudo amazon-linux-extras install php8.2
   ```

1. 现在您的实例处于最新状态，您可以安装 Apache Web 服务器、MariaDB 和 PHP 软件包。使用 yum 安装命令可同时安装多个软件包和所有相关依赖项

   ```
   [ec2-user ~]$ sudo yum install -y httpd
   ```

   您可以使用以下命令查看这些程序包的当前版本：

   ```
   yum info package_name
   ```

1. 启动 Apache Web 服务器。

   ```
   [ec2-user ~]$ sudo systemctl start httpd
   ```

1.  使用 **systemctl** 命令配置 Apache Web 服务器，使其在每次系统启动时启动。

   ```
   [ec2-user ~]$ sudo systemctl enable httpd
   ```

   您可以通过运行以下命令验证 **httpd** 是否已启用：

   ```
   [ec2-user ~]$ sudo systemctl is-enabled httpd
   ```

1. 如果您尚未这样做，请添加安全规则以允许与您的实例的入站 HTTP (端口 80) 连接。默认情况下，在初**始化期间为您的实例设置了启动向导*N***安全组。此组包含一条允许 SSH 连接的规则。

   1. 打开位于 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 的 Amazon EC2 控制台。

   1. 选择 **Instances** 并选择您的实例。

   1. 在**安全**选项卡上，查看入站规则。您应看到以下规则：

      ```
      Port range   Protocol     Source
      22           tcp          0.0.0.0/0
      ```
**警告**  
使用`0.0.0.0/0`允许所有 IPv4 地址通过 SSH 访问您的实例。这在测试环境中可以接受一小段时间，但是在生产环境中并不安全。在生产环境中，您仅授权特定 IP 地址或地址范围访问您的实例。

   1. 选择安全组的链接。使用[向安全组添加规则](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/working-with-security-groups.html#adding-security-group-rule)中的步骤，添加具有以下值的新入站安全规则：
      + **类型**：HTTP
      + **协议**：TCP
      + **Port Range**：80
      + **Source**：Custom

1. 测试您的 Web 服务器。在 Web 浏览器中，键入您的实例的公有 DNS 地址 (或公有 IP 地址)。如果 `/var/www/html` 中没有内容，您应该会看到 Apache 测试页面。您可以使用 Amazon EC2 控制台获取实例的公有 DNS（选中 **Public DNS (公有 DNS)** 列；如果此列处于隐藏状态，请选择 **Show/Hide Columns (显示/隐藏列)**（齿轮状图标）并选择 **Public DNS (公有 DNS)**）。

   验证实例的安全组是否包含允许端口 80 上的 HTTP 流量的规则。更多信息，请参阅[向安全组添加规则](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/working-with-security-groups.html#adding-security-group-rule)。
**重要**  
如果您使用的不是 Amazon Linux，则还可能需要在实例上配置防火墙才能允许这些连接。有关如何配置防火墙的更多信息，请参阅适用于特定分配的文档。  
![\[服务器测试显示 Apache 测试页面。\]](http://docs.aws.amazon.com/zh_cn/linux/al2/ug/images/apache_test_page_al2_2.4.png)

Apache **httpd** 提供的文件保存在名为 Apache 文档根目录的目录中。Amazon Linux Apache 文档根目录为 `/var/www/html`，默认情况下归根用户所有。

要允许 `ec2-user` 账户操作此目录中的文件，必须修改其所有权和权限。有多种方式可以完成此任务。在本教程中，可将 `ec2-user` 添加到 `apache` 组，将 `/var/www` 目录的所有权授予 `apache` 组，并为该组指定写入权限。<a name="setting-file-permissions-2"></a>

**设置文件权限**

1. 将您的用户 (这里指 `ec2-user`) 添加到 `apache`。

   ```
   [ec2-user ~]$ sudo usermod -a -G apache ec2-user
   ```

1. 先退出再重新登录以选取新组，然后验证您的成员资格。

   1. 退出（使用 **exit** 命令或关闭终端窗口）：

      ```
      [ec2-user ~]$ exit
      ```

   1. 要验证您是否为 `apache` 组的成员，请重新连接到实例，然后运行以下命令：

      ```
      [ec2-user ~]$ groups
      ec2-user adm wheel apache systemd-journal
      ```

1. 将 `/var/www` 及其内容的组所有权更改到 `apache` 组。

   ```
   [ec2-user ~]$ sudo chown -R ec2-user:apache /var/www
   ```

1. 要添加组写入权限以及设置未来子目录上的组 ID，请更改 `/var/www` 及其子目录的目录权限。

   ```
   [ec2-user ~]$ sudo chmod 2775 /var/www && find /var/www -type d -exec sudo chmod 2775 {} \;
   ```

1. 要添加组写入权限，请递归地更改 `/var/www` 及其子目录的文件权限：

   ```
   [ec2-user ~]$ find /var/www -type f -exec sudo chmod 0664 {} \;
   ```

这样，`ec2-user` (和 `apache` 组的任何未来成员) 可以添加、删除和编辑 Apache 文档根目录中的文件，允许您添加内容，如静态网站或 PHP 应用程序。

**保护您的 Web 服务器 (可选)**  
运行 HTTP 协议的 Web 服务器不为其发送或接收的数据提供传输安全。当您使用 Web 浏览器连接到 HTTP 服务器时，网络路径上任何地方的窃听者都可以看到您访问的内容、收到的网页内容以及您提交的任何 HTML 表单的内容（包括密码）。 URLs 保护您的 Web 服务器的最佳实践是安装 HTTPS (HTTP Secure) 支持，它将使用 SSL/TLS 加密保护您的数据。

有关在服务器上启用 HTTPS 的信息，请参阅 [教程： SSL/TLS 开启配置 AL2](SSL-on-amazon-linux-2.md)。

## 步骤 2：测试 LAMP 服务器
<a name="test-lamp-server"></a>

如果服务器已安装并运行，且文件权限设置正确，则 `ec2-user` 账户应该能够在 `/var/www/html` 目录 (可从 Internet 访问) 中创建 PHP 文件。

**测试您的 LAMP 服务器**

1. 在 Apache 文档根目录中创建一个 PHP 文件。

   ```
   [ec2-user ~]$ echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php
   ```

   尝试运行该命令时，如果出现“Permission denied (权限被拒绝)”错误，请尝试先注销，再重新登录，以获取您在 [设置文件权限](#setting-file-permissions-2) 中配置的适当组权限。

1. 在 Web 浏览器中，键入您刚刚创建的文件的 URL。此 URL 是实例的公用 DNS 地址，后接正斜杠和文件名。例如：

   ```
   http://my.public.dns.amazonaws.com/phpinfo.php
   ```

   您应该会看到 PHP 信息页面：  
![\[LAMP 服务器测试显示 PHP 信息页面。\]](http://docs.aws.amazon.com/zh_cn/linux/al2/ug/images/phpinfo7.2.10.png)

   如果您未看到此页面，请验证上一步中是否已正确创建 `/var/www/html/phpinfo.php` 文件。您还可以使用以下命令验证已经安装了所有必需的程序包。

   ```
   [ec2-user ~]$ sudo yum list installed httpd mariadb-server php-mysqlnd
   ```

   如果输出中未列出任何必需的程序包，请使用 **sudo yum install *package*** 命令安装它们。另请验证在 `php7.2` 命令的输出中启用了 `lamp-mariadb10.2-php7.2` 和 **amazon-linux-extras** Extras。

1. 删除 `phpinfo.php` 文件。尽管此信息可能很有用，但出于安全考虑，不应将其传播到 Internet。

   ```
   [ec2-user ~]$ rm /var/www/html/phpinfo.php
   ```

现在，您应该有了一个功能完善的 LAMP Web 服务器。如果您将内容添加到 Apache 文档根目录 (位于 `/var/www/html`)，您应该能够在您的实例的公有 DNS 地址中看到该内容。

## 步骤 3：确保数据库服务器的安全
<a name="secure-mariadb-lamp-server"></a>

MariaDB 服务器的默认安装提供有多种功能，这些功能对于测试和开发都很有帮助，但对于产品服务器，应禁用或删除这些功能。**mysql\$1secure\$1installation** 命令可引导您设置根密码并删除安装中的不安全功能。即使您不打算使用 MariaDB 服务器，我们也建议执行此步骤。<a name="securing-maria-db"></a>

**保护 MariaDB 服务器**

1. 启动 MariaDB 服务器。

   ```
   [ec2-user ~]$ sudo systemctl start mariadb
   ```

1. 运行 **mysql\$1secure\$1installation**。

   ```
   [ec2-user ~]$ sudo mysql_secure_installation
   ```

   1. 在提示时，键入根账户的密码。

      1. 键入当前根密码。默认情况下，根账户没有设置密码。按 Enter。

      1. 键入 **Y** 设置密码，然后键入两次安全密码。有关创建安全密码的更多信息，请参阅[https://identitysafe.norton.com/password-generator/](https://identitysafe.norton.com/password-generator/)。确保将此密码存储在安全位置。

         设置 MariaDB 根密码仅是保护数据库的最基本措施。在您构建或安装数据库驱动的应用程序时，您通常可以为该应用程序创建数据库服务用户，并避免使用根账户执行除数据库管理以外的操作。

   1. 键入 **Y** 删除匿名用户账户。

   1. 键入 **Y** 禁用远程根登录。

   1. 键入 **Y** 删除测试数据库。

   1. 键入 **Y** 重新加载权限表并保存您的更改。

1. (可选) 如果您不打算立即使用 MariaDB 服务器，请停止它。您可以在需要时再次重新启动。

   ```
   [ec2-user ~]$ sudo systemctl stop mariadb
   ```

1. (可选) 如果您希望每次启动时 MariaDB 服务器都启动，请键入以下命令。

   ```
   [ec2-user ~]$ sudo systemctl enable mariadb
   ```

## 步骤 4：（可选）安装 phpMyAdmin
<a name="install-phpmyadmin-lamp-server"></a>

[phpMyAdmin](https://www.phpmyadmin.net/)是一款基于 Web 的数据库管理工具，可用于查看和编辑 EC2 实例上的 MySQL 数据库。按照下述步骤操作，在您的 Amazon Linux 实例上安装和配置 `phpMyAdmin`。

**重要**  
除非您已在 Apache SSL/TLS 中启用，否则我们不建议使用`phpMyAdmin`来访问 LAMP 服务器；否则，您的数据库管理员密码和其他数据将不安全地通过 Internet 传输。有关开发人员提出的安全建议，请参阅[保护您的 phpMyAdmin 安装](https://docs.phpmyadmin.net/en/latest/setup.html#securing-your-phpmyadmin-installation)。有关在 EC2 实例上保护 Web 服务器的一般信息，请参阅 [教程： SSL/TLS 开启配置 AL2](SSL-on-amazon-linux-2.md)。

**要安装 phpMyAdmin**

1. 安装所需的依赖项。

   ```
   [ec2-user ~]$ sudo yum install php-mbstring php-xml -y
   ```

1. 重启 Apache。

   ```
   [ec2-user ~]$ sudo systemctl restart httpd
   ```

1. 重启 `php-fpm`。

   ```
   [ec2-user ~]$ sudo systemctl restart php-fpm
   ```

1. 导航到位于 `/var/www/html` 的 Apache 文档根。

   ```
   [ec2-user ~]$ cd /var/www/html
   ```

1. 从 [https://www.phpmyadmin.net/downloads](https://www.phpmyadmin.net/downloads) 选择最新 phpMyAdmin 版本的源软件包。要将文件直接下载到您的实例，请复制链接并将其粘贴到 **wget** 命令，如本示例中所述：

   ```
   [ec2-user html]$ wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz
   ```

1. 使用以下命令创建 `phpMyAdmin` 文件夹并将程序包提取到其中。

   ```
   [ec2-user html]$ mkdir phpMyAdmin && tar -xvzf phpMyAdmin-latest-all-languages.tar.gz -C phpMyAdmin --strip-components 1
   ```

1. 删除*phpMyAdmin-latest-all-languages.tar.gz*压缩包。

   ```
   [ec2-user html]$ rm phpMyAdmin-latest-all-languages.tar.gz
   ```

1.  (可选) 如果 MySQL 服务器未运行，请立即启动它。

   ```
   [ec2-user ~]$ sudo systemctl start mariadb
   ```

1. 在 Web 浏览器中，键入 phpMyAdmin 安装的 URL。此 URL 是实例的公有 DNS 地址 (或公有 IP 地址)，后接正斜杠和您安装目录的名称。例如：

   ```
   http://my.public.dns.amazonaws.com/phpMyAdmin
   ```

   你应该会看到 phpMyAdmin 登录页面：  
![\[键入 phpMyAdmin 安装的 URL 的结果是 phpMyAdmin 登录屏幕。\]](http://docs.aws.amazon.com/zh_cn/linux/al2/ug/images/phpmyadmin_login.png)

1. 使用您之前创建的`root`用户名和 MySQL 根密码登录您的 phpMyAdmin 安装。

   您的安装仍需进行配置，然后才能投入使用。我们建议您首先手动创建配置文件，如下所示：

   1. 要从最小的配置文件开始，请使用您常用的文本编辑器创建一个新文件，然后将 `config.sample.inc.php` 的内容复制到该文件中。

   1. 将文件另存为`config.inc.php`包含的 phpMyAdmin 目录中`index.php`。

   1. 有关任何其他设置，请参阅安装说明的 [“使用 phpMyAdmin 安装脚本](https://docs.phpmyadmin.net/en/latest/setup.html#using-the-setup-script)” 部分中的文件创建后说明。

    有关使用的信息 phpMyAdmin，请参阅《[phpMyAdmin 用户指南》](http://docs.phpmyadmin.net/en/latest/user.html)。

## 故障排除
<a name="lamp-troubleshooting"></a>

本部分提供了解决在设置新 LAMP 服务器时可能遇到的常见问题的建议。

### 我无法使用 Web 浏览器连接到我的服务器
<a name="is_apache_on"></a>

执行以下检查以查看您的 Apache Web 服务器是否正在运行且可以访问。
+ **Web 服务器正在运行吗？**

  您可以通过运行以下命令验证 **httpd** 是否已启用：

  ```
  [ec2-user ~]$ sudo systemctl is-enabled httpd
  ```

  如果 **httpd** 进程未运行，请重复[准备 LAMP 服务器](#install_apache-2)中描述的步骤。
+ **防火墙是否配置正确？**

  验证实例的安全组是否包含允许端口 80 上的 HTTP 流量的规则。更多信息，请参阅[向安全组添加规则](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/working-with-security-groups.html#adding-security-group-rule)。

### 我无法使用 HTTPS 连接到我的服务器
<a name="is-https-enabled"></a>

执行以下检查以查看 Apache Web 服务器是否配置为支持 HTTPS。
+ **Web 服务器配置是否正确？**

  安装 Apache 后，服务器将针对 HTTP 流量进行配置。要支持 HTTPS，请在服务器上启用 TLS 并安装 SSL 证书。有关信息，请参阅 [教程： SSL/TLS 开启配置 AL2](SSL-on-amazon-linux-2.md)。
+ **防火墙是否配置正确？**

  验证实例的安全组是否包含允许端口 443 上的 HTTPS 流量的规则。有关更多信息，请参阅[向安全组添加规则](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/working-with-security-groups.html#adding-security-group-rule)。

## 相关主题
<a name="lamp-more-info"></a>

有关将文件传输到您的实例或在 Web 服务器上安装 WordPress 博客的更多信息，请参阅以下文档：
+ [使用将文件传输到您的 Linux 实例WinSCP](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/putty.html#Transfer_WinSCP)。
+ [使用SCP客户端将文件传输到 Linux 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-linux-inst-ssh.html#linux-file-transfer-scp)。
+ [教程：在上发布 WordPress 博客 AL2](hosting-wordpress.md)

有关本教程中使用的命令和软件的更多信息，请参阅以下网页：
+ Apache Web 服务器：[http://httpd.apache.org/](http://httpd.apache.org/)
+ MariaDB 数据库服务器：[https://mariadb.org/](https://mariadb.org/)
+ PHP 编程语言：[http://php.net/](http://php.net/)
+ `chmod`命令：[https://en.wikipedia。 org/wiki/Chmod](https://en.wikipedia.org/wiki/Chmod)
+ `chown`命令：[https://en.wikipedia。 org/wiki/Chown](https://en.wikipedia.org/wiki/Chown)

有关注册 Web 服务器域名或将现有域名转移到此主机的更多信息，请参阅 *Amazon Route 53 开发人员指南*中的[创建域和子域并将其迁移到 Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/creating-migrating.html)。

# 教程： SSL/TLS 开启配置 AL2
<a name="SSL-on-amazon-linux-2"></a>

安全套接字 Layer/Transport 层安全（SSL/TLS) creates an encrypted channel between a web server and web client that protects data in transit from being eavesdropped on. This tutorial explains how to add support manually for SSL/TLS在带有 AL2 Apache Web 服务器的 EC2 实例上。本教程假定您未使用负载均衡器。如果您正在使用 Elastic Load Balancing，则可以选择使用来自 [AWS Certificate Manager](https://aws.amazon.com/certificate-manager/) 的证书在负载均衡器上配置 SSL 卸载。

由于历史原因，Web 加密通常简称为 SSL。虽然 Web 浏览器仍支持 TLS，但下一代协议 TLS 不容易受到攻击。默认情况下， AL2 为所有版本的 SSL 禁用服务器端支持。[安全标准机构](https://www.ssl.com/article/deprecating-early-tls/)认为 TLS 1.0 不安全。TLS 1.0 和 TLS 1.1 已于 2021 年 3 月正式[弃用](https://datatracker.ietf.org/doc/rfc8996/)。本教程仅包含有关启用 TLS 1.2 的指导。TLS 1.3 已于 2018 年完成， AL2 只要支持和启用底层 TLS 库（本教程中的 OpenSSL），即可使用。[客户端必须在 2023 年 6 月 28 日之前支持 TLS 1.2 或更高版本](https://aws.amazon.com/blogs/security/tls-1-2-required-for-aws-endpoints/)。有关更新的加密标准的更多信息，请参阅 [RFC 7568](https://tools.ietf.org/html/rfc7568) 和 [RFC 8446](https://tools.ietf.org/html/rfc8446)。

在本教程中，将现代 Web 加密简称为 TLS。

**重要**  
这些程序旨在与 AL2 一起使用。我们还假定您从新的 Amazon EC2 实例开始。如果您正在尝试设置运行不同分配的 EC2 实例，或者设置运行旧版本的实例 AL2，则本教程中的某些步骤可能无法运行。对于 Ubuntu，请参阅以下社区文档：[Open SSL on Ubuntu](https://help.ubuntu.com/community/OpenSSL)。有关 Red Hat Enterprise Linux 的信息，请参阅以下：[设置 Apache HTTP Web 服务器](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/deploying_different_types_of_servers/setting-apache-http-server_deploying-different-types-of-servers)。有关其他发布版本，请参阅特定于该版本的文档。

**注意**  
或者，您可以将 AWS Certificate Manager (ACM) 用于 AWS Nitro 安全区，这是一种安全区应用程序，允许您在带有 Nitro Enclaves 的 Amazon EC2 实例上运行的 Web 应用程序和服务器上使用公有和私有 SSL/TLS 证书。 AWS Nitro Enclaves 是一项 Amazon EC2 功能，它允许创建隔离的计算环境，以保护和安全地处理高度敏感的数据，例如 SSL/TLS 证书和私钥。  
适用于 Nitro Enclaves 的 ACM 与运行在 Amazon EC2 Linux 实例上的 **nginx** 结合使用，以创建私有密钥、分发证书和私有密钥以及管理证书续订。  
要使用适用于 Nitro Enclaves 的 ACM，必须使用启用了 Enclave 的 Linux 实例。  
有关更多信息，请参阅[什么是 AWS 硝基飞地](https://docs.aws.amazon.com/enclaves/latest/user/nitro-enclave.html)？ 以及[AWS Certificate Manager 《Nitro Enclaves](https://docs.aws.amazon.com/enclaves/latest/user/nitro-enclave-refapp.html) 用户指南》中的 *AWS Nitro* Enclaves。

**Topics**
+ [前提条件](#ssl_prereq)
+ [步骤 1：在服务器上启用 TLS](#ssl_enable)
+ [步骤 2：获取 CA 签名的证书](#ssl_certificate)
+ [步骤 3：测试和强化安全配置](#ssl_test)
+ [故障排除](#troubleshooting)

## 前提条件
<a name="ssl_prereq"></a>

在开始本教程之前，请完成以下步骤：
+ 启动由 Amazon EBS 支持的 AL2 实例。有关更多信息，请参阅*《Amazon EC2 用户指南》*中的[启动实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-instance-wizard.html)。
+ 配置安全组以允许您的实例接受以下 TCP 端口上的连接：
  + SSH (端口 22)
  + HTTP (端口 80)
  + HTTPS (端口 443)

  有关更多信息，请参阅《Amazon EC2 用户指南》**中的[安全组规则](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules.html)。
+ 安装 Apache Web 服务器。有关 step-by-step说明，请参阅[教程：在上安装 LAMP Web 服务器 AL2](ec2-lamp-amazon-linux-2.md)。仅需要 httpd 包及其依赖项，因此可以忽略涉及 PHP 和 MariaDB 的说明。
+ 要识别和验证网站，TLS 公有密钥基础设施 (PKI) 依赖于域名系统 (DNS)。要使用 EC2 实例托管公共网站，您需要为 Web 服务器注册一个域名，或者将现有域名转让给您的 Amazon EC2 主机。可通过很多第三方域注册和 DNS 托管服务来执行此操作，也可以使用 [Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html) 执行此操作。

## 步骤 1：在服务器上启用 TLS
<a name="ssl_enable"></a>

**选项：使用 Automation 完成本教程**  
要使用 AWS Systems Manager 自动化而不是以下任务来完成本教程，请运行[自动化文档](https://console.aws.amazon.com/systems-manager/documents/AWSDocs-Configure-SSL-TLS-AL2/)。

此过程将引导您完成 AL2 使用自签名数字证书设置 TLS 的过程。

**注意**  
自签名证书对于测试是可接受的，但对于生产不是。如果您将自签名证书公开到 Internet，您网站的访客将会看到安全警告。

**在服务器上启用 TLS**

1. [连接到您的实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-to-linux-instance.html)并确认 Apache 正在运行。

   ```
   [ec2-user ~]$ sudo systemctl is-enabled httpd
   ```

   如果返回的值不是“启用”，则启动 Apache 并将它设置为每次随系统一起启动。

   ```
   [ec2-user ~]$ sudo systemctl start httpd && sudo systemctl enable httpd
   ```

1. 为确保您的所有软件包都处于最新状态，请对您的实例执行快速软件更新。此过程可能需要几分钟的时间，但必须确保您拥有最新的安全更新和缺陷修复。
**注意**  
`-y` 选项安装更新时不提示确认。如果您希望在安装前检查更新，则可以忽略该选项。

   ```
   [ec2-user ~]$ sudo yum update -y
   ```

1. 现在，您的实例是最新的，请安装 Apache 模块 `mod_ssl` 以添加 TLS 支持。

   ```
   [ec2-user ~]$ sudo yum install -y mod_ssl
   ```

   您的实例现在具有以下文件，可使用这些文件配置安全服务器并创建证书以进行测试：
   +  `/etc/httpd/conf.d/ssl.conf` 

     mod\$1ssl 的配置文件。它包含一些*指令* 以指示 Apache 在何处查找以下信息：加密密钥和证书、要允许的 TLS 协议版本以及要接受的加密密码。
   + `/etc/pki/tls/certs/make-dummy-cert`

     用于为服务器主机生成自签名 X.509 证书和私有密钥的脚本。要测试是否正确设置 Apache 以使用 TLS，该证书是非常有用的。由于不提供身份证明，因此，不应在生产环境中使用该证书。如果在生产环境中使用该证书，则将在 Web 浏览器中触发警告。

1. 运行脚本以生成自签名虚拟证书和密钥以进行测试。

   ```
   [ec2-user ~]$ cd /etc/pki/tls/certs
   sudo ./make-dummy-cert localhost.crt
   ```

   这会在 `/etc/pki/tls/certs/` 目录中生成一个新文件 `localhost.crt`。指定的文件名与 `/etc/httpd/conf.d/ssl.conf` 中的 **SSLCertificateFile** 指令指定的默认值匹配。

   该文件包含自签名证书以及证书的私有密钥。Apache 要求证书和密钥采用 PEM 格式，其中包含 Base64 编码的 ASCII 字符，并用“BEGIN”和“END”行框起来，如以下简短示例所示。

   ```
   -----BEGIN PRIVATE KEY-----
   MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQD2KKx/8Zk94m1q
   3gQMZF9ZN66Ls19+3tHAgQ5Fpo9KJDhzLjOOCI8u1PTcGmAah5kEitCEc0wzmNeo
   BCl0wYR6G0rGaKtK9Dn7CuIjvubtUysVyQoMVPQ97ldeakHWeRMiEJFXg6kZZ0vr
   GvwnKoMh3DlK44D9dX7IDua2PlYx5+eroA+1Lqf32ZSaAO0bBIMIYTHigwbHMZoT
   ...
   56tE7THvH7vOEf4/iUOsIrEzaMaJ0mqkmY1A70qQGQKBgBF3H1qNRNHuyMcPODFs
   27hDzPDinrquSEvoZIggkDMlh2irTiipJ/GhkvTpoQlv0fK/VXw8vSgeaBuhwJvS
   LXU9HvYq0U6O4FgD3nAyB9hI0BE13r1HjUvbjT7moH+RhnNz6eqqdscCS09VtRAo
   4QQvAqOa8UheYeoXLdWcHaLP
   -----END PRIVATE KEY-----                    
   
   -----BEGIN CERTIFICATE-----
   MIIEazCCA1OgAwIBAgICWxQwDQYJKoZIhvcNAQELBQAwgbExCzAJBgNVBAYTAi0t
   MRIwEAYDVQQIDAlTb21lU3RhdGUxETAPBgNVBAcMCFNvbWVDaXR5MRkwFwYDVQQK
   DBBTb21lT3JnYW5pemF0aW9uMR8wHQYDVQQLDBZTb21lT3JnYW5pemF0aW9uYWxV
   bml0MRkwFwYDVQQDDBBpcC0xNzItMzEtMjAtMjM2MSQwIgYJKoZIhvcNAQkBFhVy
   ...
   z5rRUE/XzxRLBZOoWZpNWTXJkQ3uFYH6s/sBwtHpKKZMzOvDedREjNKAvk4ws6F0
   CuIjvubtUysVyQoMVPQ97ldeakHWeRMiEJFXg6kZZ0vrGvwnKoMh3DlK44D9dlU3
   WanXWehT6FiSZvB4sTEXXJN2jdw8g+sHGnZ8zCOsclknYhHrCVD2vnBlZJKSZvak
   3ZazhBxtQSukFMOnWPP2a0DMMFGYUHOd0BQE8sBJxg==
   -----END CERTIFICATE-----
   ```

   文件名和扩展名只是为了提供便利，对功能没有影响。例如，只要 `ssl.conf` 文件中的相关指令使用相同的名称，您就可以将证书命名为 `cert.crt`、`cert.pem` 或任何其他文件名。
**注意**  
在使用您自己的自定义文件替换默认 TLS 文件时，请确保它们采用 PEM 格式。

1. 使用您常用的文本编辑器（如 **vim** 或 **nano**）以根用户身份打开 `/etc/httpd/conf.d/ssl.conf` 文件并注释掉以下行，因为自签名虚拟证书也包含密钥。如果在完成下一步之前没有注释掉该行，Apache 服务将无法启动。

   ```
   SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
   ```

1. 重启 Apache。

   ```
   [ec2-user ~]$ sudo systemctl restart httpd
   ```
**注意**  
确保 TCP 端口 443 在您的 EC2 实例上是可访问的，如之前所述。

1. 现在，您的 Apache Web 服务器应通过端口 443 支持 HTTPS (安全 HTTP)。通过将您的 EC2 实例的 IP 地址或完全限定域名与前缀 **https://** 一起输入浏览器 URL 栏中来对其进行测试。

   由于您正在使用自签名的不可信主机证书连接到站点，因此您的浏览器可能会显示一系列安全警告。忽视这些警告并继续连接站点。

   如果默认 Apache 测试页面打开，这意味着您已成功在服务器上配置 TLS。在浏览器和服务器之间传输的所有数据现在都已加密。
**注意**  
为了防止站点访问者遇到警告屏幕，您必须获取一个可信 CA 签名证书，该证书不仅进行加密，而且还公开验证您是否为站点拥有者。

## 步骤 2：获取 CA 签名的证书
<a name="ssl_certificate"></a>

您可以使用以下过程获取 CA 签名证书：
+ 从私有密钥生成证书签名请求 (CSR)
+ 将 CSR 提交给证书颁发机构 (CA)
+ 获取签名的主机证书
+ 配置 Apache 以使用证书

从加密角度看，自签名 TLS X.509 主机证书与 CA 签名证书完全相同。二者之间的区别在于社交层面，而非数学层面。CA 承诺，在向申请者颁发证书之前，至少验证域的所有权。每个 Web 浏览器都包含浏览器供应商 CAs 信任的列表。X.509 证书主要包含一个与您的私有服务器密钥对应的公有密钥和一个以加密方式与该公有密钥关联的 CA 的签名。当浏览器通过 HTTPS 连接到 Web 服务器时，服务器会提供一份证书，供浏览器根据其可信列表进行核对 CAs。如果签署人位于列表上，或可通过由其他可信签署人组成的*一系列信任*访问，则浏览器将与服务器协商一个快速加密数据通道并加载页面。

由于验证请求需要投入人力，证书通常会产生费用，因此应货比三家。少数人免费 CAs 提供基本级别的证书。其中最引人注目的是 CAs L [et's Encrypt](https://letsencrypt.org/) 项目，该项目还支持证书创建和续订过程的自动化。有关使用 Let's Encrypt 证书的更多信息，请参阅[获取 Certbot](https://eff-certbot.readthedocs.io/en/stable/install.html)。

如果您打算提供商业级服务，[AWS Certificate Manager](https://docs.aws.amazon.com/acm/latest/userguide/acm-overview.html) 是一个不错的选择。

主机证书的基础是密钥。从 2019 年开始，[政府](http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r4.pdf)和[行业](https://cabforum.org/wp-content/uploads/CA-Browser-Forum-BR-1.6.5.pdf)群体建议 RSA 密钥使用 2048 位的最小密钥（模数）大小，旨在将文档一直保护到 2030 年。OpenSSL 在中生成的默认模数大小为 2048 位，适用于 AL2 在 CA 签名的证书中使用。在以下过程中，为需要自定义密钥的人员提供了一个可选步骤，例如，具有较大模数或使用不同加密算法的步骤。

**重要**  
除非您拥有注册并托管的 DNS 域，否则，有关获取 CA 签名主机证书的这些说明不适用。

**获取 CA 签名的证书**

1.  [连接到](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-to-linux-instance.html)您的实例并导航到etc/pki/tls/private//。这是存储 TLS 的服务器私有密钥的目录。如果您希望使用现有的主机密钥生成 CSR，请跳到步骤 3。

1. (可选) 生成新的私有密钥。下面是一些密钥配置示例。任何生成的密钥都可用于您的 Web 服务器，但它们实施安全的程度和类型有所不同。
   + **示例 1：**创建默认 RSA 主机密钥。生成的文件 **custom.key** 是一个 2048 位 RSA 私有密钥。

     ```
     [ec2-user ~]$ sudo openssl genrsa -out custom.key
     ```
   + **示例 2：**创建具有更大模数的更严格的 RSA 密钥。生成的文件 **custom.key** 是一个 4096 位 RSA 私有密钥。

     ```
     [ec2-user ~]$ sudo openssl genrsa -out custom.key 4096
     ```
   + **示例 3：**创建具有密码保护的 4096 位加密的 RSA 密钥。生成的文件 **custom.key** 是一个已使用 AES-128 密码加密的 4096 位 RSA 私有密钥。
**重要**  
对密钥进行加密可增强安全性，但由于加密的密钥需要密码，因此依赖于加密密钥的服务无法自动启动。每当您使用此密钥时，都必须通过 SSH 连接提供密码（在上一示例中为“abcde12345”）。

     ```
     [ec2-user ~]$ sudo openssl genrsa -aes128 -passout pass:abcde12345 -out custom.key 4096
     ```
   + **示例 4：**使用非 RSA 密码创建密钥。RSA 加密可能相对较慢，因为其公有密钥的大小基于两个大素数的乘积。不过，可以为 TLS 创建使用非 RSA 密码的密钥。在交付同等级别的安全性时，基于椭圆曲线的数学运算的密钥更小，计算起来更快。

     ```
     [ec2-user ~]$ sudo openssl ecparam -name prime256v1 -out custom.key -genkey
     ```

     结果为一个使用 prime256v1（OpenSSL 支持的“命名曲线”）的 256 位椭圆曲线私有密钥。[根据 NIST](http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r4.pdf)，其加密强度略高于 2048 位 RSA 密钥。
**注意**  
并非所有密钥都 CAs 提供与 RSA elliptic-curve-based 密钥相同的支持级别。

   确保新的私钥具有高度限制的所有权和权限（owner=root，group=root，仅适用于所有者）。 read/write 命令将如以下示例所示。

   ```
   [ec2-user ~]$ sudo chown root:root custom.key
   [ec2-user ~]$ sudo chmod 600 custom.key
   [ec2-user ~]$ ls -al custom.key
   ```

   上述命令生成以下结果。

   ```
   -rw------- root root custom.key
   ```

    在创建并配置满意的密钥后，可以创建 CSR。

1. 使用您首选的密钥创建 CSR。下面的示例使用了 **custom.key**。

   ```
   [ec2-user ~]$ sudo openssl req -new -key custom.key -out csr.pem
   ```

   OpenSSL 将打开一个对话框，并提示您输入下表中显示的信息。对于基本的经域验证的主机证书来说，除 **Common Name** 以外的所有字段都是可选字段。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/linux/al2/ug/SSL-on-amazon-linux-2.html)

   最后，OpenSSL 将提示您输入可选的质询密码。此密码仅适用于 CSR 和您与 CA 之间的事务，因此请遵循 CA 提供的有关此密码以及其他可选字段、可选公司名的建议。CSR 质询密码不会影响服务器操作。

   生成的文件 **csr.pem** 包含您的公有密钥、您的公有密钥的数字签名以及您输入的元数据。

1. 将 CSR 提交给 CA。这通常包括在文本编辑器中打开 CSR 文件并将内容复制到 Web 表格中。此时，可能会要求您提供一个或多个主题备用名称 (SANs) 以放在证书上。如果 **www.example.com** 是公用名，则 **example.com** 将是一个很好的 SAN，反之亦然。您网站的访客如果输入这两个名称的任何一个，便可看到一个没有错误的连接。如果您的 CA Web 表单允许，请在列表中包含常用名 SANs。有些是自动 CAs 包含的。

   在您的请求获得批准后，您将收到一个由 CA 签署的新主机证书。此外，系统可能会指示您下载*中间证书*文件，该文件包含完成 CA 的信任链所需的其他证书。
**注意**  
您的 CA 可能会针对各种用途发送多种格式的文件。在本教程中，您应只使用 PEM 格式的证书文件，此格式通常会（但不总是）标有 `.pem` 或 `.crt` 文件扩展名。如果您不确定要使用哪个文件，请使用文本编辑器打开这些文件，并查找一个包含一个或多个以下面的行开始的块的文件。  

   ```
   - - - - -BEGIN CERTIFICATE - - - - - 
   ```
该文件还应以下面的行结束。  

   ```
   - - - -END CERTIFICATE - - - - -
   ```
您还可以在命令行上测试文件，如下所示。  

   ```
   [ec2-user certs]$ openssl x509 -in certificate.crt -text
   ```
验证这些行是否显示在文件中。请勿使用结尾为 `.p7b`、`.p7c` 或类似文件扩展名的文件。

1. 将新的 CA 签名证书和任何中间证书放在 `/etc/pki/tls/certs` 目录中。
**注意**  
可通过多种方法将新证书上传到 EC2 实例，但最直接、最有益的方法是在本地计算机和 EC2 实例上打开一个文本编辑器（例如，vi、nano 或记事本），然后在这两者之间复制并粘贴文件内容。在 EC2 实例上执行这些操作时，您需要根 [sudo] 权限。这样，一旦有任何权限或路径问题，您可以立即看到。但请小心操作，不要在复制内容时添加任何多余的行或以任何方式更改内容。

   在`/etc/pki/tls/certs`目录内部，检查文件所有权、组和权限设置是否与限制性很强的 AL2 默认值相匹配（owner=root，group=root，仅适用于所有者）。 read/write 以下示例显示了要使用的命令。

   ```
   [ec2-user certs]$ sudo chown root:root custom.crt
   [ec2-user certs]$ sudo chmod 600 custom.crt
   [ec2-user certs]$ ls -al custom.crt
   ```

   这些命令应生成以下结果。

   ```
   -rw------- root root custom.crt
   ```

   中间证书文件的权限并不严格 (所有者=根、组=根、所有者可以写入、组可以读取、任何人均可读取)。以下示例显示了要使用的命令。

   ```
   [ec2-user certs]$ sudo chown root:root intermediate.crt
   [ec2-user certs]$ sudo chmod 644 intermediate.crt
   [ec2-user certs]$ ls -al intermediate.crt
   ```

   这些命令应生成以下结果。

   ```
   -rw-r--r-- root root intermediate.crt
   ```

1. 将用于创建 CSR 的私有密钥放在 `/etc/pki/tls/private/` 目录中。
**注意**  
可通过多种方法将自定义密钥上传到 EC2 实例，但最直接、最有益的方法是在本地计算机和 EC2 实例上打开一个文本编辑器（例如，vi、nano 或记事本），然后在这两者之间复制并粘贴文件内容。在 EC2 实例上执行这些操作时，您需要根 [sudo] 权限。这样，一旦有任何权限或路径问题，您可以立即看到。但请小心操作，不要在复制内容时添加任何多余的行或以任何方式更改内容。

   在`/etc/pki/tls/private`目录内部，使用以下命令验证文件所有权、组和权限设置是否与高度严格的 AL2 默认值相匹配（owner=root，group=root，仅适用于所有者）。 read/write 

   ```
   [ec2-user private]$ sudo chown root:root custom.key
   [ec2-user private]$ sudo chmod 600 custom.key
   [ec2-user private]$ ls -al custom.key
   ```

   这些命令应生成以下结果。

   ```
   -rw------- root root custom.key
   ```

1. 编辑 `/etc/httpd/conf.d/ssl.conf` 以反映您的新证书和密钥文件。

   1. 在 Apache 的 `SSLCertificateFile` 指令中提供 CA 签名主机证书的路径和文件名：

      ```
      SSLCertificateFile /etc/pki/tls/certs/custom.crt
      ```

   1. 如果您收到一个中间证书文件（此示例中为 `intermediate.crt`），请使用 Apache 的 `SSLCACertificateFile` 指令提供其路径和文件名：

      ```
      SSLCACertificateFile /etc/pki/tls/certs/intermediate.crt
      ```
**注意**  
有些证书将主机证书和中间证书 CAs 合并到一个文件中，因此没有必要使用该`SSLCACertificateFile`指令。请查询您的 CA 提供的说明。

   1. 在 Apache 的 `SSLCertificateKeyFile` 指令中提供私有密钥的路径和文件名（在该示例中为 `custom.key`）：

      ```
      SSLCertificateKeyFile /etc/pki/tls/private/custom.key
      ```

1. 保存 `/etc/httpd/conf.d/ssl.conf` 并重启 Apache。

   ```
   [ec2-user ~]$ sudo systemctl restart httpd
   ```

1. 通过在浏览器 URL 栏中输入带有 `https://` 前缀的域名来测试您的服务器。您的浏览器应通过 HTTPS 加载测试页面而不会产生错误。

## 步骤 3：测试和强化安全配置
<a name="ssl_test"></a>

在 TLS 可操作且公开发布后，应测试其实际安全性。使用在线服务（例如 [Qualys SSL Labs](https://www.ssllabs.com/ssltest/analyze.html)，该服务可对您的安全设置执行免费的全面分析）可轻松执行此操作。根据结果，您可以决定通过控制接受的协议、首选的密码和排除的密码来强化默认安全配置。有关更多信息，请参阅 [Qualys 如何用公式表示其分数](https://github.com/ssllabs/research/wiki/SSL-Server-Rating-Guide)。

**重要**  
实际测试对服务器的安全性非常重要。少量配置错误可能导致严重的安全漏洞和数据丢失。由于建议的安全实践会不断变化以响应调查和新兴威胁，因此定期安全审核对于良好的服务器管理来说是必不可少的。

在 [Qualys SSL Labs](https://www.ssllabs.com/ssltest/analyze.html) 站点上，使用 **www.example.com** 格式输入服务器的完全限定域名。约两分钟后，您将收到您站点的评级 (从 A 到 F) 和结果的详细信息。下表汇总了设置与默认 Apache 配置相同且具有默认 Cert AL2 bot 证书的域的报告。


|  |  | 
| --- |--- |
| 总评 | B | 
| 证书 | 100% | 
| 协议支持 | 95% | 
| 密钥交换 | 70% | 
| 密码强度 | 90% | 

虽然概述信息显示配置基本正确，但详细报告标记了几个潜在的问题（在此处按严重性顺序列出）：

✗ **某些较旧的浏览器支持使用该 RC4 密码**。密码是加密算法的数学核心。 RC4[是一种用于加密 TLS 数据流的快速密码，众所周知，它有几个严重的弱点。](http://www.imperva.com/docs/hii_attacking_ssl_when_using_rc4.pdf)除非您有充分理由支持旧版浏览器，否则，应禁用该密码。

✗ **支持旧 TLS 版本。**该配置支持 TLS 1.0（已弃用）和 TLS 1.1（即将弃用）。从 2018 年开始，仅建议使用 TLS 1.2。

✗ **不完全支持向前保密性。**[向前保密性](https://en.wikipedia.org/wiki/Forward_secrecy)是一种算法功能，它使用从私有密钥派生的临时会话密钥进行加密。这意味着，在实践中，攻击者无法解密 HTTPS 数据，即使他们拥有 Web 服务器的长期私有密钥。

**纠正 TLS 配置并供将来使用**

1. 在文本编辑器中打开 `/etc/httpd/conf.d/ssl.conf` 配置文件，并在以下行的开头输入“\$1”以注释掉该行。

   ```
   #SSLProtocol all -SSLv3
   ```

1. 添加以下指令：

   ```
   #SSLProtocol all -SSLv3
   SSLProtocol -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 +TLSv1.2
   ```

   该指令显式禁用 SSL 版本 2 和 3 以及 TLS 版本 1.0 和 1.1。现在，服务器拒绝接受与使用 TLS 1.2 以外的任何协议的客户端之间的加密连接。指令中的冗长文字更清楚地向人类读者阐述为服务器配置的用途。
**注意**  
以此方式禁用 TLS 1.0 和 1.1 版可阻止一小部分过时的 Web 浏览器访问您的网站。

**修改允许的密码列表**

1. 在 `/etc/httpd/conf.d/ssl.conf` 配置文件中，找到包含 **SSLCipherSuite** 指令的部分，并通过在现有行的开头输入“\$1”来注释掉该行。

   ```
   #SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
   ```

1. 指定显式的密码套件，并指定密码顺序以优先使用向前保密性并避免不安全的密码。此处使用的 `SSLCipherSuite` 指令基于 [Mozilla SSL 配置生成器](https://mozilla.github.io/server-side-tls/ssl-config-generator/)的输出，该生成器根据服务器上运行的特定软件定制 TLS 配置。首先，通过使用以下命令的输出确定 Apache 和 OpenSSL 版本。

   ```
   [ec2-user ~]$ yum list installed | grep httpd
   
   [ec2-user ~]$ yum list installed | grep openssl
   ```

   例如，如果返回的信息是 Apache 2.4.34 和 OpenSSL 1.0.2，我们将其输入到生成器中。如果您选择“现代”兼容性模型，这将创建一条 `SSLCipherSuite` 指令，虽然该指令积极实施安全性，但仍适用于大多数浏览器。如果您的软件不支持现代配置，则可以更新软件或改为选择“中间”配置。

   ```
   SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:
   ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:
   ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
   ```

   选定的密码名称中包含 *ECDHE*，它是 *Elliptic Curve Diffie-Hellman Ephemeral* 的缩写。术语 *ephemeral* 表示向前保密性。顺便说一句，这些密码不支持。 RC4

   建议您使用密码的明确列表，而不是依赖于内容不可见的默认值或简短指令。

   将生成的指令复制到 `/etc/httpd/conf.d/ssl.conf` 中。
**注意**  
此处为方便阅读将指令显示为几行，但在复制到 `/etc/httpd/conf.d/ssl.conf` 时，该指令必须位于一行中，并且密码名称之间只有一个冒号（无空格）。

1. 最后，通过删除以下行开头的“\$1”来取消对该行的注释。

   ```
   #SSLHonorCipherOrder on
   ```

   该指令强制服务器优先使用排名较高的密码，包括（在该示例中）支持向前保密性的密码。启用此指令后，服务器会在回滚到允许的安全性较低的密码之前尝试建立高度安全的连接。

在完成这两个过程后，将更改保存到 `/etc/httpd/conf.d/ssl.conf` 并重新启动 Apache。

如果您在 [Qualys SSL Labs](https://www.ssllabs.com/ssltest/analyze.html) 上再次测试该域名，您应该会看到 RC4 漏洞和其他警告已消失，摘要如下所示。


|  |  | 
| --- |--- |
| 总评 | A | 
| 证书 | 100% | 
| 协议支持 | 100% | 
| 密钥交换 | 90% | 
| 密码强度 | 90% | 

在每次更新 OpenSSL 时，将引入新的密码并删除对旧密码的支持。保留您的 EC2 AL2 实例 up-to-date，留意来自 [OpenSSL](https://www.openssl.org/) 的安全公告，并警惕技术媒体上有关新安全漏洞的报告。

## 故障排除
<a name="troubleshooting"></a>
+ **除非我输入密码，否则我的 Apache Web 服务器不会启动**

  如果您安装了受密码保护的加密的私有服务器密钥，这是预期行为。

  您可以从密钥中删除加密和密码要求。假设在默认目录中具有一个称为 `custom.key` 的加密的私有 RSA 密钥，并且此密钥上的密码是 **abcde12345**，则对 EC2 实例运行以下命令可生成此密钥的未加密版本。

  ```
  [ec2-user ~]$ cd /etc/pki/tls/private/
  [ec2-user private]$ sudo cp custom.key custom.key.bak
  [ec2-user private]$ sudo openssl rsa -in custom.key -passin pass:abcde12345 -out custom.key.nocrypt 
  [ec2-user private]$ sudo mv custom.key.nocrypt custom.key
  [ec2-user private]$ sudo chown root:root custom.key
  [ec2-user private]$ sudo chmod 600 custom.key
  [ec2-user private]$ sudo systemctl restart httpd
  ```

  Apache 现在启动时应该不会提示您提供密码。
+  **我在运行 sudo yum install -y mod\$1ssl 时收到了错误。**

  在为 SSL 安装所需的程序包时，您可能会看到与以下内容类似的错误。

  ```
  Error: httpd24-tools conflicts with httpd-tools-2.2.34-1.16.amzn1.x86_64
  Error: httpd24 conflicts with httpd-2.2.34-1.16.amzn1.x86_64
  ```

  这通常意味着您的 EC2 实例未运行 AL2。本教程仅支持从官方 AL2 AMI 新创建的实例。

# 教程：在上发布 WordPress 博客 AL2
<a name="hosting-wordpress"></a>

以下过程将帮助您在 AL2 实例上安装、配置和保护 WordPress 博客。本教程很好地介绍了如何使用 Amazon EC2，因为您可以完全控制托管 WordPress 博客的 Web 服务器，这在传统托管服务中并不常见。

您负责更新软件包并为您的服务器维护安全补丁。对于不需要与 Web 服务器配置直接交互的自动化程度更高的 WordPress 安装，该 CloudFormation 服务提供了一个可以帮助您快速入门的 WordPress模板。有关更多信息，请参阅*AWS CloudFormation 用户指南*中的[入门](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/GettingStarted.Walkthrough.html)。*如果您需要具有分离数据库的高可用性解决方案，请参阅[开发人员指南中的部署高可用性 WordPress 网站](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/php-hawordpress-tutorial.html)。AWS Elastic Beanstalk *

**重要**  
这些程序旨在与一起使用 AL2。有关其他发布版本的更多信息，请参阅其具体文档。本教程中的很多步骤对 Ubuntu 实例并不适用。有关在 Ubuntu 实例 WordPress 上安装的帮助，请参阅 Ubuntu 文档[WordPress](https://help.ubuntu.com/community/WordPress)中的。你也可以使用[CodeDeploy](https://docs.aws.amazon.com/codedeploy/latest/userguide/tutorials-wordpress-launch-instance.html)在亚马逊 Linux、macOS 或 Unix 系统上完成此任务。

**Topics**
+ [先决条件](#hosting-wordpress-prereqs)
+ [安装 WordPress](#install-wordpress)
+ [后续步骤](#wordpress-next-steps)
+ [帮助！我的公有 DNS 名称发生更改导致我的博客瘫痪](#wordpress-troubleshooting)

## 先决条件
<a name="hosting-wordpress-prereqs"></a>

本教程假设您已经按照中的所有步骤启动了一个 AL2 实例，该服务器支持了 PHP 和数据库（MySQL 或 MariaDB），该服务器支持 PHP 和数据库（MySQL 或 MariaDB）。[教程：在上安装 LAMP 服务器 AL2](ec2-lamp-amazon-linux-2.md)本教程还介绍了配置安全组以允许 `HTTP` 和 `HTTPS` 流量的步骤，以及用于确保为 Web 服务器正确设置文件权限的几个步骤。有关向安全组添加规则的信息，请参阅[向安全组添加规则](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/working-with-security-groups.html#adding-security-group-rule)。

我们强烈建议您将弹性 IP 地址 (EIP) 关联到用于托管 WordPress 博客的实例。这将防止您的实例的公有 DNS 地址更改和中断您的安装。如果您有一个域名且打算将其用于您的博客，则可更新该域名的 DNS 记录，使其指向您的 EIP 地址 (如需帮助，请联系您的域名注册商)。您可以免费将一个 EIP 地址与正在运行的实例相关联。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[弹性 IP 地址](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html)。

如果您的博客还没有域名，则可使用 Route 53 注册一个域名并将您的实例的 EIP 地址与您的域名相关联。有关更多信息，请参阅 *Amazon Route 53 开发人员指南*中的[使用 Amazon Route 53 注册域名](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/registrar.html)。

## 安装 WordPress
<a name="install-wordpress"></a>

**选项：使用 Automation 完成本教程**  
要使用 AWS Systems Manager 自动化而不是以下任务来完成本教程，请运行[自动化文档](https://console.aws.amazon.com/systems-manager/documents/AWSDocs-HostingAWordPressBlog/)。

连接到您的实例，然后下载 WordPress 安装包。

**下载并解压缩 WordPress 安装包**

1. 使用**wget**命令下载最新的 WordPress 安装包。以下命令始终会下载最新版本。

   ```
   [ec2-user ~]$ wget https://wordpress.org/latest.tar.gz
   ```

1. 解压并解档安装包。安装文件夹解压到名为 `wordpress` 的文件夹。

   ```
   [ec2-user ~]$ tar -xzf latest.tar.gz
   ```<a name="create_user_and_database"></a>

**为您的 WordPress 安装创建数据库用户和数据库**

您的 WordPress 安装需要将博客文章和用户评论等信息存储在数据库中。此过程帮助您创建自己的博客数据库，并创建一个有权读取该数据库的信息并将信息保存到该数据库的用户。

1. 启动数据库服务器。
   + 

     ```
     [ec2-user ~]$ sudo systemctl start mariadb
     ```

1. 以 `root` 用户身份登录数据库服务器。在系统提示时输入您的数据库 `root` 密码，它可能与您的 `root` 系统密码不同；如果您尚未给您的数据库服务器加密，它甚至可能是空的。

   如果您尚未给您的数据库服务器加密，则必须执行这项操作。有关更多信息，请参阅 [保护 MariaDB 服务器](ec2-lamp-amazon-linux-2.md#securing-maria-db) (AL2)。

   ```
   [ec2-user ~]$ mysql -u root -p
   ```

1. <a name="create_database_user"></a>为您的 MySQL 数据库创建用户和密码。您的 WordPress安装使用这些值与您的 MySQL 数据库进行通信。

   确保为您的用户创建强密码。请勿在您的密码中使用单引号字符 (')，因为这将中断前面的命令。请勿重复使用现有密码，并确保将密码保存在安全的位置。

   输入以下命令，以替换唯一的用户名和密码。

   ```
   CREATE USER 'wordpress-user'@'localhost' IDENTIFIED BY 'your_strong_password';
   ```

1. <a name="create_database"></a>创建数据库。为数据库提供一个有意义的描述性名称，例如 `wordpress-db`。
**注意**  
以下命令中数据库名称两边的标点符号称为反引号。在标准键盘上，反引号 (```) 键通常位于 `Tab` 键的上方。并不总是需要反引号，但是它们允许您在数据库名称中使用其他的非法字符，例如连字符。

   ```
   CREATE DATABASE `wordpress-db`;
   ```

1. 向之前创建的 WordPress 用户授予数据库的完全权限。

   ```
   GRANT ALL PRIVILEGES ON `wordpress-db`.* TO "wordpress-user"@"localhost";
   ```

1. 刷新数据库权限以接受您的所有更改。

   ```
   FLUSH PRIVILEGES;
   ```

1. 退出 `mysql` 客户端。

   ```
   exit
   ```

**创建和编辑 wp-config.php 文件**

 WordPress 安装文件夹包含名为的示例配置文件`wp-config-sample.php`。在本步骤中，您将复制此文件并进行编辑以适合您的具体配置。

1. 将 `wp-config-sample.php` 文件复制为一个名为 `wp-config.php` 的文件。这样做会创建新的配置文件并将原先的示例配置文件原样保留作为备份。

   ```
   [ec2-user ~]$ cp wordpress/wp-config-sample.php wordpress/wp-config.php
   ```

1. 用您喜欢的文本编辑器（例如 **nano** 或 **vim**）编辑 `wp-config.php` 文件并输入适用于您的安装的值。如果没有常用的文本编辑器，`nano` 比较适合初学者使用。

   ```
   [ec2-user ~]$ nano wordpress/wp-config.php
   ```

   1. 查找定义 `DB_NAME` 的行并将 `database_name_here` 更改为您在 [Step 4](#create_database) 的 [为您的 WordPress 安装创建数据库用户和数据库](#create_user_and_database) 中创建的数据库名称。

      ```
      define('DB_NAME', 'wordpress-db');
      ```

   1. 查找定义 `DB_USER` 的行并将 `username_here` 更改为您在 [Step 3](#create_database_user) 的 [为您的 WordPress 安装创建数据库用户和数据库](#create_user_and_database) 中创建的数据库用户。

      ```
      define('DB_USER', 'wordpress-user');
      ```

   1. 查找定义 `DB_PASSWORD` 的行并将 `password_here` 更改为您在 [Step 3](#create_database_user) 的 [为您的 WordPress 安装创建数据库用户和数据库](#create_user_and_database) 中创建的强密码。

      ```
      define('DB_PASSWORD', 'your_strong_password');
      ```

   1. 查找名为 `Authentication Unique Keys and Salts` 的一节。这些`KEY`和`SALT`值为 WordPress 用户存储在本地计算机上的浏览器 Cookie 提供了一层加密。总而言之，添加长的随机值将使您的站点更安全。访问 [https://api.wordpress。 org/secret-key/1.1/salt](https://api.wordpress.org/secret-key/1.1/salt/)/以随机生成一组密钥值，您可以将其复制并粘贴到`wp-config.php`文件中。要粘贴文本到 PuTTY 终端，请将光标放在您要粘贴文本的地方，并在 PuTTY 终端内部右键单击鼠标。

      有关安全密钥的更多信息，请[访问 https://wordpress。 org/support/article/editing-wp-config-php/\$1security-keys](https://wordpress.org/support/article/editing-wp-config-php/#security-keys)。
**注意**  
以下值仅用作示例；请勿使用以下值进行安装。

      ```
      define('AUTH_KEY',         ' #U$$+[RXN8:b^-L 0(WU_+ c+WFkI~c]o]-bHw+)/Aj[wTwSiZ<Qb[mghEXcRh-');
      define('SECURE_AUTH_KEY',  'Zsz._P=l/|y.Lq)XjlkwS1y5NJ76E6EJ.AV0pCKZZB,*~*r ?6OP$eJT@;+(ndLg');
      define('LOGGED_IN_KEY',    'ju}qwre3V*+8f_zOWf?{LlGsQ]Ye@2Jh^,8x>)Y |;(^[Iw]Pi+LG#A4R?7N`YB3');
      define('NONCE_KEY',        'P(g62HeZxEes|LnI^i=H,[XwK9I&[2s|:?0N}VJM%?;v2v]v+;+^9eXUahg@::Cj');
      define('AUTH_SALT',        'C$DpB4Hj[JK:?{ql`sRVa:{:7yShy(9A@5wg+`JJVb1fk%_-Bx*M4(qc[Qg%JT!h');
      define('SECURE_AUTH_SALT', 'd!uRu#}+q#{f$Z?Z9uFPG.${+S{n~1M&%@~gL>U>NV<zpD-@2-Es7Q1O-bp28EKv');
      define('LOGGED_IN_SALT',   ';j{00P*owZf)kVD+FVLn-~ >.|Y%Ug4#I^*LVd9QeZ^&XmK|e(76miC+&W&+^0P/');
      define('NONCE_SALT',       '-97r*V/cgxLmp?Zy4zUU4r99QQ_rGs2LTd%P;|_e1tS)8_B/,.6[=UK<J_y9?JWG');
      ```

   1. 保存文件并退出文本编辑器。

**将 WordPress 文件安装在 Apache 文档根目录下**
+ 现在，您已经解压缩了安装文件夹，创建了 MySQL 数据库和用户，并自定义了 WordPress 配置文件，接下来就可以将安装文件复制到 Web 服务器文档根目录了，这样就可以运行完成安装的安装脚本了。这些文件的位置取决于您是希望 WordPress 博客在 Web 服务器的实际根目录（例如`my.public.dns.amazonaws.com`）中可用，还是在根目录下的子目录或文件夹（例如`my.public.dns.amazonaws.com/blog`）中可用。
  + 如果 WordPress 要在文档根目录下运行，请按如下方式复制 wordpress 安装目录的内容（但不是目录本身）：

    ```
    [ec2-user ~]$ cp -r wordpress/* /var/www/html/
    ```
  + 如果 WordPress 要在文档根目录下的备用目录中运行，请先创建该目录，然后将文件复制到该目录。在此示例中， WordPress将从以下目录运行`blog`：

    ```
    [ec2-user ~]$ mkdir /var/www/html/blog
    [ec2-user ~]$ cp -r wordpress/* /var/www/html/blog/
    ```

**重要**  
出于安全原因，如果您不打算立即进入到下一个过程，请立即停止 Apache Web 服务器 (`httpd`)。将安装移至 Apache 文档根目录下后， WordPress 安装脚本将不受保护，如果 Apache Web 服务器正在运行，攻击者可能会访问您的博客。要终止 Apache Web 服务器，请输入命令 **sudo systemctl stop httpd**。如果您即将继续到下一个步骤，则不需要终止 Apache Web 服务器。

**允许 WordPress 使用永久链接**

WordPress 永久链接需要使用 Apache `.htaccess` 文件才能正常工作，但是 Amazon Linux 上默认不启用此功能。使用此过程可允许 Apache 文档根目录中的所有覆盖。

1. 使用您常用的文本编辑器（如 **vim** 或 **nano**）打开 `httpd.conf` 文件。如果没有常用的文本编辑器，`nano` 比较适合初学者使用。

   ```
   [ec2-user ~]$ sudo vim /etc/httpd/conf/httpd.conf
   ```

1. 找到以 `<Directory "/var/www/html">` 开头的部分。

   ```
   <Directory "/var/www/html">
       #
       # Possible values for the Options directive are "None", "All",
       # or any combination of:
       #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
       #
       # Note that "MultiViews" must be named *explicitly* --- "Options All"
       # doesn't give it to you.
       #
       # The Options directive is both complicated and important.  Please see
       # http://httpd.apache.org/docs/2.4/mod/core.html#options
       # for more information.
       #
       Options Indexes FollowSymLinks
   
       #
       # AllowOverride controls what directives may be placed in .htaccess files.
       # It can be "All", "None", or any combination of the keywords:
       #   Options FileInfo AuthConfig Limit
       #
       AllowOverride None
   
       #
       # Controls who can get stuff from this server.
       #
       Require all granted
   </Directory>
   ```

1. 在以上部分中将 `AllowOverride None` 行改为读取 `AllowOverride All`。
**注意**  
此文件中有多个 `AllowOverride` 行；请确保更改 `<Directory "/var/www/html">` 部分中的行。

   ```
   AllowOverride All
   ```

1. 保存文件并退出文本编辑器。

**要在上安装 PHP 图形绘图库 AL2**  
PHP 的 GD 库允许您修改图像。如果您需要裁剪博客的标题图像，请安装此库。您安装 phpMyAdmin 的版本可能需要此库的特定最低版本（例如，7.2 版）。

使用以下命令在上安装 PHP 图形绘图库 AL2。例如，如果您在安装 LAMP 堆栈时安装了 php7.2，则此命令将安装 PHP 图形绘图库的 7.2 版。 amazon-linux-extras

```
[ec2-user ~]$ sudo yum install php-gd
```

要验证安装的版本，请使用以下命令：

```
[ec2-user ~]$ sudo yum list installed php-gd
```

下面是示例输出：

```
php-gd.x86_64                     7.2.30-1.amzn2             @amzn2extra-php7.2
```

**修复 Apache Web 服务器的文件权限**

中的某些可用功能 WordPress 需要对 Apache 文档根目录具有写入权限（例如通过 “管理” 屏幕上传媒体）。如果您尚未这样做，请应用以下群组成员资格和权限（详见中[教程：在上安装 LAMP 服务器 AL2](ec2-lamp-amazon-linux-2.md)）。

1. 将 `/var/www` 及其内容的文件所有权授予 `apache` 用户。

   ```
   [ec2-user ~]$ sudo chown -R apache /var/www
   ```

1. 将 `/var/www` 及其内容的组所有权授予 `apache` 组。

   ```
   [ec2-user ~]$ sudo chgrp -R apache /var/www
   ```

1. 更改 `/var/www` 及其子目录的目录权限，以添加组写入权限及设置未来子目录上的组 ID。

   ```
   [ec2-user ~]$ sudo chmod 2775 /var/www
   [ec2-user ~]$ find /var/www -type d -exec sudo chmod 2775 {} \;
   ```

1. 递归地更改 `/var/www` 及其子目录的文件权限。

   ```
   [ec2-user ~]$ find /var/www -type f -exec sudo chmod 0644 {} \;
   ```
**注意**  
 如果您还打算用 WordPress 作 FTP 服务器，则需要在此处进行更宽松的群组设置。请查看中的建议[步骤和安全设置 WordPress以](https://wordpress.org/support/article/changing-file-permissions/)完成此操作。

1. 重启 Apache Web 服务器，让新组和权限生效。
   + 

     ```
     [ec2-user ~]$ sudo systemctl restart httpd
     ```

**使用运行 WordPress 安装脚本 AL2**

您已准备好进行安装 WordPress。您使用的命令取决于操作系统。此过程中的命令可用于 AL2。

1. 使用 **systemctl** 命令确保 `httpd` 和数据库服务在每次系统启动时启动。

   ```
   [ec2-user ~]$ sudo systemctl enable httpd && sudo systemctl enable mariadb
   ```

1. 验证数据库服务器是否正在运行。

   ```
   [ec2-user ~]$ sudo systemctl status mariadb
   ```

   如果数据库服务未运行，请启动。

   ```
   [ec2-user ~]$ sudo systemctl start mariadb
   ```

1. 验证您的 Apache Web 服务器 (`httpd`) 正在运行。

   ```
   [ec2-user ~]$ sudo systemctl status httpd
   ```

   如果 `httpd` 服务未运行，请启动。

   ```
   [ec2-user ~]$ sudo systemctl start httpd
   ```

1. 在 Web 浏览器中，键入 WordPress 博客的 URL（要么是您的实例的公有 DNS 地址，要么是该地址后跟`blog`文件夹）。您应该会看到 WordPress 安装脚本。提供 WordPress 安装所需的信息。选择**安装 WordPress**以完成安装。有关更多信息，请参阅 WordPress 网站上的[步骤 5：运行安装脚本](https://wordpress.org/support/article/how-to-install-wordpress/#step-5-run-the-install-script)。

## 后续步骤
<a name="wordpress-next-steps"></a>

测试完 WordPress 博客后，可以考虑更新其配置。

**使用自定义域名**  
如果您有一个与您的 EC2 实例的 EIP 地址关联的域名，则可将您的博客配置为使用该域名而不是 EC2 公有 DNS 地址。有关更多信息，请参阅[更改网站上的 WordPress 网站 URL](https://wordpress.org/support/article/changing-the-site-url/)。

**配置您的博客**  
您可以将您的博客配置为使用不同的[主题](https://wordpress.org/themes/)和[插件](https://wordpress.org/plugins/)，从而向您的读者提供更具个性化的体验。但是，有时安装过程可能事与愿违，从而导致您丢失您的整个博客。强烈建议您在尝试安装任何主题或插件之前，为您的实例创建一个备份 Amazon Machine Image (AMI)，以便在安装过程中出现任何问题时，您还可以还原您的博客。有关更多信息，请参阅[创建自己的 AMI](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html#creating-an-ami)。

**增加容量**  
如果您的 WordPress 博客越来越受欢迎，并且您需要更多的计算能力或存储空间，请考虑以下步骤：
+ 对实例扩展存储空间。有关更多信息，请参阅《Amazon EBS 用户指南》**中的 [Amazon EBS 弹性卷](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-modify-volume.html)。
+ 将您的 MySQL 数据库移动到 [Amazon RDS](https://aws.amazon.com/rds) 以利用服务的轻松扩展功能。

**提高互联网流量的网络性能**  
如果希望您的博客吸引世界各地用户的流量，请考虑 [AWS Global Accelerator](https://aws.amazon.com/global-accelerator)。Global Accelerator 通过改善用户的客户端设备和运行的 WordPress 应用程序之间的互联网流量性能，帮助您降低延迟 AWS。Global Accelerator 使用[AWS 全球网络](https://aws.amazon.com/about-aws/global-infrastructure/global_network/)将流量引导到离客户端最近的 AWS 区域中运行良好的应用程序终端节点。

**了解更多关于 WordPress**  
有关信息 WordPress，请参阅 WordPress Codex 帮助文档，[网址为 http://codex.wordpress.org/](http://codex.wordpress.org/)。

有关安装疑难解答的更多信息，请参阅[常见安装问题](https://wordpress.org/support/article/how-to-install-wordpress/#common-installation-problems)。

有关提高 WordPress 博客安全性的信息，请参阅[强化 WordPress](https://wordpress.org/support/article/hardening-wordpress/)。

有关保留 WordPress 博客的信息 up-to-date，请参阅[更新 WordPress](https://wordpress.org/support/article/updating-wordpress/)。

## 帮助！我的公有 DNS 名称发生更改导致我的博客瘫痪
<a name="wordpress-troubleshooting"></a>

您的 WordPress 安装是使用您的 EC2 实例的公有 DNS 地址自动配置的。如果您停止并重启实例，公有 DNS 地址将发生更改 (除非它与弹性 IP 地址相关联)，并且您的博客将不会再运行，因为您的博客引用了不再存在的地址 (或已分配给另一个 EC2 实例的地址) 上的资源。[更改站点 URL 中概述了该问题的更详细描述和几种可能的](https://wordpress.org/support/article/changing-the-site-url/)解决方案。

如果 WordPress 安装时发生了这种情况，则可以通过以下步骤恢复博客，该过程使用**wp-cli**命令行界面 WordPress。

**要使用更改您的 WordPress 网站网址 **wp-cli****

1. 使用 SSH 连接到您的 EC2 实例。

1. 请记下您的实例的旧站点 URL 和新站点 URL。安装时，旧站点 URL 很可能是您的 EC2 实例的公有 DNS 名称 WordPress。新站点 URL 是您的 EC2 实例的当前公有 DNS 名称。如果您不确定旧站点 URL 是什么，则可通过以下命令使用 **curl** 来查找它。

   ```
   [ec2-user ~]$ curl localhost | grep wp-content
   ```

   您应该会在输出中看到对您的旧公有 DNS 名称的引用，如下所示 (旧站点 URL 用红色表示)：

   ```
   <script type='text/javascript' src='http://ec2-52-8-139-223.us-west-1.compute.amazonaws.com/wp-content/themes/twentyfifteen/js/functions.js?ver=20150330'></script>
   ```

1. 使用以下命令下载 **wp-cli**。

   ```
   [ec2-user ~]$ curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
   ```

1. 使用以下命令搜索并替换 WordPress 安装中的旧站点 URL。用新旧站点 URL 替换您的 EC2 实例和 WordPress 安装路径（通常为 o `/var/www/html` r`/var/www/html/blog`）。

   ```
   [ec2-user ~]$ php wp-cli.phar search-replace 'old_site_url' 'new_site_url' --path=/path/to/wordpress/installation --skip-columns=guid
   ```

1. 在 Web 浏览器中，输入 WordPress 博客的新网站 URL，以验证该网站是否恢复正常运行。如果不是，请参阅[更改站点 URL](https://wordpress.org/support/article/changing-the-site-url/) 和[常见安装问题](https://wordpress.org/support/article/how-to-install-wordpress/#common-installation-problems)了解更多信息。