+86 135 410 16684Mon. - Fri. 10:00-22:00

教程:创建 Web 服务器和 Amazon RDS 数据库

教程:创建 Web 服务器和 Amazon RDS 数据库

教程:创建 Web 服务器和 Amazon RDS 数据库

本教程帮助您使用 PHP 安装 Apache Web 服务器并创建 MySQL 数据库。Web 服务器在使用 Amazon Linux 的 Amazon EC2 实例上运行,而 MySQL 数据库是 Amazon RDS MySQL 数据库实例。Amazon EC2 实例和 Amazon RDS 数据库实例均在基于 Amazon Virtual Private Cloud 服务 (Amazon VPC) 的 VPC 中运行。

注意

本教程适用于 Amazon Linux,可能不适用于其他版本的 Linux,如 Ubuntu。

在开始此教程之前,您必须具有包含公有子网和私有子网的 VPC 和对应的安全组。如果您没有上述必备项,请完成以下教程:

在此教程中,您将执行下列步骤:

  • 步骤 1:创建 RDS 数据库实例
  • 步骤 2:创建 EC2 实例并安装 Web 服务器
  • 步骤 1:创建 RDS 数据库实例

    在此步骤中,创建维护 Web 应用程序所用数据的 Amazon RDS MySQL 数据库实例。

    注意

    在开始此步骤之前,您必须具有包含公用和私有子网的 VPC 以及相应的安全组。如果您没有上述必备项,请参阅教程:创建 Amazon VPC 以用于 Amazon RDS 数据库实例

    启动 MySQL 数据库实例

    1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/
    2. 在 AWS 管理控制台的右上角,选择您要在其中创建数据库实例的区域。此示例使用美国西部(俄勒冈)区域。
    3. 选择 Instances
    4. 选择 Launch DB Instance
    5. Select Engine 页(如下所示)上,选择 MySQL 数据库引擎,然后选择 Select
      MySQL-Launch01
    6. Production 页(Dev/Test 下)上,选择 MySQL This instance is intended for use outside of production,然后选择 Next Step
    7. 在下面所示的 Specify DB Details 页面上,设置以下值:
      • DB Engine Version:使用默认值。
      • 数据库实例类: db.t2.micro
      • 多可用区部署: No
      • 存储类型: Magnetic
      • 分配的存储空间: 50 GB
      • 数据库实例标识符: tutorial-db-instance
      • Master Username: tutorial_user
      • Master Password:选择密码。
      • Confirm Password:重新键入密码。
      Tutorial_WebServer_08
    8. 选择 Next Step,并在下面所示的 Configure Advanced Settings 页面中设置以下值:
      • VPC:选择现有 VPC,例如 tutorial-vpc (vpc-f1b76594)
      • Subnet groupCreate a new DB Subnet Group
      • 公开访问: No
      • 可用区:No Preference
      • VPC 安全组:选择现有安全组,例如 tutorial-db-securitygroup
      • 数据库名称: sample
      Tutorial_WebServer_09
    9. 要创建 Amazon RDS MySQL 数据库实例,请选择 Launch DB Instance
    10. 在下一页上,选择 View Your DB Instances 以查看 RDS MySQL 数据库实例。
    11. 等待新数据库实例的状态显示为 available。然后选择数据库实例左侧的选择框来显示数据库实例详细信息,如下所示。
      Tutorial_WebServer_10

      记下数据库实例的终端节点。此终端节点显示服务器名称和用于将 Web 服务器连接到 RDS 数据库实例的端口。

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

    下一步

    步骤 2:创建 EC2 实例并安装 Web 服务器

  • 步骤 2:创建 EC2 实例并安装 Web 服务器

    在此步中,创建连接到您在步骤 1:创建 RDS 数据库实例中创建的 Amazon RDS 数据库实例的 Web 服务器。

    启动 EC2 实例

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

    启动 EC2 实例

    1. 登录 AWS 管理控制台并通过以下网址打开 Amazon EC2 控制台 https://console.aws.amazon.com/ec2/
    2. 选择 EC2 Dashboard,然后选择 Launch Instance,如下所示。
      Tutorial_WebServer_11
    3. 选择 Amazon Linux Amazon Machine Image (AMI),如下所示。
      Tutorial_WebServer_12
    4. 选择下面所示的 t2.micro 实例类型,然后选择 Next: Configure Instance Details
      Tutorial_WebServer_13
    5. 在下面所示的 Configure Instance Details 页面上,设置以下值并将其他值保留为其默认值:
      • 网络:选择现有 VPC,例如:vpc-f1b76594 (10.0.0.0/16) | tutorial-vpc
      • 子网:选择现有公有子网,例如:subnet-fe2adba7(10.0.0.0/24)| Tutorial-public | us-west-2a
      • 自动分配公有 IP: Enable
      Tutorial_WebServer_14
    6. 选择 Next: Add Storage
    7. Add Storage 页面上,保留默认值并选择 Next: Tag Instance
    8. 在下面所示的 Tag Instance 页面上,将 Name 标签的 Value 设置为 tutorial-web-server,然后选择 Next: Configure Security Group
      Tutorial_WebServer_15
    9. Configure Security Group 页(如下所示)上,选择 Select an existing security group,然后选择现有安全组,例如:tutorial-securitygroup。安全组必须包括 SSH 和 HTTP 访问的入站规则。
      Tutorial_WebServer_16
    10. 选择 Review and Launch
    11. 在下面所示的 Review Instance Launch 页面上,确认您的设置,然后选择 Launch
      Tutorial_WebServer_17
    12. 在下面所示的 Select an existing key pair or create a new key pair 页面上,选择 Create a new key pair,并将 Key pair name 设置为 tutorial-key-pair。选择 Download Key Pair,然后在您的本地计算机上保存密钥对文件。使用此密钥对文件连接到 EC2 实例。
      Tutorial_WebServer_18
    13. 要启动 EC2 实例,请选择 Launch Instances。在下面所示的 Launch Status 页面上,记下新 EC2 实例的标识符,例如:i-7abfcfb8
      Tutorial_WebServer_19
    14. 要查找实例,请选择 View Instances
    15. 一直等到实例的 Instance Status 读取为 running 才能继续。

    使用 PHP 安装 Apache Web 服务器

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

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

    1. 要连接到之前创建的 EC2 实例,请按照连接到您的实例中的步骤进行操作。
    2. 要获取最新错误修复和安全更新,请使用以下命令更新 EC2 实例上的软件:

      注意

      -y 选项安装更新时不提示确认。要在安装前检查更新,请忽略此选项。

      Copy
      [ec2-user ~]$ sudo yum update –y
    3. 更新完成后,使用 yum install 命令安装带有 PHP 软件包的 Apache Web 服务器,该命令将同时安装多个软件包和相关依赖项:
      Copy
      [ec2-user ~]$ sudo yum install -y httpd24 php56 php56-mysqlnd
                      
    4. 使用下面所示的命令启动 Web 服务器:
      Copy
      [ec2-user ~]$ sudo service httpd start
                      

      您可以通过在 Web 浏览器的地址栏中输入 EC2 实例的公有 DNS 名称来测试是否已正确安装和启动 Web 服务器,例如:http://ec2-42-8-168-21.us-west-1.compute.amazonaws.com。如果 Web 服务器正在运行,您将看到 Apache 测试页面。如果您未看到 Apache 测试页面,则验证在教程:创建 Amazon VPC 以用于 Amazon RDS 数据库实例中创建的 VPC 安全组的入站规则是否包含一个规则,即允许用于连接 Web 服务器的 IP 地址进行 HTTP(端口 80)访问。

      注意

      Apache 测试页面仅在文档根目录 /var/www/html 中无内容时才显示。将内容添加到文档根目录后,您的内容将显示在 EC2 实例的公有 DNS 地址中,而不显示在 Apache 测试页面。

    5. 使用 chkconfig 命令配置 Web 服务器以使其在每次系统启动时启动:
      Copy
      [ec2-user ~]$ sudo chkconfig httpd on
                      

    要允许 ec2-user 在 Apache Web 服务器的默认根目录中管理文件,您需要修改 /var/www 目录的所有权和权限。在本教程中,您将名为 www 的组添加到 EC2 实例,然后为该组授予对 /var/www 目录的所有权和添加写入权限。随后,该组的所有成员都能够为 Web 服务器添加、删除和修改文件。

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

    1. 使用以下命令将 www 组添加到 EC2 实例:
      Copy
      [ec2-user ~]$ sudo groupadd www
                      
    2. ec2-user 用户添加到 www 组:
      Copy
      [ec2-user ~]$ sudo usermod -a -G www ec2-user
                      
    3. 要刷新您的权限并包含新 www 组,请注销:
      Copy
      [ec2-user ~]$ exit
                      
    4. 再重新登录并使用 groups 命令验证 www 组是否存在:
      Copy
      [ec2-user ~]$ groups
      ec2-user wheel www
                      
    5. /var/www 目录的组所有权及其内容更改到 www 组:
      Copy
      [ec2-user ~]$ sudo chown -R root:www /var/www
                      
    6. 更改 /var/www 及其子目录的目录权限,以添加组写入权限并设置未来创建的子目录上的组 ID:
      Copy
      [ec2-user ~]$ sudo chmod 2775 /var/www
      [ec2-user ~]$ find /var/www -type d -exec sudo chmod 2775 {} +
                      
    7. 递归地更改 /var/www 目录及其子目录中的文件的权限,以添加组写入权限:
      Copy
      [ec2-user ~]$ find /var/www -type f -exec sudo chmod 0664 {} +
                      

    将您的 Apache Web 服务器连接到 RDS 数据库实例

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

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

    1. 在仍连接到 EC2 实例时,将目录更改到 /var/www 并创建名为 inc 的新子目录:
      Copy
      [ec2-user ~]$ cd /var/www
      [ec2-user ~]$ mkdir inc
      [ec2-user ~]$ cd inc
                      
    2. 在名为 dbinfo.incinc 目录中新建文件,然后通过调用 nano(或您选择的编辑器)编辑文件。
      Copy
      [ec2-user ~]$ >dbinfo.inc
      [ec2-user ~]$ nano dbinfo.inc
                      
    3. 将以下内容添加到 dbinfo.inc 文件,其中 endpoint 是 RDS MySQL 数据库实例的终端结点(无端口),master password 是 RDS MySQL 数据库实例的主密码。

      注意

      将用户名称和密码信息放在不属于 Web 服务器的文档根目录的文件夹中将降低暴露安全性信息的可能性。

      Copy
      <?php
      
      define('DB_SERVER', 'endpoint');
      define('DB_USERNAME', 'tutorial_user');
      define('DB_PASSWORD', 'master password');
      define('DB_DATABASE', 'sample');
      
      ?>
                      
    4. 保存并关闭 dbinfo.inc 文件。
    5. 将目录更改为 /var/www/html
      Copy
      [ec2-user ~]$ cd /var/www/html
                      
    6. 在名为 SamplePage.phphtml 目录中新建文件,然后通过调用 nano(或您选择的编辑器)编辑文件。
      Copy
      [ec2-user ~]$ >SamplePage.php
      [ec2-user ~]$ nano SamplePage.php
                      
    7. 将以下内容添加到 SamplePage.php 文件:

      注意

      将用户名称和密码信息放在不属于 Web 服务器的文档根目录的文件夹中将降低暴露安全性信息的可能性。

      Copy
      <?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) NOT NULL AUTO_INCREMENT,
               `Name` varchar(45) DEFAULT NULL,
               `Address` varchar(90) DEFAULT NULL,
               PRIMARY KEY (`ID`),
               UNIQUE KEY `ID_UNIQUE` (`ID`)
             ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1";
      
           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;
      }
      ?>
                      
    8. 保存并关闭 SamplePage.php 文件。
    9. 通过打开 Web 浏览器并浏览到 http://EC2 instance endpoint/SamplePage.php 来验证 Web 服务器是否已成功连接到 RDS MySQL 数据库实例,例如:http://ec2-55-122-41-31.us-west-2.compute.amazonaws.com/SamplePage.php

    您可以使用 SamplePage.php 将数据添加到 RDS MySQL 数据库实例。您添加的数据之后将显示在该页面上。

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