

# 教程：创建 Web 服务器和 Amazon RDS 数据库实例
<a name="TUT_WebAppWithRDS"></a>

本教程说明如何使用 PHP 安装 Apache Web 服务器并创建 MariaDB、MySQL 或 PostgreSQL 数据库。Web 服务器在使用 Amazon Linux 2023 的 Amazon EC2 实例上运行，您可以在 MySQL 或 PostgreSQL 数据库实例之间进行选择。Amazon EC2 实例和数据库实例均在基于 Amazon VPC 服务的 Virtual Private Cloud (VPC) 中运行。

**重要**  
创建 AWS 账户并不会收费；但是，在完成本教程过程中使用 AWS 资源可能会产生费用。完成本教程后，如果不再需要这些资源，可以将其删除。

**注意**  
本教程适用于 Amazon Linux 2023，可能不适用于其他版本的 Linux。

在下面的教程中，您将创建一个对您的 AWS 账户使用默认 VPC、子网和安全组的 EC2 实例。本教程说明如何创建数据库实例，并自动设置与您创建的 EC2 实例的连接。然后，本教程向您展示如何在 EC2 实例上安装 Web 服务器。您使用数据库实例端点，将 Web 服务器连接到 VPC 中的数据库实例。

1. [启动 EC2 实例以连接数据库实例](CHAP_Tutorials.WebServerDB.LaunchEC2.md)

1. [创建 Amazon RDS 数据库实例](CHAP_Tutorials.WebServerDB.CreateDBInstance.md)

1. [在 EC2 实例上安装 Web 服务器](CHAP_Tutorials.WebServerDB.CreateWebServer.md)

下图显示了教程完成时的配置。

![\[单个 VPC 方案\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/con-VPC-sec-grp.png)


**注意**  
完成本教程后，VPC 的每个可用区中都有一个公有和私有子网。本教程对您的 AWS 账户使用默认 VPC，并自动设置您的 EC2 实例与数据库实例之间的连接。如果您更愿意为此场景配置新的 VPC，请完成[教程：创建 VPC 以用于数据库实例（仅限 IPv4）](CHAP_Tutorials.WebServerDB.CreateVPC.md)中的任务。

# 启动 EC2 实例以连接数据库实例
<a name="CHAP_Tutorials.WebServerDB.LaunchEC2"></a>

在您的 VPC 的公有子网中创建 Amazon EC2 实例。

**启动 EC2 实例**

1. 登录 AWS 管理控制台，打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在 AWS 管理控制台的右上角，选择要在其中创建 EC2 实例的 AWS 区域。

1. 选择 **EC2 控制面板**，然后选择**启动实例**，如下所示。  
![\[EC2 Dashboard\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_11.png)

1. 在**启动实例**页面中选择以下设置。

   1. 在 **Name and tags**（名称和标签）下，对于 **Name**（名称），输入 **tutorial-ec2-instance-web-server**。

   1. 在**应用程序和操作系统映像（Amazon 机器映像）**下，选择 **Amazon Linux**，然后选择 **Amazon Linux 2023 AMI**。对于其他选项保留原定设置值。  
![\[选择一个 Amazon Machine Image\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_12.png)

   1. 在 **Instance type**（实例类型）下，选择 **t2.micro**。

   1. 在 **Key pair (login)** [密钥对（登录）] 下，选择 **Key pair name**（密钥对名称）以使用现有密钥对。要为 Amazon EC2 实例创建新的密钥对，请选择 **Create new key pair**（创建新的密钥对），然后使用 **Create key pair**（创建密钥对）窗口来创建它。

      有关创建新的密钥对的更多信息，请参阅《Amazon EC2 用户指南》**中的[创建密钥对](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/get-set-up-for-amazon-ec2.html#create-a-key-pair)。

   1. 在 **Network settings**（网络设置）下，设置以下值并将其他值保留为其原定设置值：
      + 对于 **Allow SSH traffic from**（允许 SSH 流量来自），选择 EC2 实例的 SSH 连接来源。

        如果显示的 IP 地址对于 SSH 连接是正确的，您可以选择 **My IP**（我的 IP）。

        否则，您可以确定要用来通过 Secure Shell（SSH）连接到 VPC 中的 EC2 实例的 IP 地址。要确定您的公有 IP 地址，请在新的浏览器窗口或标签页中，使用 [https://checkip.amazonaws.com](https://checkip.amazonaws.com) 上的服务。IP 地址的一个示例为 `203.0.113.25/32`。

        在许多情况下，您可能通过互联网服务提供商（ISP）进行连接，或者在不使用静态 IP 地址的情况下从防火墙之后进行连接。如果是这样，请确保确定客户端计算机使用的 IP 地址范围。
**警告**  
如果您使用 `0.0.0.0/0` 进行 SSH 访问，则所有 IP 地址可能能够使用 SSH 访问您的公有实例。在测试环境下短时间内，此方法尚可接受，但它对于生产环境并不安全。在生产环境中，将仅向特定 IP 地址或地址范围授权使用 SSH 访问您的实例。
      + 开启 **Allow HTTPs traffic from the internet**（允许来自互联网的 HTTPs 流量）。
      + 开启 **Allow HTTP traffic from the internet**（允许来自互联网的 HTTP 流量）。  
![\[配置实例详细信息\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_14.png)

   1. 对于其余部分保留原定设置值。

   1. 查看 **Summary**（摘要）面板中您的实例配置的摘要，当您准备好后，选择 **Launch instance**（启动实例）。

1. 在**启动状态**页面上，记下新 EC2 实例的标识符，例如：`i-1234567890abcdef0`。  
![\[“启动状态”页面上的 EC2 实例标识符。\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/getting-started-ec2-id.png)

1. 选择 EC2 实例标识符以打开 EC2 实例列表，然后选择您的 EC2 实例。

1. 在**详细信息**选项卡中，记下使用 SSH 进行连接时所需的以下值：

   1. 在**实例摘要**中，记下**公有 IPv4 DNS** 的值。  
![\[“实例”页面的“详细信息”选项卡上的 EC2 公有 DNS 名称。\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/easy-create-ec2-public-dns.png)

   1. 在**实例详细信息**中，记下**密钥对名称**的值。  
![\[“实例”页面的“详细信息”选项卡上的 EC2 密钥对名称。\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/easy-create-ec2-key-pair.png)

1. 一直等到实例的 **Instance state**（实例状态）变为 **Running**（正在运行），才能继续。

1. 完成 [创建 Amazon RDS 数据库实例](CHAP_Tutorials.WebServerDB.CreateDBInstance.md)。

# 创建 Amazon RDS 数据库实例
<a name="CHAP_Tutorials.WebServerDB.CreateDBInstance"></a>

创建维护 Web 应用程序所用数据的 RDS for MariaDB、RDS for MySQL 或 RDS for PostgreSQL 数据库实例。

------
#### [ RDS for MariaDB ]

**创建 MariaDB 实例**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在 AWS 管理控制台的右上角，检查 AWS 区域。它应与您在其中创建了 EC2 实例的区域相同。

1. 在导航窗格中，选择 **Databases (数据库)**。

1. 选择**创建数据库**。

1. 在**创建数据库**页面上，选择**标准创建**。

1. 对于**引擎选项**，选择 **MariaDB**。  
![\[选择引擎类型\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/tutorial-create-mariadb.png)

1. 对于**模板**，选择**免费套餐**或**沙盒**。对于免费套餐账户，将显示**免费套餐**。对于付费套餐账户，将显示**沙盒**。  
![\[选择模板\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/tutorial-create-template.png)

1. 在 **Availability and durability**（可用性和持久性）部分中，保留默认值。

1. 在**设置**部分中，选择这些值：
   + **DB instance identifier**（数据库实例标识符）– 键入 **tutorial-db-instance**。
   + **Master username**（主用户名）– 键入 **tutorial\$1user**。
   + **Auto generate a password**（自动生成密码）– 将该选项保留为关闭状态。
   + **Master password**（主密码）– 键入密码。
   + **确认密码** – 重新键入密码。  
![\[“设置”部分\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_Settings.png)

1. 在 **Instance configuration**（实例配置）部分中，设置以下值：
   + **可突增类（包括 t 类）**
   + **db.t3.micro**  
![\[实例配置部分\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_DB_instance_micro.png)

1. 在 **Storage**（存储）部分中，保留默认值。

1. 在 **Connectivity**（连接）部分中，设置以下值并将其他值保留为其默认值：
   + 对于 **Compute resource**（计算资源），选择 **Connect to an EC2 compute resource**（连接到 EC2 计算资源）。
   + 对于 **EC2 instance**（EC2 实例），选择您之前创建的 EC2 实例，例如 **tutorial-ec2-instance-web-server**。  
![\[“连接”部分\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_Connectivity.png)

1. 在 **Database authentication**（数据库身份验证）部分中，确保选择了 **Password authentication**（密码身份验证）。

1. 打开**附加配置**部分，然后为**初始数据库名称**输入 **sample**。保留其他选项的默认设置。

1. 要创建 MariaDB 实例，请选择**创建数据库**。

   您的新数据库实例显示在**数据库**列表中，状态为**正在创建**。

1. 等待新数据库实例的**状态**显示为**可用**。然后选择数据库实例名称以显示其详细信息。

1. 在**连接性和安全性**部分中，查看数据库实例的**终端节点**和**端口**。  
![\[数据库实例详细信息\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_Endpoint_Port.png)

   记下数据库实例的终端节点和端口。您使用这些信息将 Web 服务器连接到数据库实例。

1. 完成[在 EC2 实例上安装 Web 服务器](CHAP_Tutorials.WebServerDB.CreateWebServer.md)。

------
#### [ RDS for MySQL ]

**创建 MySQL 数据库实例**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在 AWS 管理控制台的右上角，检查 AWS 区域。它应与您在其中创建了 EC2 实例的区域相同。

1. 在导航窗格中，选择 **Databases (数据库)**。

1. 选择**创建数据库**。

1. 在**创建数据库**页面上，选择**标准创建**。

1. 对于**引擎选项**，选择 **MySQL**。  
![\[选择引擎类型\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/tutorial-create-mysql.png)

1. 对于**模板**，选择**免费套餐**或**沙盒**。对于免费套餐账户，将显示**免费套餐**。对于付费套餐账户，将显示**沙盒**。  
![\[选择模板\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/tutorial-create-template.png)

1. 在 **Availability and durability**（可用性和持久性）部分中，保留默认值。

1. 在**设置**部分中，选择这些值：
   + **DB instance identifier**（数据库实例标识符）– 键入 **tutorial-db-instance**。
   + **Master username**（主用户名）– 键入 **tutorial\$1user**。
   + **Auto generate a password**（自动生成密码）– 将该选项保留为关闭状态。
   + **Master password**（主密码）– 键入密码。
   + **确认密码** – 重新键入密码。  
![\[“设置”部分\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_Settings.png)

1. 在 **Instance configuration**（实例配置）部分中，设置以下值：
   + **可突增类（包括 t 类）**
   + **db.t3.micro**  
![\[实例配置部分\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_DB_instance_micro.png)

1. 在 **Storage**（存储）部分中，保留默认值。

1. 在 **Connectivity**（连接）部分中，设置以下值并将其他值保留为其默认值：
   + 对于 **Compute resource**（计算资源），选择 **Connect to an EC2 compute resource**（连接到 EC2 计算资源）。
   + 对于 **EC2 instance**（EC2 实例），选择您之前创建的 EC2 实例，例如 **tutorial-ec2-instance-web-server**。  
![\[“连接”部分\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_Connectivity.png)

1. 在 **Database authentication**（数据库身份验证）部分中，确保选择了 **Password authentication**（密码身份验证）。

1. 打开**附加配置**部分，然后为**初始数据库名称**输入 **sample**。保留其他选项的默认设置。

1. 要创建 MySQL 数据库实例，请选择 **Create database**（创建数据库）。

   您的新数据库实例显示在**数据库**列表中，状态为**正在创建**。

1. 等待新数据库实例的**状态**显示为**可用**。然后选择数据库实例名称以显示其详细信息。

1. 在**连接性和安全性**部分中，查看数据库实例的**终端节点**和**端口**。  
![\[数据库实例详细信息\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_Endpoint_Port.png)

   记下数据库实例的终端节点和端口。您使用这些信息将 Web 服务器连接到数据库实例。

1. 完成[在 EC2 实例上安装 Web 服务器](CHAP_Tutorials.WebServerDB.CreateWebServer.md)。

------
#### [ RDS for PostgreSQL ]

**创建 PostgreSQL 数据库实例**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在 AWS 管理控制台的右上角，检查 AWS 区域。它应与您在其中创建了 EC2 实例的区域相同。

1. 在导航窗格中，选择 **Databases (数据库)**。

1. 选择**创建数据库**。

1. 在**创建数据库**页面上，选择**标准创建**。

1. 对于**引擎选项**，选择 **PostgreSQL**。  
![\[选择引擎类型\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/tutorial-create-postgres.png)

1. 对于**模板**，选择**免费套餐**或**沙盒**。对于免费套餐账户，将显示**免费套餐**。对于付费套餐账户，将显示**沙盒**。  
![\[选择模板\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/tutorial-create-template.png)

1. 在 **Availability and durability**（可用性和持久性）部分中，保留默认值。

1. 在**设置**部分中，选择这些值：
   + **DB instance identifier**（数据库实例标识符）– 键入 **tutorial-db-instance**。
   + **Master username**（主用户名）– 键入 **tutorial\$1user**。
   + **Auto generate a password**（自动生成密码）– 将该选项保留为关闭状态。
   + **Master password**（主密码）– 键入密码。
   + **确认密码** – 重新键入密码。  
![\[“设置”部分\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_Settings.png)

1. 在 **Instance configuration**（实例配置）部分中，设置以下值：
   + **可突增类（包括 t 类）**
   + **db.t3.micro**  
![\[实例配置部分\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_DB_instance_micro.png)

1. 在 **Storage**（存储）部分中，保留默认值。

1. 在 **Connectivity**（连接）部分中，设置以下值并将其他值保留为其默认值：
   + 对于 **Compute resource**（计算资源），选择 **Connect to an EC2 compute resource**（连接到 EC2 计算资源）。
   + 对于 **EC2 instance**（EC2 实例），选择您之前创建的 EC2 实例，例如 **tutorial-ec2-instance-web-server**。  
![\[“连接”部分\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_Connectivity.png)

1. 在 **Database authentication**（数据库身份验证）部分中，确保选择了 **Password authentication**（密码身份验证）。

1. 打开**附加配置**部分，然后为**初始数据库名称**输入 **sample**。保留其他选项的默认设置。

1. 要创建 PostgreSQL 数据库实例，请选择**创建数据库**。

   您的新数据库实例显示在**数据库**列表中，状态为**正在创建**。

1. 等待新数据库实例的**状态**显示为**可用**。然后选择数据库实例名称以显示其详细信息。

1. 在**连接性和安全性**部分中，查看数据库实例的**终端节点**和**端口**。  
![\[数据库实例详细信息\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_Endpoint_Port_postgres.png)

   记下数据库实例的终端节点和端口。您使用这些信息将 Web 服务器连接到数据库实例。

1. 完成[在 EC2 实例上安装 Web 服务器](CHAP_Tutorials.WebServerDB.CreateWebServer.md)。

------

# 在 EC2 实例上安装 Web 服务器
<a name="CHAP_Tutorials.WebServerDB.CreateWebServer"></a>

在您在[启动 EC2 实例以连接数据库实例](CHAP_Tutorials.WebServerDB.LaunchEC2.md)中创建的 EC2 实例上安装 Web 服务器。Web 服务器连接到您在[创建 Amazon RDS 数据库实例](CHAP_Tutorials.WebServerDB.CreateDBInstance.md)中创建的 Amazon RDS 数据库实例。

## 使用 PHP 和 MariaDB 安装 Apache Web 服务器
<a name="CHAP_Tutorials.WebServerDB.CreateWebServer.Apache"></a>

连接到 EC2 实例并安装 Web 服务器。

**连接到 EC2 实例并安装带有 PHP 的 Apache Web 服务器**

1. 按照《Amazon EC2 用户指南》**中的[连接到 Linux 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstances.html)中的步骤操作，连接到您之前创建的 EC2 实例。

   建议您使用 SSH 连接到 EC2 实例。如果 SSH 客户端实用程序安装在 Windows、Linux 或 Mac 上，则可以使用以下命令格式连接到该实例：

   ```
   ssh -i location_of_pem_file ec2-user@ec2-instance-public-dns-name
   ```

   例如，假设在 Linux 上 `ec2-database-connect-key-pair.pem` 存储在 `/dir1` 中，而 EC2 实例的公有 IPv4 DNS 为 `ec2-12-345-678-90.compute-1.amazonaws.com`。SSH 命令将如下所示：

   ```
   ssh -i /dir1/ec2-database-connect-key-pair.pem ec2-user@ec2-12-345-678-90.compute-1.amazonaws.com
   ```

1. 通过更新 EC2 实例上的软件，获取最新的错误修复和安全更新。要执行此操作，请使用以下命令。
**注意**  
`-y` 选项安装更新时不提示确认。要在安装前检查更新，请忽略该选项。

   ```
   sudo dnf update -y
   ```

1. 更新完成后，使用以下命令安装 Apache Web 服务器、PHP 和 MariaDB 或 PostgreSQL 软件。此命令同时安装多个软件包和相关依赖项。

------
#### [ MariaDB & MySQL ]

   ```
   sudo dnf install -y httpd php php-mysqli mariadb105
   ```

------
#### [ PostgreSQL ]

   ```
   sudo dnf install -y httpd php php-pgsql postgresql15
   ```

------

   如果您收到错误，则您的实例可能不是使用 Amazon Linux 2023 AMI 启动的。您可能使用的是 Amazon Linux 2 AMI。您可以使用以下命令查看 Amazon Linux 的版本。

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

   有关更多信息，请参阅[更新实例软件](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/install-updates.html)。

1. 使用下面所示的命令启动 Web 服务器。

   ```
   sudo systemctl start httpd
   ```

   您可以测试 Web 服务器是否已正确安装和启动。为此，请在 Web 浏览器的地址栏中输入 EC2 实例的公有域名系统 (DNS) 名称，例如：`http://ec2-42-8-168-21.us-west-1.compute.amazonaws.com`。如果 Web 服务器正在运行，您将看到 Apache 测试页面。

   如果您没有看到 Apache 测试页面，请检查您在[教程：创建 VPC 以用于数据库实例（仅限 IPv4）](CHAP_Tutorials.WebServerDB.CreateVPC.md)中创建的 VPC 安全组的入站规则。确保入站规则包括一条允许 HTTP（端口 80）访问 IP 地址以连接到 Web 服务器的规则。
**注意**  
Apache 测试页面仅在文档根目录 `/var/www/html` 中无内容时才显示。将内容添加到文档根目录后，您的内容将显示在 EC2 实例的公有 DNS 地址处。在此之前，它出现在 Apache 测试页面上。

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

   ```
   sudo systemctl enable httpd
   ```

要允许 `ec2-user` 在 Apache Web 服务器的默认根目录中管理文件，请修改 `/var/www` 目录的所有权和权限。有多种方式可以完成此任务。在本教程中，可将 `ec2-user` 添加到 `apache` 组，将 `apache` 目录的所有权授予 `/var/www` 组，并为该组指定写入权限。

**设置 Apache Web 服务器的文件权限**

1. 将 `ec2-user` 用户添加到 `apache` 组。

   ```
   sudo usermod -a -G apache ec2-user
   ```

1. 注销以刷新您的权限并包含新的 `apache` 组。

   ```
   exit
   ```

1. 再重新登录并使用 `apache` 命令验证 `groups` 组是否存在。

   ```
   groups
   ```

   输出看上去类似于以下内容：

   ```
   ec2-user adm wheel apache systemd-journal
   ```

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

   ```
   sudo chown -R ec2-user:apache /var/www
   ```

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

   ```
   sudo chmod 2775 /var/www
   find /var/www -type d -exec sudo chmod 2775 {} \;
   ```

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

   ```
   find /var/www -type f -exec sudo chmod 0664 {} \;
   ```

现在，`ec2-user`（和 `apache` 组的任何将来成员）可以添加、删除和编辑 Apache 文档根目录中的文件。这使您可以添加内容，例如静态网站或 PHP 应用程序。

**注意**  
运行 HTTP 协议的 Web 服务器不为其发送或接收的数据提供传输安全。当您使用 Web 浏览器连接 HTTP 服务器时，窃取者可在沿网络路径的任何位置看到许多信息。这些信息包括您访问的 URL、您接收的网页内容以及任何 HTML 表单的内容（包括密码）。  
保护您的 Web 服务器的最佳实践是安装对于 HTTPS（HTTP Secure）的支持。此协议利用 SSL/TLS 加密保护您的数据。有关更多信息，请参阅在*Amazon EC2用户指南*中的[教程：使用 Amazon Linux AMI 配置 SSL/TLS](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/SSL-on-amazon-linux-ami.html)。

## 将您的 Apache Web 服务器连接到数据库实例
<a name="CHAP_Tutorials.WebServerDB.CreateWebServer.PHPContent"></a>

接着，将内容添加到连接到 Amazon RDS 数据库实例的 Apache Web 服务器。

**将内容添加到连接到数据库实例的 Apache Web 服务器**

1. 在仍连接到 EC2 实例时，将目录更改到 `/var/www` 并创建名为 `inc` 的新子目录。

   ```
   cd /var/www
   mkdir inc
   cd inc
   ```

1. 在名为 `inc` 的 `dbinfo.inc` 目录中新建文件，然后通过调用 nano（或您选择的编辑器）编辑文件。

   ```
   >dbinfo.inc
   nano dbinfo.inc
   ```

1. 将以下内容添加到 `dbinfo.inc` 文件。在这里，*db\$1instance\$1endpoint* 是数据库集群的不带端口的数据库集群写入器端点。
**注意**  
我们建议将用户名和密码信息放在不属于 Web 服务器的文档根目录的文件夹中。这样做会减少您的安全信息被泄露的可能性。  
确保在应用程序中将 `master password` 更改为合适的密码。

   ```
   <?php
   
   define('DB_SERVER', 'db_instance_endpoint');
   define('DB_USERNAME', 'tutorial_user');
   define('DB_PASSWORD', 'master password');
   define('DB_DATABASE', 'sample');
   ?>
   ```

1. 保存并关闭 `dbinfo.inc` 文件。如果您使用的是 nano，请使用 Ctrl\$1S 和 Ctrl\$1X 保存并关闭文件。

1. 将目录更改为 `/var/www/html`。

   ```
   cd /var/www/html
   ```

1. 在名为 `html` 的 `SamplePage.php` 目录中新建文件，然后通过调用 nano（或您选择的编辑器）编辑文件。

   ```
   >SamplePage.php
   nano SamplePage.php
   ```

1. 将以下内容添加到 `SamplePage.php` 文件：

------
#### [ MariaDB & MySQL ]

   ```
   <?php include "../inc/dbinfo.inc"; ?>
   <html>
   <body>
   <h1>Sample page</h1>
   <?php
   
     /* Connect to MySQL and select the database. */
     $connection = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD);
   
     if (mysqli_connect_errno()) echo "Failed to connect to MySQL: " . mysqli_connect_error();
   
     $database = mysqli_select_db($connection, DB_DATABASE);
   
     /* Ensure that the EMPLOYEES table exists. */
     VerifyEmployeesTable($connection, DB_DATABASE);
   
     /* If input fields are populated, add a row to the EMPLOYEES table. */
     $employee_name = htmlentities($_POST['NAME']);
     $employee_address = htmlentities($_POST['ADDRESS']);
   
     if (strlen($employee_name) || strlen($employee_address)) {
       AddEmployee($connection, $employee_name, $employee_address);
     }
   ?>
   
   <!-- Input form -->
   <form action="<?PHP echo $_SERVER['SCRIPT_NAME'] ?>" method="POST">
     <table border="0">
       <tr>
         <td>NAME</td>
         <td>ADDRESS</td>
       </tr>
       <tr>
         <td>
           <input type="text" name="NAME" maxlength="45" size="30" />
         </td>
         <td>
           <input type="text" name="ADDRESS" maxlength="90" size="60" />
         </td>
         <td>
           <input type="submit" value="Add Data" />
         </td>
       </tr>
     </table>
   </form>
   
   <!-- Display table data. -->
   <table border="1" cellpadding="2" cellspacing="2">
     <tr>
       <td>ID</td>
       <td>NAME</td>
       <td>ADDRESS</td>
     </tr>
   
   <?php
   
   $result = mysqli_query($connection, "SELECT * FROM EMPLOYEES");
   
   while($query_data = mysqli_fetch_row($result)) {
     echo "<tr>";
     echo "<td>",$query_data[0], "</td>",
          "<td>",$query_data[1], "</td>",
          "<td>",$query_data[2], "</td>";
     echo "</tr>";
   }
   ?>
   
   </table>
   
   <!-- Clean up. -->
   <?php
   
     mysqli_free_result($result);
     mysqli_close($connection);
   
   ?>
   
   </body>
   </html>
   
   
   <?php
   
   /* Add an employee to the table. */
   function AddEmployee($connection, $name, $address) {
      $n = mysqli_real_escape_string($connection, $name);
      $a = mysqli_real_escape_string($connection, $address);
   
      $query = "INSERT INTO EMPLOYEES (NAME, ADDRESS) VALUES ('$n', '$a');";
   
      if(!mysqli_query($connection, $query)) echo("<p>Error adding employee data.</p>");
   }
   
   /* Check whether the table exists and, if not, create it. */
   function VerifyEmployeesTable($connection, $dbName) {
     if(!TableExists("EMPLOYEES", $connection, $dbName))
     {
        $query = "CREATE TABLE EMPLOYEES (
            ID int(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
            NAME VARCHAR(45),
            ADDRESS VARCHAR(90)
          )";
   
        if(!mysqli_query($connection, $query)) echo("<p>Error creating table.</p>");
     }
   }
   
   /* Check for the existence of a table. */
   function TableExists($tableName, $connection, $dbName) {
     $t = mysqli_real_escape_string($connection, $tableName);
     $d = mysqli_real_escape_string($connection, $dbName);
   
     $checktable = mysqli_query($connection,
         "SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_NAME = '$t' AND TABLE_SCHEMA = '$d'");
   
     if(mysqli_num_rows($checktable) > 0) return true;
   
     return false;
   }
   ?>
   ```

------
#### [ PostgreSQL ]

   ```
   <?php include "../inc/dbinfo.inc"; ?>
   
   <html>
   <body>
   <h1>Sample page</h1>
   <?php
   
   /* Connect to PostgreSQL and select the database. */
   $constring = "host=" . DB_SERVER . " dbname=" . DB_DATABASE . " user=" . DB_USERNAME . " password=" . DB_PASSWORD ;
   $connection = pg_connect($constring);
   
   if (!$connection){
    echo "Failed to connect to PostgreSQL";
    exit;
   }
   
   /* Ensure that the EMPLOYEES table exists. */
   VerifyEmployeesTable($connection, DB_DATABASE);
   
   /* If input fields are populated, add a row to the EMPLOYEES table. */
   $employee_name = htmlentities($_POST['NAME']);
   $employee_address = htmlentities($_POST['ADDRESS']);
   
   if (strlen($employee_name) || strlen($employee_address)) {
     AddEmployee($connection, $employee_name, $employee_address);
   }
   
   ?>
   
   <!-- Input form -->
   <form action="<?PHP echo $_SERVER['SCRIPT_NAME'] ?>" method="POST">
     <table border="0">
       <tr>
         <td>NAME</td>
         <td>ADDRESS</td>
       </tr>
       <tr>
         <td>
       <input type="text" name="NAME" maxlength="45" size="30" />
         </td>
         <td>
       <input type="text" name="ADDRESS" maxlength="90" size="60" />
         </td>
         <td>
       <input type="submit" value="Add Data" />
         </td>
       </tr>
     </table>
   </form>
   <!-- Display table data. -->
   <table border="1" cellpadding="2" cellspacing="2">
     <tr>
       <td>ID</td>
       <td>NAME</td>
       <td>ADDRESS</td>
     </tr>
   
   <?php
   
   $result = pg_query($connection, "SELECT * FROM EMPLOYEES");
   
   while($query_data = pg_fetch_row($result)) {
     echo "<tr>";
     echo "<td>",$query_data[0], "</td>",
          "<td>",$query_data[1], "</td>",
          "<td>",$query_data[2], "</td>";
     echo "</tr>";
   }
   ?>
   </table>
   
   <!-- Clean up. -->
   <?php
   
     pg_free_result($result);
     pg_close($connection);
   ?>
   </body>
   </html>
   
   
   <?php
   
   /* Add an employee to the table. */
   function AddEmployee($connection, $name, $address) {
      $n = pg_escape_string($name);
      $a = pg_escape_string($address);
      echo "Forming Query";
      $query = "INSERT INTO EMPLOYEES (NAME, ADDRESS) VALUES ('$n', '$a');";
   
      if(!pg_query($connection, $query)) echo("<p>Error adding employee data.</p>"); 
   }
   
   /* Check whether the table exists and, if not, create it. */
   function VerifyEmployeesTable($connection, $dbName) {
     if(!TableExists("EMPLOYEES", $connection, $dbName))
     {
        $query = "CREATE TABLE EMPLOYEES (
            ID serial PRIMARY KEY,
            NAME VARCHAR(45),
            ADDRESS VARCHAR(90)
          )";
   
        if(!pg_query($connection, $query)) echo("<p>Error creating table.</p>"); 
     }
   }
   /* Check for the existence of a table. */
   function TableExists($tableName, $connection, $dbName) {
     $t = strtolower(pg_escape_string($tableName)); //table name is case sensitive
     $d = pg_escape_string($dbName); //schema is 'public' instead of 'sample' db name so not using that
   
     $query = "SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_NAME = '$t';";
     $checktable = pg_query($connection, $query);
   
     if (pg_num_rows($checktable) >0) return true;
     return false;
   
   }
   ?>
   ```

------

1. 保存并关闭 `SamplePage.php` 文件。

1. 打开 Web 浏览器并浏览到 `http://EC2 instance endpoint/SamplePage.php`（例如：`http://ec2-12-345-67-890.us-west-2.compute.amazonaws.com/SamplePage.php`）来验证 Web 服务器是否已成功连接到数据库实例。

您可以使用 `SamplePage.php` 将数据添加到数据库实例。您添加的数据之后将显示在该页面上。要验证数据是否已插入到表中，请在 Amazon EC2 实例上安装 MySQL 客户端。然后，连接到数据库实例并查询表。

有关安装 MySQL 客户端并连接到数据库实例的信息，请参阅 [连接到 MySQL 数据库实例](USER_ConnectToInstance.md)。

要确保您的数据库实例尽可能安全，请验证 VPC 外部的源是否无法连接到您的数据库实例。

在您完成 Web 服务器和数据库测试后，应删除您的数据库实例 和 Amazon EC2 实例。
+ 要删除数据库实例，请按照 [删除数据库实例](USER_DeleteInstance.md) 中的说明操作。您无需创建最终快照。
+ 要终止 Amazon EC2 实例，请按照 *Amazon EC2 用户指南*中的[终止实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/terminating-instances.html)中的说明操作。