

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

# 教程：在上发布 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)了解更多信息。