

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

# 亚马逊 EC2 上的 AL2
<a name="ec2"></a>

**注意**  
 AL2 不再是亚马逊 Linux 的当前版本。 AL2023 是。的继任者 AL2。有关更多信息，请参阅《[AL2023 用户指南](https://docs.aws.amazon.com/linux/al2023/ug/)》[ AL2023中的 “[比较 AL2 AL2023和](https://docs.aws.amazon.com/linux/al2023/ug/compare-with-al2.html)” 和 “Package 变更](https://docs.aws.amazon.com/linux/al2023/release-notes/compare-packages.html)列表”。

 

**Topics**
+ [使用 AM AL2 I 启动亚马逊 EC2 实例](#launch-ec2-instance)
+ [使用 Systems Manager 查找最新的 AL2 AMI](#find-latest-al2-using-systems-manager)
+ [连接亚马逊 EC2 实例](#connect-to-amazon-linux-limits-ec2)
+ [AL2 AMI 启动模式](#default-boot-mode-al2)
+ [程序包存储库](#package-repository)
+ [在 on 上使用云初始化 AL2](amazon-linux-cloud-init.md)
+ [配置 AL2 实例](configure-ec2-instance.md)
+ [用户提供的内核](UserProvidedKernels.md)
+ [AL2 AMI 发布通知](linux-ami-notifications.md)
+ [配置 M AL2 ATE 桌面连接](amazon-linux-ami-mate.md)
+ [AL2 教程](al2-tutorials.md)

## 使用 AM AL2 I 启动亚马逊 EC2 实例
<a name="launch-ec2-instance"></a>

您可以使用 AMI 启动亚马逊 EC2 实例。 AL2 有关更多信息，请参阅[步骤 1：启动实例](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/EC2_GetStarted.html#ec2-launch-instance)。

## 使用 Systems Manager 查找最新的 AL2 AMI
<a name="find-latest-al2-using-systems-manager"></a>

Amazon EC2 提供 AWS Systems Manager 由公共 AMIs 维护的公共参数 AWS ，您可以在启动实例时使用这些参数。例如，EC2 提供的参数在所有区域`/aws/service/ami-amazon-linux-latest/amzn2-ami-kernel-default-hvm-x86_64-gp2`都可用，并且始终指向给定区域中最新版本的 AL2 AMI。

要使用查找最新 AL2023 AMI AWS Systems Manager，请参阅[入门 AL2023](https://docs.aws.amazon.com/linux/al2023/ug/get-started.html)。

在以下路径中提供 Amazon EC2 AMI 公有参数：

`/aws/service/ami-amazon-linux-latest`

您可以通过运行以下 AWS CLI 命令来查看当前 AWS 区域 AMIs 中所有 Amazon Linux 的列表。

```
aws ssm get-parameters-by-path --path /aws/service/ami-amazon-linux-latest --query "Parameters[].Name"
```

**使用公有参数启动实例**  
以下示例使用 EC2 提供的公共参数使用最新 AM AL2 I 启动`m5.xlarge`实例。

要在命令中指定参数，请使用以下语法：`resolve:ssm:public-parameter`，其中 `resolve:ssm` 是标准前缀，`public-parameter` 是公有参数的路径和名称。

在本示例中，不包括 `--count` 和 `--security-group` 参数。对于 `--count`，默认为 1。如有默认 VPC 和默认安全组，则将使用它们。

```
aws ec2 run-instances 
    --image-id resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-kernel-default-hvm-x86_64-gp2 
    --instance-type m5.xlarge 
    --key-name MyKeyPair
```

有关更多信息，请参阅*AWS Systems Manager 用户指南*中的[使用公共参数](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-public-parameters.html)。

**了解亚马逊 Linux 2 AMI 的名称**  
亚马逊 Linux 2 AMI 名称使用以下命名方案：

`amzn2-ami-[minimal-][kernel-{5.10,default,4.14}]-hvm-{x86_64,aarch64}-{ebs,gp2}`
+ M@@ **in** im AMIs alim 附带一组最小化的预装软件包，以减小图像大小。
+ **内核版本**决定了相应的 AMI 上预安装的内核版本：
  + `kernel-5.10`选择 Linux 内核版本 5.10。*这是推荐的内核版本 AL2。*
  + `kernel-default`为选择推荐的默认内核 AL2。它是内核 5.10 的别名。
  + `kernel-4.14`选择 Linux 内核版本 4.14。*这只是为了兼容较早的 AMI 版本而提供的。请勿使用此版本启动新实例。预计此 AMI 将不再受支持。*
  + 存在一组特殊的 AMI 名称，但不引用特定的内核。这些 AMIs 是内核 4.14 的别名。 *提供这些 AMIs 只是为了与较早的 AMI 版本兼容。请勿使用此 AMI 名称启动新实例。预计这些内核 AMIs 会更新。*
+ **x86\$164/aarch64 决定运行** AMI 的 CPU 平台。对于基于英特尔和 AMD 的 EC2 实例，请选择 x86\$164。为 EC2 Graviton 实例选择 aarch64。
+ **ebs/gp2** 确定用于为相应的 AMI 提供服务的 EBS 卷类型。请参阅 [EBS 卷类型](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-volume-types.html)以供参考。*始终选择 gp2。*

## 连接亚马逊 EC2 实例
<a name="connect-to-amazon-linux-limits-ec2"></a>

您可以通过多种方式连接您的 Amazon Linux 实例，包括 SSH 和 EC2 In AWS Systems Manager Session Manager stance Connect。有关更多信息，请参阅《Amazon EC2 用户指南》中的[连接到 Linux 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-to-linux-instance.html)**。

**SSH 用户和 **sudo****  
默认情况下，亚马逊 Linux 不允许`root`使用远程安全外壳 (SSH)。此外，禁用密码身份验证以防止暴力攻击。要在 Amazon Linux 实例上启用 SSH 登录，您必须在实例启动时为其提供密钥对。您还必须设置用于启动实例的安全组以允许 SSH 访问。默认情况下，唯一可以使用 SSH 远程登录的账户是`ec2-user`。此账户也有**sudo**权限。如果您启用远程`root`登录，请注意它不如依赖密钥对和辅助用户安全。

## AL2 AMI 启动模式
<a name="default-boot-mode-al2"></a>

AL2 AMIs 没有设置启动模式参数。从启动的实例 AL2 AMIs 遵循实例类型的默认启动模式值。有关更多信息，请参阅 *Amazon EC2 用户指南*中的[启动模式](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ami-boot.html)。

## 程序包存储库
<a name="package-repository"></a>

此信息适用于 AL2。有关信息 AL2023，请参阅 *Amazon Linux 2023 用户指南 AL2023*[中的管理软件包和操作系统更新](https://docs.aws.amazon.com/linux/al2023/ug/managing-repos-os-updates.html)。

AL2 和 AL1 旨在与每个 Amazon EC AWS 2 区域托管的在线软件包存储库一起使用。这些存储库在所有区域中提供，可使用 **yum** 更新工具进行访问。通过在每个区域托管存储库，我们可以快速部署更新，不会产生任何数据传输费。

**重要**  
的最新版本 AL1 已于 2023 年 12 月 31 日发布，自 2024 年 1 月 1 日起将不会收到任何安全更新或错误修复。有关更多信息，请参阅 [Amazon Linux AMI end-of-life](https://aws.amazon.com//blogs/aws/update-on-amazon-linux-ami-end-of-life/)。

如果您不需要为实例保留数据或自定义设置，则可以使用当前 AL2 AMI 启动新实例。如果您确实需要保留实例的数据或自定义设置，则可以通过 Amazon Linux 软件包存储库维护这些实例。这些存储库包含所有更新后的程序包。您可以选择将这些更新应用到正在运行的实例中。即使发布了新版本，AMI 和更新包的早期版本仍可继续使用。

**注意**  
要在 Amazon EC2 实例上更新和安装无需访问互联网的软件包，请参阅[如何在运行的 Amazon EC2 实例上更新 yum 或在没有互联网访问的情况下安装软件包 AL1 AL2，或 AL2023？](https://repost.aws/knowledge-center/ec2-al1-al2-update-yum-without-internet)

要安装程序包，请使用以下命令：

```
[ec2-user ~]$ sudo yum install package
```

如果您发现 Amazon Linux 不包含您需要的应用程序，您可以直接在 Amazon Linux 实例上安装该应用程序。Amazon Linux 使用 RPMs 和yum进行软件包管理，这可能是安装新应用程序的最直接方法。您应该首先查看我们的中央 Amazon Linux 存储库，确定其中是否有您需要应用程序，因为许多应用程序在那里都可以找到。然后，您可以将这些应用程序添加到您的 Amazon Linux 实例中。

要将应用程序上传到正在运行的 Amazon Linux 实例，请使用 **scp** 或 **sftp**，然后通过登录实例来配置应用程序。您还可以使用内置 cloud-init 程序包中的 **PACKAGE\$1SETUP** 操作，在实例启动时，上传应用程序。有关更多信息，请参阅[在 on 上使用云初始化 AL2](amazon-linux-cloud-init.md)。

### 安全更新
<a name="security-updates"></a>

安全更新是使用软件包存储库提供的。安全更新和更新后的 AMI 安全警报均在 [Amazon Linux 安全中心](https://alas.aws.amazon.com)发布。有关 AWS 安全策略的更多信息，或要报告安全问题，请访问 [AWS 云安全](https://aws.amazon.com/security/)。

AL1 并配置 AL2 为在启动时下载和安装关键或重要的安全更新。此配置中不包括内核更新。

在中 AL2023，与 AL1 和相比，此配置发生了变化 AL2。有关安全更新的更多信息 AL2023，请参阅 *Amazon Linux 2023 用户指南*中的[安全更新和功能](https://docs.aws.amazon.com/linux/al2023/ug/security-features.html)。

我们建议您在启动后针对您的用例进行必要的更新。例如，您可能希望在启动时应用所有更新（而不仅仅是安全更新），或者评估每个更新并仅应用适用于您的系统的更新。这将使用以下 cloud-init 设置来进行控制：`repo_upgrade`。下方 cloud-init 配置片段显示了如何修改传递到实例初始化用户数据文本中的设置：

```
#cloud-config
repo_upgrade: security
```

 `repo_upgrade` 的可能值如下所示：

`critical`  
应用未完成的关键安全更新。

`important`  
应用未完成的关键和重要安全更新。

`medium`  
应用未完成的关键、重要和中等安全更新。

`low`  
应用所有未完成的安全更新，包括具有低严重性的安全更新。

`security`  
应用 Amazon 标记为安全更新的明显关键或重要更新。

`bugfix`  
应用 Amazon 标记为缺陷修正的更新。缺陷修正是一组较大的更新，其中包括安全更新和针对各种其他小漏洞的修正更新。

`all`  
应用全部适用更新 (不论类别)。

`none`  
实例启动时不应用任何更新。

**备注**  
亚马逊 Linux 不会将任何更新标记为`bugfix`。要应用来自亚马逊 Linux 的与安全无关的更新，请使用`repo_upgrade: all`。

`repo_upgrade` 的默认设置是安全的。也就是说，如果您未在用户数据中指定其他值，在默认情况下，Amazon Linux 会在启动时执行针对所有已安装程序包的安全升级。Amazon Linux 还会使用 `/etc/motd` 文件列出登录时可用更新的数量，通知您已安装程序包的任何更新。要安装这些更新，您需要在实例上运行 **sudo yum upgrade**。

### 存储库配置
<a name="repository-config"></a>

 AL1 和 AL2， AMIs 是创建 AMI 时可用的软件包的快照，但安全更新除外。任何不在原始 AMI 上但在运行时安装的软件包都将是可用的最新版本。要获取可用的最新软件包 AL2，请运行**yum update -y**。

**故障排除技巧**  
如果您在 nano 实例类型上运行 **yum update** 时遇到 `cannot allocate memory` 错误（例如 `t3.nano`），则可能需要分配交换空间才能启用更新。

对于 AL2023，与 AL1 和相比，存储库配置发生了变化 AL2。有关 AL2023 存储库的更多信息，请参阅[管理软件包和操作系统更新](https://docs.aws.amazon.com/linux/al2023/ug/managing-repos-os-updates.html)。

之前的版本配置 AL2023 为提供持续的更新流，从 Amazon Linux 的一个次要版本滚动到下一个版本（也称为*滚动发布*）。作为最佳实践，我们建议您将您的 AMI 更新为最新的可用的 AMI，而不是启动旧的更新 AMIs并应用更新。

不支持在 Amazon Linux 主要 Linux 版本之间进行就地升级，例如从 AL1 到 AL2 或从 AL2 到 AL2023。有关更多信息，请参阅 [Amazon Linux 可用性](what-is-amazon-linux.md#amazon-linux-availability)。

# 在 on 上使用云初始化 AL2
<a name="amazon-linux-cloud-init"></a>

cloud-init 程序包是由 Canonical 构建的开源应用程序，用于在云计算环境（例如 Amazon EC2）中引导 Linux 映像。Amazon Linux 包含 cloud-init 的自定义版本。这允许您指定实例在启动时应执行的操作。启动实例时，您可以通过用户数据字段将需要的操作传递到 cloud-init。这意味着您可以在许多 AMIs 用例中使用 common，并在启动时动态配置它们。Amazon Linux 还使用 cloud-init 来执行 ec2-user 账户的初始配置。

 有关更多信息，请参阅 [cloud-init 文档](http://cloudinit.readthedocs.org/en/latest/)。

Amazon Linux 使用在 `/etc/cloud/cloud.cfg.d` 和 `/etc/cloud/cloud.cfg` 中发现的 cloud-init 操作。您可以在 `/etc/cloud/cloud.cfg.d` 中创建自己的 cloud-init 操作文件。此目录中的所有文件均由 cloud-init 读取。它们是按词典顺序进行读取的，并且文件随后将覆盖之前文件中的值。

cloud-init 程序包将在启动时对实例执行这些 (以及其他) 常见配置任务：
+ 设置默认区域设置。
+ 设置主机名。
+ 解析并处理用户数据。
+ 生成主机私有 SSH 密钥。
+ 将用户的公有 SSH 密钥添加到 `.ssh/authorized_keys`，以便于登录和管理。
+ 准备存储库以进行程序包管理。
+ 处理用户数据中定义的软件包操作。
+ 运行在用户数据中找到的用户脚本。
+ 装载实例存储卷 (如果适用)。
  + 默认情况下，`ephemeral0` 实例存储卷装载在 `/media/ephemeral0` (如果它存在且包含有效的文件系统；否则将不会安装)。
  + 默认情况下，将装载与实例关联的所有交换卷 (仅适用于 `m1.small` 和 `c1.medium` 实例类型)。
  + 您可以使用以下 cloud-init 指令覆盖默认实例存储卷安装：

    ```
    #cloud-config
    mounts:
    - [ ephemeral0 ]
    ```

    有关对安装的更多控制，请参阅 cloud-init 文档中的[安装](http://cloudinit.readthedocs.io/en/latest/topics/modules.html#mounts)。
  + 在实例启动时，不会格式化支持 TRIM 的实例存储卷，因此，您必须先对这些卷进行分区和格式化，然后才能装载它们。有关更多信息，请参阅[实例存储卷TRIM支持](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ssd-instance-store.html#InstanceStoreTrimSupport)。您可以在启动时使用 `disk_setup` 模块对您的实例存储卷进行分区和格式化。有关更多信息，请参阅 cloud-init 文档中的[磁盘设置](http://cloudinit.readthedocs.io/en/latest/topics/modules.html#disk-setup)。

## 支持的用户数据格式
<a name="supported-user-data-formats"></a>

cloud-init 软件包支持多种格式的用户数据处理：
+ Gzip
  + 如果用户数据采用 gzip 压缩，则 cloud-init 会解压缩数据并对其进行适当的处理。
+ MIME 多部分内容型
  + 使用 MIME 多部分内容型文件，您可以指定多种数据类型。例如，您可以同时指定用户数据脚本和云配置类型。如果多部分内容型文件的格式是受支持的格式，则 cloud-init 可以处理它的各部分内容。
+ Base64 解码
  +  如果用户数据采用 base64 编码，则 cloud-init 将决定它能否将解码后的数据理解为支持的类型之一。如果它能理解解码后的数据，则会解码数据，并进行适当处理。如果不能，它将完整地返回 base64 数据。
+ 用户数据脚本
  + 开头为 `#!` 或 `Content-Type: text/x-shellscript`。
  + 该脚本由 `/etc/init.d/cloud-init-user-scripts` 在首轮启动过程中运行。此操作会在启动过程的后期发生 (即执行初始配置操作后)。
+ 包含文件
  + 开头为 `#include` 或 `Content-Type: text/x-include-url`。
  + 此内容是一个包含文件。该文件包含一个列表 URLs，每行一个。每一个都 URLs 被读取，它们的内容都要经过同样的规则集。从 URL 读取的内容可以是 gzip 压缩或纯文本。 MIME-multi-part
+ 云配置数据
  + 开头为 `#cloud-config` 或 `Content-Type: text/cloud-config`。
  + 此内容是云配置数据。
+ Upstart 作业（不支持） AL2
  + 开头为 `#upstart-job` 或 `Content-Type: text/upstart-job`。
  + 这些内容存储在中的文件中`/etc/init`，新贵会像处理其他暴发户一样消耗这些内容。
+ Cloud boothook
  + 开头为 `#cloud-boothook` 或 `Content-Type: text/cloud-boothook`。
  + 此内容为 boothook 数据。它存储在 `/var/lib/cloud` 下的一个文件中并会立即运行。
  +  这是最早可用的 *hook*。尚无仅供运行一次的机制。boothook 必须自行解决此问题。它的环境变量 `INSTANCE_ID` 中包含实例 ID。使用此变量提供一 once-per-instance组 boothook 数据。

# 配置 AL2 实例
<a name="configure-ec2-instance"></a>

成功启动并登录 AL2 实例后，您可以对其进行更改。可以通过许多不同方式配置实例以满足特定应用程序的需求。下面是一些可帮助您入门的常见任务。

**Topics**
+ [常见配置方案](#instance-configuration-scenarios)
+ [管理您的 AL2 实例上的软件](managing-software.md)
+ [您的 Amazon EC2 AL2 实例的处理器状态控制](processor_state_control.md)
+ [的 I/O 调度程序 AL2](io-scheduler.md)
+ [更改您的 AL2 实例的主机名](set-hostname.md)
+ [在您的 AL2 实例上设置动态 DNS](dynamic-dns.md)
+ [使用 ec2-net-utils 配置您的网络接口 AL2](ec2-net-utils.md)

## 常见配置方案
<a name="instance-configuration-scenarios"></a>

Amazon Linux 的基本发行版包含基本服务器操作所需的软件包和实用工具。但是，各种软件存储库还提供许多软件包，还有更多软件包可供您从源代码进行构建。有关从这些位置安装和构建软件的更多信息，请参阅[管理您的 AL2 实例上的软件](managing-software.md)。

Amazon Linux 实例预配置有 `ec2-user`，但是，您可能需要添加没有超级用户权限的其他用户。有关添加和删除用户的更多信息，请参阅 *Amazon EC2 [用户指南中的管理您的Linux实例上的](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/managing-users.html)用户*。

如果您自己有注册了域名的网络，则可以更改实例的主机名，将它自身标识为该域名的一部分。您还可以在不更改主机名设置的情况下更改系统提示，以显示更有意义的名称。有关更多信息，请参阅[更改您的 AL2 实例的主机名](set-hostname.md)。您可以将实例配置成使用动态 DNS 服务提供商。有关更多信息，请参阅[在您的 AL2 实例上设置动态 DNS](dynamic-dns.md)。

当您在 Amazon EC2 中启动实例时，可以选择将用户数据传递到可用于执行常见配置任务甚至在实例启动后运行脚本的实例。您可以将两类用户数据传递到 Amazon EC2：cloud-init 指令和 Shell 脚本。有关更多信息，请参阅 *Amazon EC2 用户指南*中的[启动时在Linux实例上运行命令](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html)。

# 管理您的 AL2 实例上的软件
<a name="managing-software"></a>

Amazon Linux 的基本发行版包含基本服务器操作所需的软件包和实用工具。

此信息适用于 AL2。有关信息 AL2023，请参阅 *Amazon Linux 2023 用户指南 AL2023*[中的管理软件包和操作系统更新](https://docs.aws.amazon.com/linux/al2023/ug/managing-repos-os-updates.html)。

使软件保持最新非常重要。Linux 发行版中的许多程序包会经常更新，以修复错误、添加功能，以及防止安全漏洞。有关更多信息，请参阅 [更新您的实例上的 AL2 实例软件](install-updates.md)。

默认情况下， AL2 实例启动时会启用以下存储库：
+ `amzn2-core`
+ `amzn2extra-docker`

虽然这些存储库中有许多由更新过的软件包 AWS，但另一个存储库中可能包含您要安装的软件包。有关更多信息，请参阅 [在 AL2 实例上添加存储库](add-repositories.md)。有关在启用的存储库中查找和安装程序包的帮助，请参阅 [在 AL2 实例上查找并安装软件包](find-install-software.md)。

并非所有软件均可在存储库中存储的软件包中获得；有些软件必须在实例上从其源代码进行编译。有关更多信息，请参阅 [准备在 AL2 实例上编译软件](compile-software.md)。

AL2 实例使用 yum 包管理器管理其软件。yum 程序包管理器可安装、删除和更新软件，以及管理每个包的所有依赖关系。

**Topics**
+ [更新您的实例上的 AL2 实例软件](install-updates.md)
+ [在 AL2 实例上添加存储库](add-repositories.md)
+ [在 AL2 实例上查找并安装软件包](find-install-software.md)
+ [准备在 AL2 实例上编译软件](compile-software.md)

# 更新您的实例上的 AL2 实例软件
<a name="install-updates"></a>

使软件保持最新非常重要。Linux 发行版中的程序包会经常更新，以修复错误、添加功能，以及防止安全漏洞。当您首次启动并连接到 Amazon Linux 实例时，您可能会看到出于安全目的要求您更新软件包的消息。本节介绍如何更新整个系统或仅更新单个程序包。

此信息适用于 AL2。有关信息 AL2023，请参阅 *Amazon Linux 2023 用户指南 AL2023*[中的管理软件包和操作系统更新](https://docs.aws.amazon.com/linux/al2023/ug/managing-repos-os-updates.html)。

有关变更和更新的信息 AL2，请参阅[AL2 发行说明](https://docs.aws.amazon.com/AL2/latest/relnotes/relnotes-al2.html)。

有关变更和更新的信息 AL2023，请参阅[AL2023 发行说明](https://docs.aws.amazon.com/linux/al2023/release-notes/relnotes.html)。

**重要**  
如果您在 IPv6仅限子网中启动了使用 Amazon Linux 2 AMI 的 EC2 实例，则必须连接到该实例并运行`sudo amazon-linux-https disable`。这样，您的 AL2 实例就可以 IPv6使用 http 补丁服务通过连接到 S3 中的yum存储库。

**更新 AL2 实例上的所有软件包**

1. （可选）在 Shell 窗口中启动 **screen** 会话。有时您可能会遇到网络中断，这样会断开到实例的 SSH 连接。如果在较长的软件更新期间发生这种情况，实例处于混乱、但可恢复的状态。即使连接中断，通过 **screen** 会话也可继续运行更新，您稍后可重新连接到此会话，不会有问题。

   1. 执行 **screen** 命令以开始会话。

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

   1. 如果会话中断，请再次登录实例并列出可用屏幕。

      ```
      [ec2-user ~]$ screen -ls
      There is a screen on:
      	17793.pts-0.ip-12-34-56-78	(Detached)
      1 Socket in /var/run/screen/S-ec2-user.
      ```

   1. 使用 **screen -r** 命令和前一命令的进程 ID 重新连接到屏幕。

      ```
      [ec2-user ~]$ screen -r 17793
      ```

   1. 使用 **screen** 完成操作后，使用 **exit** 命令关闭会话。

      ```
      [ec2-user ~]$ exit
      [screen is terminating]
      ```

1. 运行 **yum update** 命令。您可以选择添加 `--security` 标记，这样仅应用安全更新。

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

1. 查看所列的程序包，输入 **y** 并按 Enter 接受更新。更新系统上的所有程序包可能需要几分钟。**yum** 输出显示更新运行状态。

1. （可选）[重启您的实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-reboot.html)，以确保您使用的是更新中的最新软件包和库；只有在重启后才会加载内核更新。更新任何 `glibc` 库后也应进行重启。对于用来控制服务的程序包的更新，重新启动服务可能就足以使更新生效，但系统重启可确保所有之前的程序包和库更新都是完整的。

**更新 AL2 实例上的单个软件包**

使用此过程可更新单个程序包 (及其依赖关系)，而非整个系统。

1. 使用要更新的程序包的名称运行 **yum update** 命令。

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

1. 查看所列的程序包信息，输入 **y** 并按 Enter 接受更新。如果存在必须解析的程序包依赖关系，有时会列出多个数据包。**yum** 输出显示更新运行状态。

1. （可选）[重启您的实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-reboot.html)，以确保您使用的是更新中的最新软件包和库；只有在重启后才会加载内核更新。更新任何 `glibc` 库后也应进行重启。对于用来控制服务的程序包的更新，重新启动服务可能就足以使更新生效，但系统重启可确保所有之前的程序包和库更新都是完整的。

# 在 AL2 实例上添加存储库
<a name="add-repositories"></a>

此信息适用于 AL2。有关信息 AL2023，请参阅 A *mazon Linux 2023 用户*指南 AL2023中的[通过版本化存储库进行确定性升级](https://docs.aws.amazon.com/linux/al2023/ug/deterministic-upgrades.html)。

默认情况下， AL2 实例启动时会启用以下存储库：
+ `amzn2-core`
+ `amzn2extra-docker`

尽管在 Amazon Web Services 更新的这些存储库中有许多程序包，但是您需要安装的程序包可能在其他存储库中。

要使用 **yum** 从不同存储库安装程序包，您需要将存储库信息添加到 `/etc/yum.conf` 文件中，或者添加到 `repository.repo` 目录中它自己的 `/etc/yum.repos.d` 文件中。您可以手动执行此操作，但大多数 yum 存储库在其存储库 URL 提供各自的 `repository.repo` 文件。

**确定已安装的 yum 存储库**  
使用以下命令列出已安装的 yum 存储库：

```
[ec2-user ~]$ yum repolist all
```

输出结果会列出已安装的存储库，并报告每个存储库的状态。启用的存储库会显示其中包含的程序包数量。

**将 yum 存储库添加到 /etc/yum.repos.d**

1. 查找 `.repo` 文件的位置。这随要添加的存储库而异。在本示例中，`.repo` 文件位于 `https://www.example.com/repository.repo`。

1. 使用 **yum-config-manager** 命令添加存储库。

   ```
   [ec2-user ~]$ sudo yum-config-manager --add-repo https://www.example.com/repository.repo
   Loaded plugins: priorities, update-motd, upgrade-helper
   adding repo from: https://www.example.com/repository.repo
   grabbing file https://www.example.com/repository.repo to /etc/yum.repos.d/repository.repo
   repository.repo                                      | 4.0 kB     00:00
   repo saved to /etc/yum.repos.d/repository.repo
   ```

安装存储库后，必须按照以下过程启用存储库。

**在 /etc/yum.repos.d 中启用 yum 存储库**  
使用带 **yum-config-manager** 标志的 `--enable repository` 命令。以下命令从 Fedora 项目启用 Extra Packages for Enterprise Linux (EPEL) 存储库。默认情况下，此存储库显示在 Amazon Linux AMI 实例上的 `/etc/yum.repos.d` 中，但未启用。

```
[ec2-user ~]$ sudo yum-config-manager --enable epel
```

欲了解更多信息并下载此软件包的最新版本，请参阅 [https://fedoraproject。 org/wiki/EPEL](https://fedoraproject.org/wiki/EPEL)。

# 在 AL2 实例上查找并安装软件包
<a name="find-install-software"></a>

您可以使用软件包管理工具来查找和安装软件包。在 Amazon Linux 2 中，默认的软件包管理工具是YUM。在中 AL2023，默认的软件包管理工具是DNF。有关更多信息，请参阅《*亚马逊 Linux 2023 用户指南*》中的 Pack [age 管理工具](https://docs.aws.amazon.com/linux/al2023/ug/package-management.html)。

## 在 AL2 实例上查找软件包
<a name="find-software"></a>

您可以使用 **yum search** 命令搜索在您配置的存储库中可用的程序包的描述。如果不知道要安装的程序包的确切名称，这尤其有帮助。只需将关键字搜索附加到该命令；对于多字词搜索，请使用引号括起搜索查询。

```
[ec2-user ~]$ yum search "find"
```

下面是示例输出。

```
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
============================== N/S matched: find ===============================
findutils.x86_64 : The GNU versions of find utilities (find and xargs)
gedit-plugin-findinfiles.x86_64 : gedit findinfiles plugin
ocaml-findlib-devel.x86_64 : Development files for ocaml-findlib
perl-File-Find-Rule.noarch : Perl module implementing an alternative interface to File::Find
robotfindskitten.x86_64 : A game/zen simulation. You are robot. Your job is to find kitten.
mlocate.x86_64 : An utility for finding files by name
ocaml-findlib.x86_64 : Objective CAML package manager and build helper
perl-Devel-Cycle.noarch : Find memory cycles in objects
perl-Devel-EnforceEncapsulation.noarch : Find access violations to blessed objects
perl-File-Find-Rule-Perl.noarch : Common rules for searching for Perl things
perl-File-HomeDir.noarch : Find your home and other directories on any platform
perl-IPC-Cmd.noarch : Finding and running system commands made easy
perl-Perl-MinimumVersion.noarch : Find a minimum required version of perl for Perl code
texlive-xesearch.noarch : A string finder for XeTeX
valgrind.x86_64 : Tool for finding memory management bugs in programs
valgrind.i686 : Tool for finding memory management bugs in programs
```

引号中的多个字词搜索查询仅返回符合确切查询的结果。如果您没有看到需要的程序包，请将搜索简化为一个关键字，然后扫描结果。您还可以尝试使用关键字同义词来扩大搜索范围。

有关软件包的更多信息 AL2，请参阅以下内容：
+ [AL2 额外内容库](al2-extras.md)
+ [程序包存储库](ec2.md#package-repository)

## 在 AL2 实例上安装软件包
<a name="install-software"></a>

在中 AL2，yum 软件包管理工具会在所有已启用的存储库中搜索不同的软件包，并处理软件安装过程中的任何依赖关系。有关在中安装软件包的信息 AL2023，请参阅 *Amazon Linux 2023 用户指南*中的[管理软件包和操作系统更新](https://docs.aws.amazon.com/linux/al2023/ug/managing-repos-os-updates.html)。

**从存储库安装软件包**  
使用**yum install *package***命令，*package*替换为要安装的软件的名称。例如，若要安装 **links** 基于文本的 Web 浏览器，请输入以下命令。

```
[ec2-user ~]$ sudo yum install links
```

**安装您已下载的 RPM 软件包文件**  
您还可使用 **yum install** 安装您已经从互联网下载的 RPM 程序包文件。为此，将 RPM 文件的路径名称而不是存储库程序包名称附加到安装命令。

```
[ec2-user ~]$ sudo yum install my-package.rpm
```

**列出已安装软件包**  
要查看实例上已安装的软件包的列表，请使用以下命令。

```
[ec2-user ~]$ yum list installed
```

# 准备在 AL2 实例上编译软件
<a name="compile-software"></a>

互联网上有开源软件，这些软件尚未预编译，可从程序包存储库下载。您可能最终会发现需要您亲自从源代码编译的软件包。为了使您的系统能够在 AL2 Amazon Linux 中编译软件，您需要安装多种开发工具**make**，例如**gcc**、和**autoconf**。

因为软件编译不是每个 Amazon EC2 实例都需要的任务，所以在默认情况下不安装这些工具，不过，称为“开发工具”的程序包组中包含这些工具，而这个程序包组可通过 **yum groupinstall** 命令方便地添加到实例。

```
[ec2-user ~]$ sudo yum groupinstall "Development Tools"
```

软件源代码包通常可以作为压缩存档文件（称为 tarbal [l）下载（从 [https://github.com/](https://github.com/)和 http://sourceforge.net/](https://sourceforge.net/) 等网站）。这些 tarball 的文件扩展名通常为 `.tar.gz`。您可以使用 **tar** 命令解压缩这些存档。

```
[ec2-user ~]$ tar -xzf software.tar.gz
```

将源代码包解压并解档后，应在源代码目录中查找 `README` 或 `INSTALL` 文件，这些文件包含有关编译和安装源代码的进一步说明。

**检索 Amazon Linux 程序包的源代码**  
Amazon Web Services 提供所维护的程序包的源代码。您可以使用 **yumdownloader --source** 命令下载已安装的任何程序包的源代码。

运行**yumdownloader --source *package***命令下载的源代码*package*。例如，若要下载 `htop` 程序包的源代码，请输入以下命令。

```
[ec2-user ~]$ yumdownloader --source htop

Loaded plugins: priorities, update-motd, upgrade-helper
Enabling amzn-updates-source repository
Enabling amzn-main-source repository
amzn-main-source                                                                                              | 1.9 kB  00:00:00     
amzn-updates-source                                                                                           | 1.9 kB  00:00:00     
(1/2): amzn-updates-source/latest/primary_db                                                                  |  52 kB  00:00:00     
(2/2): amzn-main-source/latest/primary_db                                                                     | 734 kB  00:00:00     
htop-1.0.1-2.3.amzn1.src.rpm
```

源 RPM 的位置位于您运行命令的目录中。

# 您的 Amazon EC2 AL2 实例的处理器状态控制
<a name="processor_state_control"></a>

C 状态控制当核心处于空闲状态时可以进入的睡眠级别。C 状态从 C0 (最浅空闲状态，此时核心完全唤醒并在执行指令) 开始编号，一直增进到 C6 (最深空闲状态，此时核心关闭)。

P 状态控制核心的所需性能（以 CPU 频率表示）。P 状态从 P0 (最高性能设置，此时核心可以使用 Intel 睿频加速技术提高频率) 开始编号，然后从 P1 (请求最大基准频率的 P 状态) 一直增加到 P15 (可能最低的频率)。

改变 C 状态或 P 状态设置可以增加处理器性能一致性，减少延迟，还可以针对特定工作负载对实例进行调校。默认 C 状态和 P 状态设置可提供最大性能，是大多数工作负载的最佳选择。但是，如果您的应用程序更适合以牺牲较高的单核或双核频率的方式来降低延迟，或需要在较低频率下保持稳定性能 (而不适合使用突发式睿频加速频率)，那么可以考虑运用对这些实例可用的 C 状态或 P 状态设置。

有关允许操作系统控制处理器 C 状态和 P 状态的 Amazon EC2 实例类型的信息，请参阅 Amazon EC2 *用户*指南[中的 Amazon EC2 实例的处理器状态控制](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/processor_state_control.html)。

以下部分介绍了不同的处理器状态配置以及如何监控配置效果。这些程序是为亚马逊 Linux 编写的，适用于亚马逊 Linux；但是，它们也可能适用于其他 Linux 内核版本为 3.9 或更高版本的 Linux 发行版。

**注意**  
本页上的示例使用以下内容：  
显示处理器频率和 C 状态信息的 **turbostat** 实用程序。默认情况下，**turbostat** 实用程序在 Amazon Linux 上提供。
模拟工作负载的 **stress** 命令。若要安装 **stress**，首先通过运行 **sudo amazon-linux-extras install epel** 启用 EPEL 存储库，然后运行 **sudo yum install -y stress**。
如果输出不显示 C 状态信息，请在命令中加入 **--debug** 选项 (**sudo turbostat --debug stress *<options>***)。

**Topics**
+ [具有最大睿频加速频率的最高性能](#turbo-perf)
+ [通过限制深层 C 状态实现高性能和低延迟](#c-states)
+ [变化最少的基准性能](#baseline-perf)

## 具有最大睿频加速频率的最高性能
<a name="turbo-perf"></a>

这是 Amazon Linux AMI 的默认处理器状态控制配置，推荐大多数工作负载使用。此配置可提供最高性能，且变化更少。允许非活动核心进入深层睡眠状态可提供单核或双核进程所需的热空间，以达到最大睿频加速潜能。

以下示例显示了具有两个有效执行工作且达到其最大处理器睿频加速频率的核心的 `c4.8xlarge` 实例。

```
[ec2-user ~]$ sudo turbostat stress -c 2 -t 10
stress: info: [30680] dispatching hogs: 2 cpu, 0 io, 0 vm, 0 hdd
stress: info: [30680] successful run completed in 10s
pk cor CPU    %c0  GHz  TSC SMI    %c1    %c3    %c6    %c7   %pc2   %pc3   %pc6   %pc7  Pkg_W RAM_W PKG_% RAM_%
             5.54 3.44 2.90   0   9.18   0.00  85.28   0.00   0.00   0.00   0.00   0.00  94.04 32.70 54.18  0.00
 0   0   0   0.12 3.26 2.90   0   3.61   0.00  96.27   0.00   0.00   0.00   0.00   0.00  48.12 18.88 26.02  0.00
 0   0  18   0.12 3.26 2.90   0   3.61
 0   1   1   0.12 3.26 2.90   0   4.11   0.00  95.77   0.00
 0   1  19   0.13 3.27 2.90   0   4.11
 0   2   2   0.13 3.28 2.90   0   4.45   0.00  95.42   0.00
 0   2  20   0.11 3.27 2.90   0   4.47
 0   3   3   0.05 3.42 2.90   0  99.91   0.00   0.05   0.00
 0   3  21  97.84 3.45 2.90   0   2.11
...
 1   1  10   0.06 3.33 2.90   0  99.88   0.01   0.06   0.00
 1   1  28  97.61 3.44 2.90   0   2.32
...
10.002556 sec
```

在此示例中，v CPUs 21 和 28 以其最大睿频加速频率运行，因为其他内核已进入`C6`睡眠状态以节省功耗并为工作内核提供功率和散热空间。v CPUs 3 和 10（分别与 v CPUs 21 和 28 共享一个处理器内核）处于该`C1`状态，正在等待指令。

在以下示例中，所有 18 个内核都在积极执行工作，因此没有空间来实现最大睿频加速，但它们都以 3.2 GHz 的 “全核 Turbo Boost” 速度运行。

```
[ec2-user ~]$ sudo turbostat stress -c 36 -t 10
stress: info: [30685] dispatching hogs: 36 cpu, 0 io, 0 vm, 0 hdd
stress: info: [30685] successful run completed in 10s
pk cor CPU    %c0  GHz  TSC SMI    %c1    %c3    %c6    %c7   %pc2   %pc3   %pc6   %pc7  Pkg_W RAM_W PKG_% RAM_%
            99.27 3.20 2.90   0   0.26   0.00   0.47   0.00   0.00   0.00   0.00   0.00 228.59 31.33 199.26  0.00
 0   0   0  99.08 3.20 2.90   0   0.27   0.01   0.64   0.00   0.00   0.00   0.00   0.00 114.69 18.55 99.32  0.00
 0   0  18  98.74 3.20 2.90   0   0.62
 0   1   1  99.14 3.20 2.90   0   0.09   0.00   0.76   0.00
 0   1  19  98.75 3.20 2.90   0   0.49
 0   2   2  99.07 3.20 2.90   0   0.10   0.02   0.81   0.00
 0   2  20  98.73 3.20 2.90   0   0.44
 0   3   3  99.02 3.20 2.90   0   0.24   0.00   0.74   0.00
 0   3  21  99.13 3.20 2.90   0   0.13
 0   4   4  99.26 3.20 2.90   0   0.09   0.00   0.65   0.00
 0   4  22  98.68 3.20 2.90   0   0.67
 0   5   5  99.19 3.20 2.90   0   0.08   0.00   0.73   0.00
 0   5  23  98.58 3.20 2.90   0   0.69
 0   6   6  99.01 3.20 2.90   0   0.11   0.00   0.89   0.00
 0   6  24  98.72 3.20 2.90   0   0.39
...
```

## 通过限制深层 C 状态实现高性能和低延迟
<a name="c-states"></a>

C 状态控制当核心处于非活动状态时可能进入的睡眠级别。您可能需要控制 C 状态来调校系统的延迟与性能。将核心置于睡眠状态需要时间，尽管睡眠中的核心可为其他核心提供更多空间以加速至更高频率，但该睡眠中的核心也需要时间来重新唤醒并执行工作。例如，如果某个负责处理网络数据包中断的核心处于睡眠状态，那么在处理此类中断时可能会出现延迟。您可以将系统配置为不使用深层 C 状态，这可以降低处理器的反应延迟，但反过来也会减少其他核心达到睿频加速频率可用的空间。

禁用深层睡眠状态的常见情形是 Redis 数据库应用程序，该应用程序将数据库存储在系统内存中，以实现最快速的查询响应。

**要限制深度睡眠状态，请开启 AL2**

1. 使用所选编辑器打开 `/etc/default/grub` 文件。

   ```
   [ec2-user ~]$ sudo vim /etc/default/grub
   ```

1. 编辑 `GRUB_CMDLINE_LINUX_DEFAULT` 行并添加 `intel_idle.max_cstate=1` 和 `processor.max_cstate=1` 选项，以将 `C1` 设置为空闲内核的最深层 C 状态。

   ```
   GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0 nvme_core.io_timeout=4294967295 intel_idle.max_cstate=1 processor.max_cstate=1"
   GRUB_TIMEOUT=0
   ```

   `intel_idle.max_cstate=1` 选项用于为基于英特尔处理器的实例配置 C 状态限制，`processor.max_cstate=1` 选项用于为基于 AMD 处理器的实例配置 C 状态限制。您可以放心将这两个选项添加到配置中。这可实现通过单个配置在英特尔和 AMD 处理器上设置所需的行为。

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

1.  运行以下命令重新构建启动配置。

   ```
   [ec2-user ~]$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg
   ```

1. 重启实例以启用新的内核选项。

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

**限制 Amazon Linux AMI 上的深层睡眠状态**

1. 使用所选编辑器打开 `/boot/grub/grub.conf` 文件。

   ```
   [ec2-user ~]$ sudo vim /boot/grub/grub.conf
   ```

1. 编辑第一个条目的 `kernel` 行并添加 `intel_idle.max_cstate=1` 和 `processor.max_cstate=1` 选项，以将 `C1` 设置为空闲内核的最深层 C 状态。

   ```
   # created by imagebuilder
   default=0
   timeout=1
   hiddenmenu
   
   title Amazon Linux 2014.09 (3.14.26-24.46.amzn1.x86_64)
   root (hd0,0)
   kernel /boot/vmlinuz-3.14.26-24.46.amzn1.x86_64 root=LABEL=/ console=ttyS0 intel_idle.max_cstate=1  processor.max_cstate=1
   initrd /boot/initramfs-3.14.26-24.46.amzn1.x86_64.img
   ```

   `intel_idle.max_cstate=1` 选项用于为基于英特尔处理器的实例配置 C 状态限制，`processor.max_cstate=1` 选项用于为基于 AMD 处理器的实例配置 C 状态限制。您可以放心将这两个选项添加到配置中。这可实现通过单个配置在英特尔和 AMD 处理器上设置所需的行为。

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

1. 重启实例以启用新的内核选项。

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

以下示例显示的 `c4.8xlarge` 实例具有两个以“所有核心睿频加速”核心频率有效执行工作的核心。

```
[ec2-user ~]$ sudo turbostat stress -c 2 -t 10
stress: info: [5322] dispatching hogs: 2 cpu, 0 io, 0 vm, 0 hdd
stress: info: [5322] successful run completed in 10s
pk cor CPU    %c0  GHz  TSC SMI    %c1    %c3    %c6    %c7   %pc2   %pc3   %pc6   %pc7  Pkg_W RAM_W PKG_% RAM_%
             5.56 3.20 2.90   0  94.44   0.00   0.00   0.00   0.00   0.00   0.00   0.00 131.90 31.11 199.47  0.00
 0   0   0   0.03 2.08 2.90   0  99.97   0.00   0.00   0.00   0.00   0.00   0.00   0.00  67.23 17.11 99.76  0.00
 0   0  18   0.01 1.93 2.90   0  99.99
 0   1   1   0.02 1.96 2.90   0  99.98   0.00   0.00   0.00
 0   1  19  99.70 3.20 2.90   0   0.30
...
 1   1  10   0.02 1.97 2.90   0  99.98   0.00   0.00   0.00
 1   1  28  99.67 3.20 2.90   0   0.33
 1   2  11   0.04 2.63 2.90   0  99.96   0.00   0.00   0.00
 1   2  29   0.02 2.11 2.90   0  99.98
...
```

在此示例中，v CPUs 19 和 28 的内核以 3.2 的速度运行 GHz，其他内核处于 `C1` C 状态，正在等待指令。虽然运行中的核心没有达到其最大睿频加速频率，但非活动核心对新请求的响应速度将比其处于深层 `C6` C 状态时快得多。

## 变化最少的基准性能
<a name="baseline-perf"></a>

您可以通过 P 状态减少处理器频率的变化。P 状态控制核心的所需性能 (以 CPU 频率的形式)。大多数工作负载在 P0 状态下性能更好，该状态要求采用睿频加速频率。但是，您可能需要调校系统以获得稳定性能而非突发式性能，而突发式性能可能会在启用睿频加速频率后出现。

英特尔高级矢量扩展（AVX 或 AVX2）工作负载可以在较低的频率下表现良好，而 AVX 指令可以消耗更多的功率。通过禁用睿频加速来以较低的频率运行处理器，可以降低所使用的性能并保持更稳定的速度。有关优化实例配置和 AVX 工作负载的更多信息，请参阅 [英特尔公司网站](https://www.intel.com/content/www/us/en/developer/articles/technical/the-intel-advanced-vector-extensions-512-feature-on-intel-xeon-scalable.html?wapkw=advanced%20vector%20extensions)。

CPU 空闲驱动程序用于控制 P 状态。较新一代的 CPU 需要更新与内核级别对应的 CPU 空闲驱动程序，如下所示：
+ Linux 内核版本 6.1 及更高版本 — 支持英特尔 Granite Rapids（例如 R8i）
+ Linux 内核版本 5.10 及更高版本 — 支持 AMD Milan（例如 m6a）
+ Linux 内核版本 5.6 及更高版本 — 支持英特尔 Icelake（例如 M6i）

要检测正在运行的系统的内核是否识别 CPU，请运行以下命令。

```
if [ -d /sys/devices/system/cpu/cpu0/cpuidle ]; then echo "C-state control enabled"; else echo "Kernel cpuidle driver does not recognize this CPU generation"; fi
```

如果此命令的输出指示不支持，则建议您升级内核。

此部分介绍了如何限制深层睡眠状态以及禁用睿频加速 (通过请求 `P1` P 状态)，从而为这些类型的工作负载提供低延迟和最少的处理器速度变化。

**要限制深度睡眠状态并禁用 Turbo Boost 开启 AL2**

1. 使用所选编辑器打开 `/etc/default/grub` 文件。

   ```
   [ec2-user ~]$ sudo vim /etc/default/grub
   ```

1. 编辑 `GRUB_CMDLINE_LINUX_DEFAULT` 行并添加 `intel_idle.max_cstate=1` 和 `processor.max_cstate=1` 选项，以将 `C1` 设置为空闲内核的最深层 C 状态。

   ```
   GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0 nvme_core.io_timeout=4294967295 intel_idle.max_cstate=1 processor.max_cstate=1"
   GRUB_TIMEOUT=0
   ```

   `intel_idle.max_cstate=1` 选项用于为基于英特尔处理器的实例配置 C 状态限制，`processor.max_cstate=1` 选项用于为基于 AMD 处理器的实例配置 C 状态限制。您可以放心将这两个选项添加到配置中。这可实现通过单个配置在英特尔和 AMD 处理器上设置所需的行为。

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

1.  运行以下命令重新构建启动配置。

   ```
   [ec2-user ~]$ grub2-mkconfig -o /boot/grub2/grub.cfg
   ```

1. 重启实例以启用新的内核选项。

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

1. 如果您需要 `P1` P 状态提供的较少处理器速度变化，请运行以下命令禁用睿频加速。

   ```
   [ec2-user ~]$ sudo sh -c "echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo"
   ```

1. 在工作负载完成后，您可以使用以下命令重新启用睿频加速。

   ```
   [ec2-user ~]$ sudo sh -c "echo 0 > /sys/devices/system/cpu/intel_pstate/no_turbo"
   ```

**限制 Amazon Linux AMI 上的深层睡眠状态并禁用睿频加速**

1. 使用所选编辑器打开 `/boot/grub/grub.conf` 文件。

   ```
   [ec2-user ~]$ sudo vim /boot/grub/grub.conf
   ```

1. 编辑第一个条目的 `kernel` 行并添加 `intel_idle.max_cstate=1` 和 `processor.max_cstate=1` 选项，以将 `C1` 设置为空闲内核的最深层 C 状态。

   ```
   # created by imagebuilder
   default=0
   timeout=1
   hiddenmenu
   
   title Amazon Linux 2014.09 (3.14.26-24.46.amzn1.x86_64)
   root (hd0,0)
   kernel /boot/vmlinuz-3.14.26-24.46.amzn1.x86_64 root=LABEL=/ console=ttyS0 intel_idle.max_cstate=1 processor.max_cstate=1
   initrd /boot/initramfs-3.14.26-24.46.amzn1.x86_64.img
   ```

   `intel_idle.max_cstate=1` 选项用于为基于英特尔处理器的实例配置 C 状态限制，`processor.max_cstate=1` 选项用于为基于 AMD 处理器的实例配置 C 状态限制。您可以放心将这两个选项添加到配置中。这可实现通过单个配置在英特尔和 AMD 处理器上设置所需的行为。

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

1. 重启实例以启用新的内核选项。

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

1. 如果您需要 `P1` P 状态提供的较少处理器速度变化，请运行以下命令禁用睿频加速。

   ```
   [ec2-user ~]$ sudo sh -c "echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo"
   ```

1. 在工作负载完成后，您可以使用以下命令重新启用睿频加速。

   ```
   [ec2-user ~]$ sudo sh -c "echo 0 > /sys/devices/system/cpu/intel_pstate/no_turbo"
   ```

以下示例显示了一个具有 2 V 的`c4.8xlarge`实例，在基准核心频率下CPUs 主动执行工作，但没有睿频加速。

```
[ec2-user ~]$ sudo turbostat stress -c 2 -t 10
stress: info: [5389] dispatching hogs: 2 cpu, 0 io, 0 vm, 0 hdd
stress: info: [5389] successful run completed in 10s
pk cor CPU    %c0  GHz  TSC SMI    %c1    %c3    %c6    %c7   %pc2   %pc3   %pc6   %pc7  Pkg_W RAM_W PKG_% RAM_%
             5.59 2.90 2.90   0  94.41   0.00   0.00   0.00   0.00   0.00   0.00   0.00 128.48 33.54 200.00  0.00
 0   0   0   0.04 2.90 2.90   0  99.96   0.00   0.00   0.00   0.00   0.00   0.00   0.00  65.33 19.02 100.00  0.00
 0   0  18   0.04 2.90 2.90   0  99.96
 0   1   1   0.05 2.90 2.90   0  99.95   0.00   0.00   0.00
 0   1  19   0.04 2.90 2.90   0  99.96
 0   2   2   0.04 2.90 2.90   0  99.96   0.00   0.00   0.00
 0   2  20   0.04 2.90 2.90   0  99.96
 0   3   3   0.05 2.90 2.90   0  99.95   0.00   0.00   0.00
 0   3  21  99.95 2.90 2.90   0   0.05
...
 1   1  28  99.92 2.90 2.90   0   0.08
 1   2  11   0.06 2.90 2.90   0  99.94   0.00   0.00   0.00
 1   2  29   0.05 2.90 2.90   0  99.95
```

v CPUs 21 和 28 的内核以 2.9 的基准处理器速度积极执行工作 GHz，所有非活动内核也在 `C1` C 状态下以基准速度运行，随时可以接受指令。

# 的 I/O 调度程序 AL2
<a name="io-scheduler"></a>

I/O scheduler is a part of the Linux operating system that sorts and merges I/O请求并决定它们的处理顺序。

I/O schedulers are particularly beneficial for devices such as magnetic hard drives, where seek time can be expensive and where it is optimal to merge co-located requests. I/O调度程序对固态设备和虚拟化环境的影响较小。这是因为对于固态设备而言，顺序访问与随机访问没有区别，而对于虚拟化环境，则由主机提供自定义的调度层。

本主题讨论亚马逊 Linux I/O 计划程序。有关其它 Linux 发行版使用的输入/输出调度器的更多信息，请参阅其文档。

**Topics**
+ [支持的调度器](#supported-schedulers)
+ [默认调度器](#default-schedulers)
+ [更改调度器](#change-scheduler)

## 支持的调度器
<a name="supported-schedulers"></a>

亚马逊 Linux 支持以下 I/O 调度程序：
+ `deadline`— Deadl *in* I/O e 调度器对 I/O 请求进行排序，并按最高效的顺序处理请求。它保证每个待处理时间过长的I/O request. It also gives I/O请求都有更高的优先级的开始时间。
+ `cfq`— *完全公平队列* (CFQ) I/O 调度程序尝试将I/O resources between processes. It sorts and inserts I/O请求公平地分配到每个进程的队列中。
+ `noop`— “*无操作*” (noop) I/O scheduler inserts all I/O 请求放入 FIFO 队列，然后将它们合并为一个请求。此调度器不会排序任何请求。

## 默认调度器
<a name="default-schedulers"></a>

无操作 (noop) 是 Amazon Linux 的默认 I/O 调度程序。使用此调度器的原因如下：
+ 许多实例类型都使用虚拟化设备，其中底层主机会为实例执行调度。
+ 固态设备用于许多实例类型，在这些实例类型中， I/O 调度程序的优势影响较小。
+ 它是侵入性最小的 I/O 调度程序，可以根据需要对其进行自定义。

## 更改调度器
<a name="change-scheduler"></a>

更改 I/O 调度器可以提高或降低性能，具体取决于调度程序是在给定时间内完成更多还是更少的 I/O 请求。这在很大程度上取决于您的工作负载、正在使用的实例类型的生成以及正在访问的设备的类型。如果您更改正在使用的 I/O 调度程序，我们建议您使用诸如 **iotop 之类**的工具来衡量 I/O 性能并确定更改是否对您的用例有利。

您可以使用以下命令查看设备的 I/O 调度程序，该命令`nvme0n1`用作示例。将以下命令中的 `nvme0n1` 替换为您实例上的 `/sys/block` 中列出的设备。

```
$  cat /sys/block/nvme0n1/queue/scheduler
```

要为设备设置 I/O 调度程序，请使用以下命令。

```
$  echo cfq|deadline|noop > /sys/block/nvme0n1/queue/scheduler
```

例如，要将*xvda*设备的 I/O 调度程序设置为`cfq`，`noop`请使用以下命令。

```
$  echo cfq > /sys/block/xvda/queue/scheduler
```

# 更改您的 AL2 实例的主机名
<a name="set-hostname"></a>

当您将实例启动到私有 VPC 中时，Amazon EC2 会分配一个来宾操作系统主机名。Amazon EC2 分配的主机名类型取决于您的子网设置。有关 EC2 主机名的更多信息，请参阅 [Amazon EC2 *用户指南中的 Amazon EC2* 实例主机名类型](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-naming.html)。

配置为使用基于 IP 的命名和 IPv4 地址的 EC2 实例的典型 Amazon EC2 私有 DNS 名称如下所示：`ip-12-34-56-78.us-west-2.compute.internal`，其中名称由内部域、服务（在本例中为`compute`）、区域和一种形式的私有 IPv4 地址组成。当您登录实例时，Shell 提示符处显示此主机名的一部分 (例如，`ip-12-34-56-78`)。每次停止并重启 Amazon EC2 实例时（除非您使用的是弹性 IP 地址），公有 IPv4 地址都会更改，您的公有 DNS 名称、系统主机名和 shell 提示符也会发生变化。

**重要**  
此信息适用于 Amazon Linux。有关其他发布版本的信息，请参阅特定于该版本的文档。

## 更改系统主机名
<a name="set-hostname-system"></a>

如果为实例的 IP 地址注册了公用 DNS 名称 (如 `webserver.mydomain.com`)，则可以设置系统主机名，以便实例将自己标识为该域的一部分。这还会更改 shell 提示符，使其显示此名称的第一部分，而不是由 AWS （例如`ip-12-34-56-78`）提供的主机名。如果没有注册公用 DNS 名，还是可以更改主机名，但过程略有差异。

为使主机名持续更新，您必须确认 `preserve_hostname` cloud-init 设置已设为 `true`。您可以运行以下命令来编辑或添加此设置：

```
sudo vi /etc/cloud/cloud.cfg
```

如果未列出 `preserve_hostname` 设置，请在文件末尾添加以下文本行：

```
preserve_hostname: true
```

**将系统主机名更改为公用 DNS 名称**

如果已注册了公用 DNS 名称，请执行此过程。

1. 
   + 对于 AL2：使用**hostnamectl**命令设置您的主机名以反映完全限定的域名（例如**webserver.mydomain.com**）。

     ```
     [ec2-user ~]$ sudo hostnamectl set-hostname webserver.mydomain.com
     ```
   + 对于 Amazon Linux AMI：在您的实例上，使用常用的文本编辑器打开 `/etc/sysconfig/network` 配置文件，更改 `HOSTNAME` 条目以反映完全限定域名（例如 **webserver.mydomain.com**）。

     ```
     HOSTNAME=webserver.mydomain.com
     ```

1. 重启实例以接受新主机名。

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

   或者，您也可以使用 Amazon EC2 控制台重启（在**实例**页面上，选择实例，然后依次选择**实例状态**、**重启实例**）。

1. 登录实例，验证主机名是否已更新。提示符应显示新主机名（直到第一个“.”），**hostname** 命令应显示完全限定域名。

   ```
   [ec2-user@webserver ~]$ hostname
   webserver.mydomain.com
   ```

**在无公用 DNS 名称的情况下更改系统主机名**

1. 
   + 对于 AL2：使用**hostnamectl**命令设置您的主机名以反映所需的系统主机名（例如**webserver**）。

     ```
     [ec2-user ~]$ sudo hostnamectl set-hostname webserver.localdomain
     ```
   + 对于 Amazon Linux AMI：在您的实例上，使用常用的文本编辑器打开 `/etc/sysconfig/network` 配置文件，更改 `HOSTNAME` 条目以反映所需的系统主机名（例如 **webserver**）。

     ```
     HOSTNAME=webserver.localdomain
     ```

1. 在您常用的文本编辑器中打开 `/etc/hosts` 文件，更改以 **127.0.0.1** 开始的条目，以匹配以下示例，替换为您自己的主机名。

   ```
   127.0.0.1 webserver.localdomain webserver localhost4 localhost4.localdomain4
   ```

1. 重启实例以接受新主机名。

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

   或者，您也可以使用 Amazon EC2 控制台重启（在**实例**页面上，选择实例，然后依次选择**实例状态**、**重启实例**）。

1. 登录实例，验证主机名是否已更新。提示符应显示新主机名（直到第一个“.”），**hostname** 命令应显示完全限定域名。

   ```
   [ec2-user@webserver ~]$ hostname
   webserver.localdomain
   ```

您还可以实施更多的编程解决方案，例如指定用户数据以配置您的实例。如果您的实例是自动扩缩组的一部分，您可以使用生命周期挂钩定义用户数据。有关更多信息，请参阅《AWS CloudFormation 用户指南》中的[启动时在 Linux 实例上运行命令](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html)和[用于实例启动的生命周期挂钩](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-lifecyclehook.html#aws-resource-autoscaling-lifecyclehook--examples--Lifecycle_hook_for_instance_launch)。

## 在不影响主机名的情况下更改 Shell 提示符
<a name="set-hostname-shell"></a>

如果您不想修改实例的主机名，但希望显示比提供的私有名称（例如**webserver**）更有用的系统名称 AWS （例如`ip-12-34-56-78`），则可以编辑 shell 提示符配置文件以显示您的系统昵称而不是主机名。

**将 Shell 提示符更改为主机别名**

1. 在 `/etc/profile.d` 中创建一个文件，用于将称为 `NICKNAME` 的环境变量设置为要在 Shell 提示符中显示的值。例如，若要将系统别名设置为 **webserver**，请运行以下命令。

   ```
   [ec2-user ~]$ sudo sh -c 'echo "export NICKNAME=webserver" > /etc/profile.d/prompt.sh'
   ```

1. 使用您常用的文本编辑器（例如 `/etc/bashrc` 或 `/etc/bash.bashrc`）打开 **vim** (Red Hat) 或 **nano** (Debian/Ubuntu) 文件。您需要在编辑器命令中使用 **sudo**，因为 `/etc/bashrc` 和 `/etc/bash.bashrc` 归 `root` 所有。

1. 编辑文件，将 Shell 提示符变量 (`PS1`) 更改为显示别名而不是主机名。在 `/etc/bashrc` 或 `/etc/bash.bashrc` 中查找以下设置 Shell 提示符的行（为了上下文需要，下面多显示了几行；查找以 `[ "$PS1"` 开头的行）：

   ```
     # Turn on checkwinsize
     shopt -s checkwinsize
     [ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \W]\\$ "
     # You might want to have e.g. tty in prompt (e.g. more virtual machines)
     # and console windows
   ```

   将该行中的 `\h` (`hostname` 的符号) 更改为 `NICKNAME` 变量的值。

   ```
     # Turn on checkwinsize
     shopt -s checkwinsize
     [ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@$NICKNAME \W]\\$ "
     # You might want to have e.g. tty in prompt (e.g. more virtual machines)
     # and console windows
   ```

1. (可选) 要将 Shell 窗口上的标题设置为新别名，请完成以下步骤。

   1. 创建一个名为的文件 `/etc/sysconfig/bash-prompt-xterm`。

      ```
      [ec2-user ~]$ sudo touch /etc/sysconfig/bash-prompt-xterm
      ```

   1. 使用以下命令使该文件可执行。

      ```
      [ec2-user ~]$ sudo chmod +x /etc/sysconfig/bash-prompt-xterm
      ```

   1. 在您常用的文本编辑器（如 **nano** 或 **vim**）中打开 `/etc/sysconfig/bash-prompt-xterm` 文件。您需要在编辑器命令中使用 **sudo**，因为 `/etc/sysconfig/bash-prompt-xterm` 归 `root` 所有。

   1. 将以下行添加到该文件。

      ```
      echo -ne "\033]0;${USER}@${NICKNAME}:${PWD/#$HOME/~}\007"
      ```

1. 注销，再重新登录，以接受新别名值。

## 在其他 Linux 发行版上更改主机名
<a name="set-hostname-other-linux"></a>

此页面上的过程仅适用于 Amazon Linux。有关其他 Linux 发行版的更多信息，请参阅其特定文档和下列文章：
+ [如何为运行 RHEL 7 或 Centos 7 的私有 Amazon EC2 实例分配静态主机名？](https://aws.amazon.com/premiumsupport/knowledge-center/linux-static-hostname-rhel7-centos7/)

# 在您的 AL2 实例上设置动态 DNS
<a name="dynamic-dns"></a>

当您启动 EC2 实例时，系统会为其分配公有 IP 地址和公有域名系统（DNS）名称，您可以通过互联网访问这些地址和名称。因为 Amazon Web Services 域中有非常多主机，所以这些公用名称必须足够长才能使每个名称保持唯一。典型的 Amazon EC2 公有 DNS 名称如下所示：`ec2-12-34-56-78.us-west-2.compute.amazonaws.com`，其中名称由 Amazon Web Services 域、服务（在本例中为`compute`） AWS 区域、和一种形式的公有 IP 地址组成。

动态 DNS 服务在其域区域中提供自定义主机名，这些主机名便于记忆，也与主机的使用案例更为相关。其中一些服务也是免费的。您可以对 Amazon EC2 使用动态 DNS 提供商，可以将实例配置为每次实例启动时都更新与公用 DNS 名称关联的 IP 地址。有许多不同的提供商可以选择，本指南不介绍有关如何选择提供商以及如何向它们注册名称的具体详细信息。<a name="procedure-dynamic-dns"></a>

**对 Amazon EC2 使用动态 DNS**

1. 向动态 DNS 服务提供商注册并利用其服务注册公用 DNS 名称。这个过程使用来自 [noip.com/free](https://www.noip.com/free) 的免费服务作为示例。

1. 配置动态 DNS 更新客户端。有了动态 DNS 服务提供商并且使用其服务注册了公用 DNS 名称后，将 DNS 名称指向实例的 IP 地址。很多提供商（包括 [noip.com](https://noip.com)）允许您从您在其网站上的账户页手动执行此操作，不过很多也支持软件更新客户端。如果更新客户端正在 EC2 实例上运行，则每次 IP 地址更改（如关机和重启后）都会更新动态 DNS 记录。在本例中，将安装 noip2 客户端，该客户端利用 [noip.com](https://noip.com) 提供的服务。

   1. 启用适用于企业 Linux 的额外软件包 (EPEL) 存储库以获得对`noip2`客户端的访问权限。
**注意**  
AL2 实例默认安装了 EPEL 存储库的 GPG 密钥和存储库信息。欲了解更多信息并下载此软件包的最新版本，请参阅 [https://fedoraproject。 org/wiki/EPEL](https://fedoraproject.org/wiki/EPEL)。

      ```
      [ec2-user ~]$ sudo amazon-linux-extras install epel -y
      ```

   1. 安装 `noip` 软件包。

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

   1. 创建配置文件。在提示时输入登录名和密码信息，并回答后续问题以配置客户端。

      ```
      [ec2-user ~]$ sudo noip2 -C
      ```

1. 启用 noip 服务。

   ```
   [ec2-user ~]$ sudo systemctl enable noip.service
   ```

1. 启动 noip 服务。

   ```
   [ec2-user ~]$ sudo systemctl start noip.service
   ```

   该命令启动客户端，读取先前创建的配置文件 (`/etc/no-ip2.conf`)，并且更新您选择的公用 DNS 名称的 IP 地址。

1. 验证更新客户端是否已为动态 DNS 名称设置了正确的 IP 地址。等待几分钟使 DNS 记录进行更新，然后尝试使用您在此过程中配置的公有 DNS 名称通过 SSH 连接到实例。

# 使用 ec2-net-utils 配置您的网络接口 AL2
<a name="ec2-net-utils"></a>

Amazon Linux 2 AMIs 可能包含安装的其他脚本 AWS，称为 ec2-net-utils。这些脚本可以选择性地自动配置您的网络接口。这些脚本 AL2 仅适用于。

**注意**  
对于 Amazon Linux 2023，该`amazon-ec2-net-utils`软件包会在目录中生成特定于接口的`/run/systemd/network`配置。有关更多信息，请参阅 * Amazon Linux 2023 用户指南*中的[联网服务](https://docs.aws.amazon.com/linux/al2023/ug/networking-service.html)。

如果软件包尚未安装，则使用以下命令将其安装在上； AL2 如果已安装并且有其他更新可用，则使用以下命令对其进行更新：

```
$ yum install ec2-net-utils
```

以下组件属于 ec2-net-utils 的一部分；

udev 规则 (`/etc/udev/rules.d`)  
在网络接口附加、分离或重新附加正在运行的实例时识别它们，并确保 hotplug 脚本运行 (`53-ec2-network-interfaces.rules`)。将 MAC 地址映射到设备名称 (生成 `75-persistent-net-generator.rules` 的 `70-persistent-net.rules`)。

hotplug 脚本  
生成一个适用于 DHCP 的接口配置文件 (`/etc/sysconfig/network-scripts/ifcfg-eth`*N*)。并生成一个路由配置文件 (`/etc/sysconfig/network-scripts/route-eth`*N*)。

DHCP 脚本  
每当网络接口收到一个新的 DHCP 租约时，此脚本会查询弹性 IP 地址的实例元数据。对于每个弹性 IP 地址，它会为路由策略数据库添加一个规则，确保来自该地址的出站流量使用正确的网络接口。它还会将每个私有 IP 地址作为辅助地址添加至网络接口。

**ec2ifup** eth*N* (`/usr/sbin/`)  
扩展标准 **ifup** 的功能。在此脚本重写配置文件 `ifcfg-eth`*N* 和 `route-eth`*N* 之后，它将运行 **ifup**。

**ec2ifdown** eth*N* (`/usr/sbin/`)  
扩展标准 **ifdown** 的功能。当此脚本从路由策略数据库中删除网络接口的任何规则后，它将运行 **ifdown**。

**ec2ifscan** (`/usr/sbin/`)  
检查尚未配置的网络接口并对它们进行配置。  
此脚本在初始版本的 ec2-net-utils 中不可用。

要列出任何由 ec2-net-utils 生成的配置文件，请使用以下命令：

```
$ ls -l /etc/sysconfig/network-scripts/*-eth?
```

要禁用自动化，您可以将 `EC2SYNC=no` 添加至相应的 `ifcfg-eth`*N* 文件。例如，您可以使用以下命令为 eth1 接口禁用自动化：

```
$ sed -i -e 's/^EC2SYNC=yes/EC2SYNC=no/' /etc/sysconfig/network-scripts/ifcfg-eth1
```

要彻底禁用自动化，可以使用以下命令删除该包：

```
$ yum remove ec2-net-utils
```

# 用户提供的内核
<a name="UserProvidedKernels"></a>

如果您的 Amazon EC2 实例上需要自定义内核，您可以从接近于您想要的内核的 AMI 开始，在您的实例上编译自定义内核，并更新引导加载程序以指向新内核。该过程根据您的AMI所使用的虚拟化类型而异。有关更多信息，请参阅 *Amazon EC2 用户指南*中的 [Linux AMI 虚拟化类型](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/virtualization_types.html)。

**Topics**
+ [HVM AMIs (GRUB)](#HVM_instances)
+ [半虚拟化 AMIs (PV-GRUB)](#Paravirtual_instances)

## HVM AMIs (GRUB)
<a name="HVM_instances"></a>

HVM 实例卷就像是物理磁盘。引导过程类似于带分区磁盘和引导加载程序的裸机操作系统，使它能够在当前支持的所有 Linux 发行版中工作。最常见的引导加载程序是 GRUB 或。 GRUB2

默认情况下，GRUB 不会将其输出发送到实例控制台，因为它会造成额外启动延迟。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[实例控制台输出](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/troubleshoot-unreachable-instance.html#instance-console-console-output)。如果要安装自定义内核，则应考虑启用 GRUB 输出。

无需指定后备内核，但是我们建议您在测试新内核时准备好后备内核。如果新内核发生故障时，GRUB 可以退回到另一个内核。如果有后备内核，实例即使没有找到新内核也能进行引导。

适用于亚马逊 Linux 的传统 GRUB 使用`/boot/grub/menu.lst`。 GRUB2 供 AL2 使用`/etc/default/grub`。有关更新引导加载程序中的默认内核的更多信息，请参阅 Linux 发行版的文档。

## 半虚拟化 AMIs (PV-GRUB)
<a name="Paravirtual_instances"></a>

AMIs 使用半虚拟化 (PV) 虚拟化的用户在启动过程中使用名为 *PV-GRUB* 的系统。PV-GRUB 是半虚拟化引导加载程序，运行经过修补的 GNU GRUB 0.97 版本。当您启动实例时，PV-GRUB 会启动引导过程，然后链式加载由映像的 `menu.lst` 文件指定的内核。

PV-GRUB 理解标准 `grub.conf` 或 `menu.lst` 命令，可与当前支持的所有 Linux 发行版配合使用。较旧发行版（如 Ubuntu 10.04 LTS、Oracle Enterprise Linux 或 CentOS 5.x）需要特殊的“ec2”或“xen”内核软件包，而较新发行版在默认内核软件包中包含所需驱动程序。

大多数新半虚拟化 AMI 在默认情况下使用 PV-GRUB AKI (包括 Amazon EC2 Launch Wizard Quick Start 菜单中提供的所有半虚拟化 Linux AMI)，无需执行额外步骤即可在实例上使用不同的内核，前提是要使用的内核与您的发行版兼容。在实例上运行自定义内核的最佳方式是从接近于您想要的内核的 AMI 开始，然后在实例上编译自定义内核并修改 `menu.lst` 文件以使用该内核进行引导。

您可以验证 AMI 的内核映像是否为 PV-GRUB AKI。运行以下 [describe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令（替换为您的内核映像 ID），并检查 `Name` 字段是否以 `pv-grub` 开头：

```
aws ec2 describe-images --filters Name=image-id,Values=aki-880531cd
```

**Topics**
+ [PV-GRUB 的限制](#pv-grub-limitations)
+ [Configuring GRUB](#configuringGRUB)
+ [亚马逊 PV-GRUB 内核镜像 IDs](#AmazonKernelImageIDs)
+ [更新 PV-GRUB](#UpdatingPV-GRUB)

### PV-GRUB 的限制
<a name="pv-grub-limitations"></a>

PV-GRUB 具有以下限制：
+ 您不能使用 64 位版本的 PV-GRUB 来启动 32 位的内核，反之亦然。
+ 当您使用 PV-GRUB AKI 时，不能指定 Amazon Ramdisk Image (ARI)。
+ AWS 已测试并验证 PV-GRUB 适用于以下文件系统格式： EXT2、、、JFS EXT3 EXT4、XFS 和 ReiserFS。其他文件系统格式可能不适用。
+ PV-GRUB 可以引导使用 gzip、bzip2、lzo 和 xz 压缩格式压缩的内核。
+ 群集 AMIs 不支持也不需要 PV-GRUB，因为它们使用的是完整的硬件虚拟化 (HVM)。当半虚拟化实例使用 PV-GRUB 来启动时，HVM 实例卷用作实际磁盘，并且启动过程与带已分区磁盘和引导加载程序的裸机操作系统的类似。
+ PV-GRUB 版本 1.03 及更低版本不支持 GPT 分区；它们仅支持 MBR 分区。
+ 如果您计划通过 Amazon Elastic Block Store (Amazon EBS) 卷使用逻辑卷管理 (LVM)，则需要在 LVM 外有一个独立的引导分区。然后，您可以通过 LVM 创建逻辑卷。

### 为半虚拟化配置 GRUB AMIs
<a name="configuringGRUB"></a>

要引导 PV-GRUB，GRUB `menu.lst` 文件必须存在于映像中；此文件的最常见位置是 `/boot/grub/menu.lst`。

以下是用于启动带 PV-GRUB AKI 的 AMI 的 `menu.lst` 配置文件示例。在该示例中，可在两个内核条目中进行选择：Amazon Linux 2018.03（此 AMI 的原始内核），以及 Vanilla Linux 4.16.4（来自 [https://www.kernel.org/](https://www.kernel.org/) 的较新 Vanilla Linux 内核版本）。Vanilla 条目是从此 AMI 的原始条目复制的，`kernel` 和 `initrd` 路径已更新为新位置。`default 0` 参数将引导加载程序指向其发现的第一个条目 (在此例中为 Vanilla 条目)，`fallback 1` 参数在引导第一个条目的过程中发生问题时，将引导加载程序指向下一个条目。

```
default 0
fallback 1
timeout 0
hiddenmenu

title Vanilla Linux 4.16.4
root (hd0)
kernel /boot/vmlinuz-4.16.4 root=LABEL=/ console=hvc0
initrd /boot/initrd.img-4.16.4

title Amazon Linux 2018.03 (4.14.26-46.32.amzn1.x86_64)
root (hd0)
kernel /boot/vmlinuz-4.14.26-46.32.amzn1.x86_64 root=LABEL=/ console=hvc0
initrd /boot/initramfs-4.14.26-46.32.amzn1.x86_64.img
```

无需在 `menu.lst` 文件中指定后备内核，但是我们建议您在测试新内核时准备好后备内核。如果新内核发生故障，PV-GRUB 可以回退到其他内核。如果有后备内核，实例即使没有找到新内核也能进行引导。

PV-GRUB 检查以下位置是否存在 `menu.lst`，使用找到的第一项：
+  `(hd0)/boot/grub` 
+  `(hd0,0)/boot/grub` 
+  `(hd0,0)/grub` 
+  `(hd0,1)/boot/grub` 
+  `(hd0,1)/grub` 
+  `(hd0,2)/boot/grub` 
+  `(hd0,2)/grub` 
+  `(hd0,3)/boot/grub` 
+  `(hd0,3)/grub` 

请注意，PV-GRUB 1.03 及更低版本仅检查此列表中的前两个位置。

### 亚马逊 PV-GRUB 内核镜像 IDs
<a name="AmazonKernelImageIDs"></a>

PV-GRUB AKI 在所有 Amazon EC2 区域（不包括亚太地区（大阪））中都可用。有 32 AKIs 位和 64 位架构类型。大多数现代用户默认 AMIs 使用 PV-GRUB AKI。

我们建议您始终使用最新版本的 PV-GRUB AKI，因为并不是所有的 PV-GRUB AKI 版本都能与全部实例类型兼容。使用以下 d [escribe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令获取当前区域的 PV-GRUB AKIs 列表：

```
aws ec2 describe-images --owners amazon --filters Name=name,Values=pv-grub-*.gz
```

PV-GRUB 是 `ap-southeast-2` 区域中唯一可用的 AKI。您应验证要复制到此区域的任何 AMI 是否使用此区域中可用的 PV-GRUB 版本。

以下是每个区域的当前 IDs AKI。 AMIs 使用 hd0 AKI 进行新注册。

**注意**  
我们继续提供 hd00， AKIs 以便在以前可用的地区向后兼容。


**ap-northeast-1，亚太区域（东京）**  

| 映像 ID | 映像名称 | 
| --- | --- | 
|  aki-f975a998  |  pv-grub-hd0\$11.05-i386.gz  | 
|  aki-7077ab11  |  pv-grub-hd0\$11.05-x86\$164.gz  | 


**ap-southeast-1、亚太区域（新加坡）**  

| 映像 ID | 映像名称 | 
| --- | --- | 
|  aki-17a40074  |  pv-grub-hd0\$11.05-i386.gz  | 
|  aki-73a50110  |  pv-grub-hd0\$11.05-x86\$164.gz  | 


**ap-southeast-2、亚太区域（悉尼）**  

| 映像 ID | 映像名称 | 
| --- | --- | 
|  aki-ba5665d9  |  pv-grub-hd0\$11.05-i386.gz  | 
|  aki-66506305  |  pv-grub-hd0\$11.05-x86\$164.gz  | 


**eu-central-1、欧洲（法兰克福）**  

| 映像 ID | 映像名称 | 
| --- | --- | 
|  aki-1419e57b  |  pv-grub-hd0\$11.05-i386.gz  | 
|  aki-931fe3fc  |  pv-grub-hd0\$11.05-x86\$164.gz  | 


**eu-west-1、欧洲（爱尔兰）**  

| 映像 ID | 映像名称 | 
| --- | --- | 
|  aki-1c9fd86f  |  pv-grub-hd0\$11.05-i386.gz  | 
|  aki-dc9ed9af  |  pv-grub-hd0\$11.05-x86\$164.gz  | 


**sa-east-1、南美洲（圣保罗）**  

| 映像 ID | 映像名称 | 
| --- | --- | 
|  aki-7cd34110  |  pv-grub-hd0\$11.05-i386.gz  | 
|  aki-912fbcfd  |  pv-grub-hd0\$11.05-x86\$164.gz  | 


**us-east-1、US East (N. Virginia)**  

| 映像 ID | 映像名称 | 
| --- | --- | 
|  aki-04206613  |  pv-grub-hd0\$11.05-i386.gz  | 
|  aki-5c21674b  |  pv-grub-hd0\$11.05-x86\$164.gz  | 


**us-gov-west-1， AWS GovCloud （美国西部）**  

| 映像 ID | 映像名称 | 
| --- | --- | 
|  aki-5ee9573f  |  pv-grub-hd0\$11.05-i386.gz  | 
|  aki-9ee55bff  |  pv-grub-hd0\$11.05-x86\$164.gz  | 


**us-west-1、美国西部（加利福尼亚北部）**  

| 映像 ID | 映像名称 | 
| --- | --- | 
|  aki-43cf8123  |  pv-grub-hd0\$11.05-i386.gz  | 
|  aki-59cc8239  |  pv-grub-hd0\$11.05-x86\$164.gz  | 


**us-west-2、美国西部（俄勒冈）**  

| 映像 ID | 映像名称 | 
| --- | --- | 
|  aki-7a69931a  |  pv-grub-hd0\$11.05-i386.gz  | 
|  aki-70cb0e10  |  pv-grub-hd0\$11.05-x86\$164.gz  | 

### 更新 PV-GRUB
<a name="UpdatingPV-GRUB"></a>

我们建议您始终使用最新版本的 PV-GRUB AKI，因为并不是所有的 PV-GRUB AKI 版本都能与全部实例类型兼容。较旧版本的 PV-GRUB 也并非在所有区域都可用，因此如果您将使用较旧版本的 AMI 复制到不支持该版本的区域，则无法引导从该 AMI 启动的实例，直至您更新内核映像。使用以下过程可检查您的实例的 PV-GRUB 版本并在必要时更新它。

**检查您的 PV-GRUB 版本**

1. 查找您的实例的内核 ID。

   ```
   aws ec2 describe-instance-attribute --instance-id instance_id --attribute kernel --region region
   
   {
       "InstanceId": "instance_id", 
       "KernelId": "aki-70cb0e10"
   }
   ```

   此实例的内核 ID 是 `aki-70cb0e10`。

1. 查看该内核 ID 的版本信息。

   ```
   aws ec2 describe-images --image-ids aki-70cb0e10 --region region
   
   {
       "Images": [
           {
               "VirtualizationType": "paravirtual", 
               "Name": "pv-grub-hd0_1.05-x86_64.gz", 
               ...
               "Description": "PV-GRUB release 1.05, 64-bit"
           }
       ]
   }
   ```

   此内核映像是 PV-GRUB 1.05。如果您的 PV-GRUB 版本不是最新版本（如 [亚马逊 PV-GRUB 内核镜像 IDs](#AmazonKernelImageIDs) 所示），则应使用以下过程更新它。

**更新您的 PV-GRUB 版本**

如果您的实例使用较旧版本的 PV-GRUB，则您应将它更新为最新版本。

1. 通过 [亚马逊 PV-GRUB 内核镜像 IDs](#AmazonKernelImageIDs) 确定您的区域和处理器架构的最新 PV-GRUB AKI。

1. 停止您的实例。您的实例必须停止才能修改所使用的内核映像。

   ```
   aws ec2 stop-instances --instance-ids instance_id --region region
   ```

1. 修改用于您的实例的内核映像。

   ```
   aws ec2 modify-instance-attribute --instance-id instance_id --kernel kernel_id --region region
   ```

1. 重新启动您的实例。

   ```
   aws ec2 start-instances --instance-ids instance_id --region region 
   ```

# AL2 AMI 发布通知
<a name="linux-ami-notifications"></a>

要在新的亚马逊 Linux 发布 AMIs 时收到通知，您可以使用亚马逊 SNS 进行订阅。

有关订阅通知的信息 AL2023，请参阅 *Amazon Linux 2023 用户指南*中的[接收有关新更新的通知](https://docs.aws.amazon.com/linux/al2023/ug/receive-update-notification.html)。

**注意**  
的标准支持 AL1 已于 2020 年 12 月 31 日结束。 AL1 维护支持阶段已于 2023 年 12 月 31 日结束。有关 AL1 EOL 和维护支持的更多信息，请参阅博客文章 [Amazon Linux AMI end-of-life 上的更新](https://aws.amazon.com/blogs/aws/update-on-amazon-linux-ami-end-of-life/)。

**订阅 Amazon Linux 通知**

1. [在 v3/home 上打开亚马逊 SNS 控制台。https://console.aws.amazon.com/sns/](https://console.aws.amazon.com/sns/v3/home)

1. 如果需要，可在导航栏中将区域更改为**美国东部（弗吉尼亚北部）**。必须选择所订阅的 SNS 通知在创建时所在的区域。

1. 在导航窗格中，依次选择 **Subscriptions** 和 **Create subscription**。

1. 对于 **Create subscription** 对话框，执行以下操作：

   1. [AL2] 对于**主题 ARN**，复制并粘贴以下 Amazon 资源名称 (ARN)：**arn:aws:sns:us-east-1:137112412989:amazon-linux-2-ami-updates**。

   1. [Amazon Linux] 对于**主题 ARN**，复制并粘贴以下 Amazon Resource Name (ARN)：**arn:aws:sns:us-east-1:137112412989:amazon-linux-ami-updates**。

   1. 对于**协议**，选择**电子邮件**。

   1. 对于**端点**，输入可用来接收通知的电子邮件地址。

   1. 选择**创建订阅**。

1. 您会收到一封主题为 “AWS 通知-订阅确认” 的确认电子邮件。打开该电子邮件，选择**确认订阅**来完成订阅。

每当 AMIs 发布时，我们都会向相应主题的订阅者发送通知。若不想再接收这些通知，请使用以下过程取消订阅。

**取消订阅 Amazon Linux 通知**

1. [在 v3/home 上打开亚马逊 SNS 控制台。https://console.aws.amazon.com/sns/](https://console.aws.amazon.com/sns/v3/home)

1. 如果需要，可在导航栏中将区域更改为**美国东部（弗吉尼亚北部）**。必须使用创建 SNS 通知的区域。

1. 在导航窗格中，选择**订阅**，选择订阅，然后选择**操作**和**删除订阅**。

1. 当系统提示进行确认时，选择 **Delete（删除）**。

**Amazon Linux AMI SNS 消息格式**  
SNS 消息的架构如下所示。

```
{
    "description": "Validates output from AMI Release SNS message",
    "type": "object",
    "properties": {
        "v1": {
            "type": "object",
            "properties": {
                "ReleaseVersion": {
                    "description": "Major release (ex. 2018.03)",
                    "type": "string"
                },
                "ImageVersion": {
                    "description": "Full release (ex. 2018.03.0.20180412)",
                    "type": "string"
                },
                "ReleaseNotes": {
                    "description": "Human-readable string with extra information",
                    "type": "string"
                },
                "Regions": {
                    "type": "object",
                    "description": "Each key will be a region name (ex. us-east-1)",
                    "additionalProperties": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "Name": {
                                    "description": "AMI Name (ex. amzn-ami-hvm-2018.03.0.20180412-x86_64-gp2)",
                                    "type": "string"
                                },
                                "ImageId": {
                                    "description": "AMI Name (ex.ami-467ca739)",
                                    "type": "string"
                                }
                            },
                            "required": [
                                "Name",
                                "ImageId"
                            ]
                        }
                    }
                }
            },
            "required": [
                "ReleaseVersion",
                "ImageVersion",
                "ReleaseNotes",
                "Regions"
            ]
        }
    },
    "required": [
        "v1"
    ]
}
```

# 配置 M AL2 ATE 桌面连接
<a name="amazon-linux-ami-mate"></a>

[MATE 桌面环境](https://mate-desktop.org/)已预先安装并预先配置 AMIs ，描述如下：

"`.NET Core x.x, Mono x.xx, PowerShell x.x, and MATE DE pre-installed to run your .NET applications on Amazon Linux 2 with Long Term Support (LTS).`"

该环境提供了一个直观的图形用户界面，无需使用命令行即可管理 AL2 实例。该界面使用图形化表示，例如图标、窗口、工具栏、文件夹、壁纸和桌面小部件。基于 GUI 的内置工具可用于执行常见任务。例如，有一些工具可用于添加和删除软件、应用更新、组织文件、启动程序和监视系统运行状况。

**重要**  
`xrdp` 是 AMI 中捆绑的远程桌面软件。默认情况下，`xrdp` 使用自签名 TLS 证书来加密远程桌面会话。`xrdp`维护者 AWS 也不建议在生产环境中使用自签名证书。而是从相应的证书颁发机构 (CA) 获取证书并将其安装在您的实例上。有关 TSL 配置的更多信息，请参阅 `xrdp` Wiki 上的 [TLS 安全层](https://github.com/neutrinolabs/xrdp/wiki/TLS-security-layer)。

**注意**  
如果您更喜欢使用虚拟网络计算 (VNC) 服务而不是 xrdp，请参阅[如何在运行 AL2 AWS 知识中心的 Amazon EC2 实例上安装 GUI 一](https://repost.aws/knowledge-center/ec2-linux-2-install-gui)文。

## 先决条件
<a name="al2-mate-configure-prerequisite"></a>

要运行本主题中显示的命令，必须安装 AWS Command Line Interface (AWS CLI) 或 AWS Tools for Windows PowerShell，然后配置您的 AWS 配置文件。

**选项**

1. 安装 AWS CLI — 有关更多信息，请参阅[《*AWS Command Line Interface 用户指南》*中的安装 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-set-up.html)和[配置基础知识](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html)。

1. 安装适用于 Windows 的工具 PowerShell -有关更多信息，请参阅[《*AWS Tools for PowerShell 用户指南*》中的安装 AWS Tools for Windows PowerShell](https://docs.aws.amazon.com/powershell/latest/userguide/pstools-getting-set-up.html)和[共享凭据](https://docs.aws.amazon.com/powershell/latest/userguide/shared-credentials-in-aws-powershell.html)。

**提示**  
作为完全安装的替代方案 AWS CLI，您可以使用[AWS CloudShell](https://docs.aws.amazon.com/cloudshell/latest/userguide/welcome.html)直接从启动的基于浏览器、经过预先验证的外壳。 AWS 管理控制台请选中[支持 AWS 区域](https://docs.aws.amazon.com/cloudshell/latest/userguide/supported-aws-regions.html)，确保它在您所在的地区可用。

## 配置 RDP 连接
<a name="al2-mate-configure-connection"></a>

按照以下步骤设置远程桌面协议 (RDP) 连接，从本地计算机指向运行 MATE 桌面环境的 AL2 实例。

1. 要获取 AMI 名称中包含 MATE AL2 的 AMI 的 ID，您可以使用本地命令行工具中的 d [escribe-images](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/describe-images.html) 命令。如果您尚未安装命令行工具，则可以直接从 AWS CloudShell 会话中执行以下查询。有关如何从启动 shell 会话的信息 CloudShell，请参阅[入门 AWS CloudShell](https://docs.aws.amazon.com/cloudshell/latest/userguide/getting-started.html)。从 Amazon EC2 控制台中，您可以启动实例，然后在 AMI 搜索栏中输入 `MATE`，以查找包含 MATE 的 AMI。预安装了 MATE 的 AL2 快速入门将出现在搜索结果中。

   ```
   aws ec2 describe-images --filters "Name=name,Values=amzn2*MATE*" --query "Images[*].[ImageId,Name,Description]"
   [
       [
           "ami-0123example0abc12",
           "amzn2-x86_64-MATEDE_DOTNET-2020.12.04",
           ".NET Core 5.0, Mono 6.12, PowerShell 7.1, and MATE DE pre-installed to run your .NET applications on Amazon Linux 2 with Long Term Support (LTS)."
       ],
       [
           "ami-0456example0def34",
           "amzn2-x86_64-MATEDE_DOTNET-2020.04.14",
           "Amazon Linux 2 with .Net Core, PowerShell, Mono, and MATE Desktop Environment"
       ]
   ]
   ```

   选择适合您使用的 AMI。

1. 使用您在上一步中找到的 AMI 启动 EC2 实例。将安全组配置为允许到端口 3389 的入站 TCP 流量。有关配置安全组的更多信息，请参阅 [VPC 的安全组](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html)。此配置使您能够使用 RDP 客户端连接到实例。

1. 使用 [SSH](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-linux-inst-ssh.html) 连接到实例。

1. 更新实例上的软件和内核。

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

   在更新完成后，重启实例以确保实例使用的是来自更新的最新程序包和库；重启发生前不会加载内核更新。

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

1. 重新连接到实例并在 Linux 实例上运行以下命令以设置 `ec2-user` 的密码。

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

1. 安装证书和密钥。

   如果您已经拥有证书和密钥，将它们复制到 `/etc/xrdp/` 目录，如下所示：
   + 证书 — `/etc/xrdp/cert.pem`
   + 密钥 — `/etc/xrdp/key.pem`

   如果您没有证书和密钥，则使用以下命令在 `/etc/xrdp` 目录中生成。

   ```
   $ sudo openssl req -x509 -sha384 -newkey rsa:3072 -nodes -keyout /etc/xrdp/key.pem -out /etc/xrdp/cert.pem -days 365
   ```
**注意**  
此命令会生成有效期达 365 天的证书。

1. 在要连接到实例的计算机上打开 RDP 客户端（例如，运行 Microsoft Windows 的计算机上的远程桌面连接）。输入 `ec2-user` 作为用户名，然后输入您在上一步中设置的密码。

**在您的 Amazon EC2 实例上禁用 `xrdp`**  
您可以通过在 Linux 实例上运行以下命令之一随时禁用 `xrdp`。以下命令不会影响您通过 X11 服务器使用 MATE 的能力。

```
[ec2-user ~]$ sudo systemctl disable xrdp
```

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

**在您的 Amazon EC2 实例上启用 `xrdp`**  
要重新启用`xrdp`以便您可以连接到运行 MATE 桌面环境的 AL2 实例，请在 Linux 实例上运行以下命令之一。

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

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

# 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)了解更多信息。