将带有外部 Amazon RDS 数据库的高可用性 WordPress 网站部署到 Elastic Beanstalk - Amazon Elastic Beanstalk
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

将带有外部 Amazon RDS 数据库的高可用性 WordPress 网站部署到 Elastic Beanstalk

本教程介绍如何启动外部的 Amazon RDS 数据库实例 Amazon Elastic Beanstalk,以及如何配置运行 WordPress 网站的高可用性环境以连接到该实例。该网站使用 Amazon Elastic File System (Amazon EFS) 作为已上传文件的共享存储空间。

运行 Elastic Beanstalk 外部的数据库实例会将数据库与环境的生命周期分离。这让您可以从多个环境连接到同一个数据库,将一个数据库交换为另一个数据库,或执行蓝/绿部署,而不影响您的数据库。

注意

有关 PHP WordPress 版本与版本兼容性的最新信息,请参阅 WordPress 网站上的 PHP 兼容性和 WordPress 版本。在为 WordPress 实现升级到新版本的 PHP 之前,您应该参考这些信息。

先决条件

本教程假设您对基本 Elastic Beanstalk 操作和 Elastic Beanstalk 控制台有一定了解。如果尚不了解,请按照开始使用 Elastic Beanstalk中的说明操作以启动您的第一个 Elastic Beanstalk 环境。

为了遵循本指南中的步骤,您需要命令行终端或 Shell,以便运行命令。命令显示在列表中,以提示符($)和当前目录名称(如果有)开头。

~/eb-project$ this is a command this is output

在 Linux 和 macOS 中,您可使用您首选的 Shell 和程序包管理器。在 Windows 10 中,您可以安装 Windows Subsystem for Linux,获取 Ubuntu 和 Bash 与 Windows 集成的版本。

默认 VPC

本教程中的 Amazon Relational Database Service (Amazon RDS) 过程假定您在默认 Amazon Virtual Private Cloud (Amazon VPC) 中启动资源。所有新账户在每个 Amazon 区域都包含一个默认 VPC。如果您没有默认 VPC,则这些过程将会发生变化。有关 EC2-Classic 和自定义 VPC 平台的说明,请参阅将 Elastic Beanstalk 和 Amazon RDS 结合使用

Amazon 区域

该示例应用程序使用 Amazon EFS,它仅适用于支持 Amazon EFS 的 Amazon 区域。要了解支持的 Amazon 区域,请参阅中的 Amazon Elastic File System 终端节点和配额Amazon Web Services 一般参考

在 Amazon RDS 中启动数据库实例

当您使用 Amazon RDS 启动实例时,它完全独立于 Elastic Beanstalk 和您的 Elastic Beanstalk 环境,并且不会由 Elastic Beanstalk 终止或监控。

在以下步骤中,您将使用 Amazon RDS 控制台:

  • 使用 MySQL 引擎启动数据库。

  • 启用多可用区部署。这会在其他可用区 (AZ) 中创建备用数据库,以提供数据冗余、消除 I/O 冻结并最大限度地减少系统备份期间的延迟峰值。

在默认 VPC 中启动 RDS 数据库实例
  1. 打开 RDS 控制台

  2. 在导航窗格中,选择 Databases(数据库)。

  3. 选择创建数据库

  4. 选择 Standard Create(标准创建)。

    重要

    请勿选择 Easy Create(轻松创建)。如果您选择它,您将无法配置启动此 RDS 数据库所需的设置。

  5. Additional configuration(附加配置)下,对于 Initial database name(初始数据库名称),键入 ebdb

  6. 请查看默认设置并根据您的具体要求调整这些设置。请注意以下选项:

    • DB instance class(数据库实例类)– 选择对于您的工作负载具有适当的内存量和 CPU 能力的实例大小。

    • Multi-AZ deployment(多可用区部署)– 为了实现高可用性,请将其设置为 Create an Aurora Replica/Reader node in a different AZ(在不同的可用区中创建 Aurora 副本/读取器节点)。

    • Master username(主用户名)和 Master password(主密码)– 数据库用户名和密码。请记下这些设置,因为您以后将使用这些值。

  7. 验证其余选项的默认设置,然后选择 Create database(创建数据库)。

创建数据库实例后,修改附加到该实例的安全组,以便允许相应端口上的入站流量。

注意

这与您稍后要附加到 Elastic Beanstalk 环境的安全组相同,因此您添加的规则现在将向同一安全组中的其他资源授予入口流量权限。

修改附加到 RDS 实例的安全组上的入站规则
  1. 打开 Amazon RDS 控制台

  2. 选择 Databases(数据库)。

  3. 选择您的数据库实例的名称以查看其详细信息。

  4. Connectivity(连接)部分中,记下在该页上显示的 Subnets(子网)、Security groups(安全组)和 Endpoint(端点)。这样您稍后可以使用这些信息。

  5. Security(安全性)下面,您可以查看与数据库实例关联的安全组。打开链接以在 Amazon EC2 控制台中查看安全组。

    
        Amazon RDS 控制台中“数据库实例”页面的 Connectivity(连接)部分
  6. 在安全组详细信息中,选择 Inbound(入站)选项卡。

  7. 选择 Edit(编辑)。

  8. 选择 Add Rule(添加规则)。

  9. 对于 Type(类型),请选择应用程序使用的数据库引擎。

  10. 对于 Source(源),键入 sg- 以查看可用安全组的列表。请选择 Elastic Beanstalk 环境中使用的与 Auto Scaling 组关联的安全组。这样,环境中的 Amazon EC2 实例就可以访问数据库。

    
        在 Amazon EC2 控制台中编辑安全组的入站规则
  11. 选择 Save(保存)。

创建一个数据库实例大约需要 10 分钟。同时,下载 WordPress 并创建你的 Elastic Beanstalk 环境。

下载 WordPress

要准备 WordPress 使用进行部署 Amazon Elastic Beanstalk,必须将 WordPress 文件复制到您的计算机并提供正确的配置信息。

创建 WordPress 项目
  1. WordPress 从 wordpress.org 下载。

    ~$curl https://wordpress.org/wordpress-6.2.tar.gz -o wordpress.tar.gz
  2. 从示例存储库中下载配置文件。

    ~$ wget https://github.com/aws-samples/eb-php-wordpress/releases/download/v1.1/eb-php-wordpress-v1.zip
  3. 提取 WordPress 并更改文件夹的名称。

    ~$ tar -xvf wordpress.tar.gz ~$ mv wordpress wordpress-beanstalk ~$ cd wordpress-beanstalk
  4. 在 WordPress 安装过程中提取配置文件。

    ~/wordpress-beanstalk$ unzip ../eb-php-wordpress-v1.zip creating: .ebextensions/ inflating: .ebextensions/dev.config inflating: .ebextensions/efs-create.config inflating: .ebextensions/efs-mount.config inflating: .ebextensions/loadbalancer-sg.config inflating: .ebextensions/wordpress.config inflating: LICENSE inflating: README.md inflating: wp-config.php

启动 Elastic Beanstalk 环境

使用 Elastic Beanstalk 控制台创建 Elastic Beanstalk 环境。启动环境后,您可以将其配置为连接到数据库,然后将 WordPress 代码部署到环境中。

在以下步骤中,您将使用 Elastic Beanstalk 控制台:

  • 使用托管的 PHP 平台创建 Elastic Beanstalk 应用程序。

  • 接受默认设置和示例代码。

启动环境(控制台)
  1. 使用以下预配置链接打开 Elastic Beanstalk 控制台:console.aws.amazon.com/elasticbeanstalk/home#/ newApplicationName=Tutorials &environtype= LoadBalanced

  2. 对于 Platform(平台),选择与应用程序使用的语言匹配的平台和平台分支。

  3. 对于应用程序代码,选择示例应用程序

  4. 选择复查并启动

  5. 检查可用选项。选择要使用的可用选项,然后在准备就绪后选择创建应用程序

创建环境大约需要 5 分钟,将创建以下资源。

  • EC2 实例 – 配置为在您选择的平台上运行 Web 应用程序的 Amazon Elastic Compute Cloud(Amazon EC2)虚拟机。

    各平台运行一组特定软件、配置文件和脚本以支持特定的语言版本、框架、Web 容器或其组合。大多数平台使用 Apache 或 NGINX 作为 Web 应用程序前的反向代理,向其转发请求、提供静态资产以及生成访问和错误日志。

  • 实例安全组 - 配置为允许端口 80 上的入站流量的 Amazon EC2 安全组。通过此资源,HTTP 流量可以从负载均衡器到达运行您的 Web 应用程序的 EC2 实例。默认情况下,其他端口不允许流量进入。

  • 负载均衡器 – 配置为向运行您的应用程序的实例分配请求的 Elastic Load Balancing 负载均衡器。负载均衡器还使您无需将实例直接公开在 Internet 上。

  • 负载均衡器安全组 – 配置为允许端口 80 上的入站流量的 Amazon EC2 安全组。利用此资源,HTTP 流量可从 Internet 到达负载均衡器。默认情况下,其他端口不允许流量进入。

  • Auto Scaling 组 – 配置为在实例终止或不可用时替换实例的 Auto Scaling 组。

  • Amazon S3 存储桶 – 使用 Elastic Beanstalk 时创建的源代码、日志和其他构件的存储位置。

  • Amazon CloudWatch CloudWatch 警报 — 两个警报,用于监控环境中实例的负载,并在负载过高或过低时触发。警报触发后,您的 Auto Scaling 组会扩展或收缩以进行响应。

  • Amazon CloudFormation 堆栈 — Elastic Amazon CloudFormation Beanstalk 用于在您的环境中启动资源并传播配置更改。这些资源在您可通过 Amazon CloudFormation 控制台查看的模板中定义。

  • 域名 – 一个域名,它以下面的形式路由到您的 Web 应用程序:subdomain.region.elasticbeanstalk.com

    注意

    为了增强您的 Elastic Beanstalk 应用程序的安全性,eb.amazonaws.com.cn 名已在公共后缀列表 (PSL) 中注册。为进一步增强安全性,如果您需要在 Elastic Beanstalk 应用程序的默认域名中设置敏感 Cookie,我们建议您使用带 __Host- 前缀的 Cookie。这将有助于保护您的域,防范跨站点请求伪造(CSRF)攻击。要了解更多信息,请参阅 Mozilla 开发者网络中的 Set-Cookie 页面。

所有这些资源都由 Elastic Beanstalk 管理。当您终止环境时,Elastic Beanstalk 会终止其包含的所有资源。

由于您启动的 Amazon RDS 实例位于您的环境之外,因此您需负责管理其生命周期。

注意

Elastic Beanstalk 创建的 Amazon S3 存储桶将在多个环境之间共享并且在环境终止期间不会被删除。有关更多信息,请参阅将 Elastic Beanstalk 和 Amazon S3 结合使用

配置安全组和环境属性

将数据库实例的安全组添加到正在运行的环境。此过程将使 Elastic Beanstalk 使用附加的其他安全组重新配置环境中的所有实例。

向环境添加安全组
  • 请执行以下操作之一:

    • 使用 Elastic Beanstalk 控制台添加安全组

      1. 打开 Elastic Beanstalk 控制台,然后在 “区域” 列表中,选择您的。 Amazon Web Services 区域

      2. 在导航窗格中,选择 Environments(环境),然后从列表中选择环境的名称。

        注意

        如果您有多个环境,请使用搜索栏筛选环境列表。

      3. 在导航窗格中,选择 Configuration(配置)。

      4. Instances(实例)配置类别中,选择 Edit(编辑)。

      5. EC2 security groups(EC2 安全组)下面,选择要附加到实例的安全组以及 Elastic Beanstalk 创建的实例安全组。

      6. 要保存更改,请选择页面底部的 Apply(应用)。

      7. 阅读警告,然后选择 Confirm(确认)。

    • 要使用配置文件添加安全组,请使用 securitygroup-addexisting.config 示例文件。

接下来,使用环境属性将连接信息传递给环境。

该 WordPress 应用程序使用一组默认属性,这些属性与 Elastic Beanstalk 在环境中配置数据库时配置的属性相匹配。

为 Amazon RDS 数据库实例配置环境属性
  1. 打开 Elastic Beanstalk 控制台,然后在 “区域” 列表中,选择您的。 Amazon Web Services 区域

  2. 在导航窗格中,选择 Environments(环境),然后从列表中选择环境的名称。

    注意

    如果您有多个环境,请使用搜索栏筛选环境列表。

  3. 在导航窗格中,选择 Configuration(配置)。

  4. Updates, monitoring, and logging(更新、监控和日志记录)配置类别中,选择 Edit(编辑)。

  5. 环境属性部分中,定义应用程序读取的用于构建连接字符串的变量。为了实现与具有集成 RDS 数据库实例的环境的兼容,请使用以下名称和值。您可以在 RDS 控制台中找到除密码以外的所有值。

    属性名称 描述 属性值

    RDS_HOSTNAME

    数据库实例的主机名。

    在 Amazon RDS 控制台的 Connectivity & security(连接和安全)选项卡上:Endpoint(端点)。

    RDS_PORT

    数据库实例接受连接的端口。默认值因数据库引擎而异。

    在 Amazon RDS 控制台的 Connectivity & security(连接和安全)选项卡上:Port(端口)。

    RDS_DB_NAME

    数据库名称 ebdb

    在 Amazon RDS 控制台的 Configuration(配置)选项卡上:DB Name(数据库名称)。

    RDS_USERNAME

    您为数据库配置的用户名。

    在 Amazon RDS 控制台的 Configuration(配置)选项卡上:Master username(主用户名)。

    RDS_PASSWORD

    您为数据库配置的密码。

    在 Amazon RDS 控制台中不可供参考。

    
        添加了 RDS 属性的环境属性配置部分
  6. 要保存更改,请选择页面底部的 Apply(应用)。

配置并部署您的应用程序

验证您的 wordpress-beanstalk 文件夹结构是否正确,如下所示。

wordpress-beanstalk$ tree -aL 1 . ├── .ebextensions ├── index.php ├── LICENSE ├── license.txt ├── readme.html ├── README.md ├── wp-activate.php ├── wp-admin ├── wp-blog-header.php ├── wp-comments-post.php ├── wp-config.php ├── wp-config-sample.php ├── wp-content ├── wp-cron.php ├── wp-includes ├── wp-links-opml.php ├── wp-load.php ├── wp-login.php ├── wp-mail.php ├── wp-settings.php ├── wp-signup.php ├── wp-trackback.php └── xmlrpc.php

项目存储库中的自定义 wp-config.php 文件使用您在上一步中定义的环境变量来配置数据库连接。.ebextensions 文件夹包含用于在您的 Elastic Beanstalk 环境中创建其他资源的配置文件。

该配置文件要求您进行修改以使用账户。将文件中的占位符值替换为适当的 ID 并创建源代码包。

更新配置文件并创建源包
  1. 按如下方式修改配置文件。

    • .ebextensions/dev.config— 限制对环境的访问以在 WordPress 安装过程中对其进行保护。将文件顶部附近的占位符 IP 地址替换为用于访问环境网站的计算机的公有 IP 地址,从而完成 WordPress 安装。

      注意

      根据您的网络,您可能需要使用 IP 地址块。

    • .ebextensions/efs-create.config - 在您的 VPC 中的每个可用区/子网中创建 EFS 文件系统和装载点。在 Amazon VPC 控制台中确定您的默认 VPC 和子网 ID。

  2. 创建将文件包含在项目文件夹中的源代码包。以下命令将创建名为 wordpress-beanstalk.zip 的源包。

    ~/eb-wordpress$ zip ../wordpress-beanstalk.zip -r * .[^.]*

将源包上传到 Elastic Beanstalk WordPress 以部署到您的环境中。

部署源包
  1. 打开 Elastic Beanstalk 控制台,然后在 “区域” 列表中,选择您的。 Amazon Web Services 区域

  2. 在导航窗格中,选择 Environments(环境),然后从列表中选择环境的名称。

    注意

    如果您有多个环境,请使用搜索栏筛选环境列表。

  3. 在环境概述页面上,选择 Upload and deploy(上传和部署)。

  4. 使用屏幕上的对话框上传源包。

  5. 选择 Deploy(部署)。

  6. 部署完成后,选择站点 URL 以在新选项卡中打开您的网站。

安装 WordPress

要完成 WordPress 安装
  1. 打开 Elastic Beanstalk 控制台,然后在 “区域” 列表中,选择您的。 Amazon Web Services 区域

  2. 在导航窗格中,选择 Environments(环境),然后从列表中选择环境的名称。

    注意

    如果您有多个环境,请使用搜索栏筛选环境列表。

  3. 选择 URL 以便在浏览器中打开您的站点。您将被重定向到 WordPress 安装向导,因为您尚未配置该站点。

  4. 执行标准安装。wp-config.php 文件在源代码中已存在,并配置为从环境中读取数据库连接信息。系统不会提示您配置连接。

安装大约需要一分钟能完成。

更新密钥和加密盐

WordPress 配置文件wp-config.php还从环境属性中读取键和盐的值。当前,这些属性全都被 test 文件夹中的 wordpress.config 文件设置为 .ebextensions

哈希加密盐可以是符合环境属性要求的任意值,但不应将其存储在源代码控制中。使用 Elastic Beanstalk 控制台可直接针对环境设置这些属性。

更新环境属性
  1. 打开 Elastic Beanstalk 控制台,然后在 “区域” 列表中,选择您的。 Amazon Web Services 区域

  2. 在导航窗格中,选择 Environments(环境),然后从列表中选择环境的名称。

    注意

    如果您有多个环境,请使用搜索栏筛选环境列表。

  3. 在导航窗格中,选择 Configuration(配置)。

  4. Software(软件)下,选择 Edit(编辑)。

  5. 对于 Environment properties,修改以下属性:

    • AUTH_KEY - 为 AUTH_KEY 选择的值。

    • SECURE_AUTH_KEY - 为 SECURE_AUTH_KEY 选择的值。

    • LOGGED_IN_KEY - 为 LOGGED_IN_KEY 选择的值。

    • NONCE_KEY - 为 NONCE_KEY 选择的值。

    • AUTH_SALT - 为 AUTH_SALT 选择的值。

    • SECURE_AUTH_SALT - 为 SECURE_AUTH_SALT 选择的值。

    • LOGGED_IN_SALT - 为 LOGGED_IN_SALT 选择的值。

    • NONCE_SALT - 为 NONCE_SALT 选择的值。

  6. 要保存更改,请选择页面底部的 Apply(应用)。

注意

直接对环境设置属性会覆盖 wordpress.config 的值。

删除访问限制

示例项目包括配置文件 loadbalancer-sg.config。它会使用您在 dev.config 中配置的 IP 地址创建安全组,并将其分配给环境的负载均衡器。它将端口 80 上的 HTTP 访问限制为来自您的网络的连接。否则,在您安装 WordPress 和配置管理员帐户之前,外部人员可能会连接到您的站点。

现在您已经安装完毕 WordPress,请删除配置文件以向全世界开放该站点。

删除限制并更新环境
  1. 从项目目录中删除 .ebextensions/loadbalancer-sg.config 文件。

    ~/wordpress-beanstalk$ rm .ebextensions/loadbalancer-sg.config
  2. 创建源包。

    ~/eb-wordpress$ zip ../wordpress-beanstalk-v2.zip -r * .[^.]*

将源包上传到 Elastic Beanstalk WordPress 以部署到您的环境中。

部署源包
  1. 打开 Elastic Beanstalk 控制台,然后在 “区域” 列表中,选择您的。 Amazon Web Services 区域

  2. 在导航窗格中,选择 Environments(环境),然后从列表中选择环境的名称。

    注意

    如果您有多个环境,请使用搜索栏筛选环境列表。

  3. 在环境概述页面上,选择 Upload and deploy(上传和部署)。

  4. 使用屏幕上的对话框上传源包。

  5. 选择 Deploy(部署)。

  6. 部署完成后,选择站点 URL 以在新选项卡中打开您的网站。

配置 Auto Scaling 组

最后,使用较高的最低实例计数配置您环境的 Auto Scaling 组。请始终运行至少两个实例,以防止您的环境中的 Web 服务器发生单点故障。这样,您还可以在不中断站点服务的情况下部署更改。

配置您的环境的 Auto Scaling 组以获得高可用性
  1. 打开 Elastic Beanstalk 控制台,然后在 “区域” 列表中,选择您的。 Amazon Web Services 区域

  2. 在导航窗格中,选择 Environments(环境),然后从列表中选择环境的名称。

    注意

    如果您有多个环境,请使用搜索栏筛选环境列表。

  3. 在导航窗格中,选择 Configuration (配置)

  4. Capacity (容量) 配置类别中,选择 Edit (编辑)

  5. Auto Scaling group(Auto Scaling 组)部分中,将 Min instances(最小实例数)设置为 2

  6. 要保存更改,请选择页面底部的 Apply(应用)。

为了支持多个实例中的内容上传,示例项目使用 Amazon EFS 来创建共享文件系统。在站点上创建一个帖子,然后上传内容以将其存储在共享文件系统上。查看帖子并多次刷新页面,以命中两个实例并验证共享文件系统是否正常工作。

升级 WordPress

要升级到的新版本 WordPress,请备份您的站点并将其部署到新环境。

重要

请勿使用其中的更新功能, WordPress 也不要更新源文件以使用新版本。这两个操作都可能导致您的文章 URL 返回 404 错误,即使这些 URL 仍然位于数据库和文件系统中。

要升级 WordPress
  1. 在 WordPress 管理员控制台中,使用导出工具将您的帖子导出到 XML 文件。

  2. 使用与安装先前版本相同的步骤在 Elastic Beanstalk 上部署和安装新版本。 WordPress 要避免停机,您可以使用新版本创建环境。

  3. 在新版本中,在管理员控制台中安装导入 WordPress 器工具,然后使用它来导入包含您的帖子的 XML 文件。如果文章由使用旧版本的管理员用户创建,请将文章分配到新站点上的管理员用户而不是尝试导入管理员用户。

  4. 如果您将新版本部署到单独的环境,请执行 CNAME 交换 以将用户从旧站点重定向到新站点。

清理

Elastic Beanstalk 使用完毕时,您可以终止您的环境。Elastic Beanstalk Amazon 会终止与您的环境关联的所有资源,例如 Amazon EC2 实例、数据库实例、负载均衡器、安全组和警报。

终止 Elastic Beanstalk 环境
  1. 打开 Elastic Beanstalk 控制台,然后在 “区域” 列表中,选择您的。 Amazon Web Services 区域

  2. 在导航窗格中,选择 Environments(环境),然后从列表中选择环境的名称。

    注意

    如果您有多个环境,请使用搜索栏筛选环境列表。

  3. 选择 Actions(操作),然后选择 Terminate environment(终止环境)。

  4. 使用屏幕上的对话框确认环境终止。

利用 Elastic Beanstalk,可以随时为您的应用程序轻松创建新环境。

此外,您还可以终止在您的 Elastic Beanstalk 环境外部创建的数据库资源。当您终止 Amazon RDS 数据库实例时,可以拍摄快照并在以后将数据恢复到其他实例。

终止您的 RDS 数据库实例
  1. 打开 Amazon RDS 控制台

  2. 选择 Databases(数据库)。

  3. 选择您的数据库实例。

  4. 选择操作,然后选择删除

  5. 选择是否创建快照,然后选择删除

后续步骤

当您继续开发应用程序时,您可能希望通过某种方式来管理环境和部署应用程序,而无需手动创建 .zip 文件并将该文件上传到 Elastic Beanstalk 控制台。Elastic Beanstalk 命令行界面 (EB CLI easy-to-use ) 提供了从命令行创建、配置应用程序并将其部署到 Elastic Beanstalk 环境的命令。

示例应用程序使用配置文件配置 PHP 设置,并在数据库中创建一个表 (如果尚未存在)。您还可以使用配置文件在环境创建期间配置实例的安全组设置,以避免耗时的配置更新。请参阅使用配置文件 (.ebextensions) 进行高级环境自定义了解更多信息。

对于开发和测试,您可能希望使用 Elastic Beanstalk 的用于将托管数据库实例直接添加到环境的功能。有关在环境内设置数据库的说明,请参阅将数据库添加到 Elastic Beanstalk 环境

如果您需要高性能数据库,请考虑使用 Amazon Aurora。Amazon Aurora 是与 MySQL 兼容的数据库引擎,能够以低成本提供商用数据库功能。要将您的应用程序连接到另一个数据库,请重复执行安全组配置步骤并更新与 RDS 相关的环境属性

最后,如果计划在生产环境中使用应用程序,您会希望为环境配置自定义域名,并为安全连接启用 HTTPS