

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

# 将 Laravel 应用程序部署到 Elastic Beanstalk
<a name="php-laravel-tutorial"></a>

Laravel 是一个适用于 PHP 的开源 model-view-controller（MVC）框架。本教程将引导您完成生成 Laravel 应用程序、将其部署到 AWS Elastic Beanstalk 环境以及将其配置为连接到亚马逊关系数据库服务 (Amazon RDS) 数据库实例的过程。

**Topics**
+ [先决条件](#php-laravel-tutorial-prereqs)
+ [启动 Elastic Beanstalk 环境](#php-laravel-tutorial-launch)
+ [安装 Laravel 并生成网站](#php-laravel-tutorial-generate)
+ [部署您的应用程序](#php-laravel-tutorial-deploy)
+ [配置 Composer 设置](#php-laravel-tutorial-configure)
+ [将数据库添加到环境](#php-laravel-tutorial-database)
+ [清理](#php-laravel-tutorial-cleanup)
+ [后续步骤](#php-laravel-tutorial-nextsteps)

## 先决条件
<a name="php-laravel-tutorial-prereqs"></a>

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

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

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

在 Linux 和 macOS 中，您可使用您首选的 Shell 和程序包管理器。在 Windows 上，您可以[安装适用于 Linux 的 Windows 子系统](https://docs.microsoft.com/en-us/windows/wsl/install-win10)，以获取与 Windows 集成的 Ubuntu 和 Bash 版本。

Laravel 6 需要 PHP 7.2 或更高版本。它还需要 Laravel 官方文档中的[服务器要求](https://laravel.com/docs/6.x/installation#server-requirements)主题中列出的 PHP 扩展。按照说明安装 PHP 和 Composer。

如需 Laravel 支持和维护信息，请参阅 Laravel 官方文档中的[支持策略](https://laravel.com/docs/master/releases#support-policy)主题。

## 启动 Elastic Beanstalk 环境
<a name="php-laravel-tutorial-launch"></a>

使用 Elastic Beanstalk 控制台创建 Elastic Beanstalk 环境。选择 **PHP** 平台并接受默认设置和示例代码。

**启动环境（控制台）**

1. [使用以下预配置链接打开 Elastic Beanstalk 控制台：console.aws.amazon。 com/elasticbeanstalk/home\#/newApplication？ 应用程序名称=教程&环境类型= LoadBalanced](https://console.aws.amazon.com/elasticbeanstalk/home#/newApplication?applicationName=tutorials&environmentType=LoadBalanced)

1. 对于 **Platform**（平台），选择与应用程序使用的语言匹配的平台和平台分支。

1. 对于**应用程序代码**，选择**示例应用程序**。

1. 选择**复查并启动**。

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

环境创建大约需要 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 组会扩展或收缩以进行响应。
+ **CloudFormation 堆栈** — Elastic CloudFormation Beanstalk 用于在您的环境中启动资源并传播配置更改。这些资源在您可通过 [CloudFormation 控制台](https://console.aws.amazon.com/cloudformation)查看的模板中定义。
+ **域名**-以表单形式路由到您的 Web 应用程序的域名*{{subdomain}}。 {{region}}.elasticbeanstalk.com。*
**域安全**  
为增强 Elastic Beanstalk 应用程序的安全性，已将 *elasticbeanstalk.com* 域注册到 [公共后缀列表（PSL）](https://publicsuffix.org/)。  
如果您需要在 Elastic Beanstalk 应用程序的默认域名中设置敏感 Cookie，我们建议您使用带有前缀 `__Host-` 的 Cookie 来提高安全性。这种做法可以保护您的域免遭跨站点请求伪造（CSRF）攻击。要了解更多信息，请参阅 Mozilla 开发者网络中的 [Set-Cookie](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#cookie_prefixes) 页面。

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

**注意**  
Elastic Beanstalk 创建的 Amazon S3 存储桶将在多个环境之间共享并且在环境终止期间不会被删除。有关更多信息，请参阅 [将 Elastic Beanstalk 和 Amazon S3 结合使用](AWSHowTo.S3.md)。

## 安装 Laravel 并生成网站
<a name="php-laravel-tutorial-generate"></a>

Composer 可使用一个命令安装 Laravel 并创建工作项目：

```
~$ composer create-project --prefer-dist laravel/laravel eb-laravel
```

Composer 安装 Laravel 及其依赖项，并生成默认项目。

[如果你在安装 Laravel 时遇到任何问题，请转到官方文档中的安装主题：https://laravel.com/docs/6.x。](https://laravel.com/docs/6.x)

## 部署您的应用程序
<a name="php-laravel-tutorial-deploy"></a>

创建包含由 Composer 创建的文件的[源包](applications-sourcebundle.md)。以下命令将创建名为 `laravel-default.zip` 的源包。它将排除 `vendor` 文件夹中的文件，因为这些文件会占用大量空间并且对于将您的应用程序部署到 Elastic Beanstalk 不是必需的。

```
~/eb-laravel$ zip ../laravel-default.zip -r * .[^.]* -x "vendor/*"
```

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

**部署源包**

1. 打开 [Elastic Beanstalk](https://console.aws.amazon.com/elasticbeanstalk) 控制台，然后**在 “区域” 列表中，选择您**的。 AWS 区域

1. 在导航窗格中，选择 **Environments**（环境），然后从列表中选择环境的名称。

1. 在环境概述页面上，选择 **Upload and deploy**（上传和部署）。

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

1. 选择 **Deploy**（部署）。

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

**注意**  
为了进一步优化源包，请初始化一个 Git 存储库并使用 [`git archive` 命令](applications-sourcebundle.md#using-features.deployment.source.git)创建源包。默认 Laravel 项目包含一个 `.gitignore` 文件，该文件指示 Git 排除 `vendor` 文件夹以及部署时不需要的其他文件。

## 配置 Composer 设置
<a name="php-laravel-tutorial-configure"></a>

部署完成后，单击 URL 以在浏览器中打开 Laravel 应用程序：

![403 Forbidden 错误页面，表示用户无权访问所请求的资源。](http://docs.aws.amazon.com/zh_cn/elasticbeanstalk/latest/dg/images/php-laravel-403.png)


这是什么? 默认情况下，Elastic Beanstalk 提供项目在网站根路径下的根目录。但在这种情况下，默认页面 (`index.php`) 位于 `public` 文件夹的下一级。您可通过将 `/public` 添加至 URL 加以验证。例如 `http://{{laravel}}.{{us-east-2}}.elasticbeanstalk.com/public`。

要在根路径中提供 Laravel 应用程序，请使用 Elastic Beanstalk 控制台为网站配置*文档根目录*。

**配置网站的文档根目录**

1. 打开 [Elastic Beanstalk](https://console.aws.amazon.com/elasticbeanstalk) 控制台，然后**在 “区域” 列表中，选择您**的。 AWS 区域

1. 在导航窗格中，选择 **Environments**（环境），然后从列表中选择环境的名称。

1. 在导航窗格中，选择 **Configuration**（配置）。

1. 在 **Updates, monitoring, and logging**（更新、监控和日志记录）配置类别中，选择 **Edit**（编辑）。

1. 对于 **Document root**（文档根目录），输入 **/public**。

1. 要保存更改，请选择页面底部的 **Apply**（应用）。

1. 更新完成后，单击 URL 以在浏览器中重新打开站点。

![带有导航菜单项的 Laravel 徽标：文档、Laracasts、News、Forge 等。 GitHub](http://docs.aws.amazon.com/zh_cn/elasticbeanstalk/latest/dg/images/php-laravel-defaultnodb.png)


到目前为止，一切正常。接下来，您将在环境中添加一个数据库，并将 Laravel 配置为连接到该数据库。

## 将数据库添加到环境
<a name="php-laravel-tutorial-database"></a>

在 Elastic Beanstalk 环境中启动 RDS 数据库实例。你可以在 Elastic Beanstalk 上 SQLServer将 MySQL 或 PostgreSQL 数据库与 Laravel 一起使用。在本示例中，我们将使用 MySQL。

**将 RDS 数据库实例添加到 Elastic Beanstalk 环境**

1. 打开 [Elastic Beanstalk](https://console.aws.amazon.com/elasticbeanstalk) 控制台，然后**在 “区域” 列表中，选择您**的。 AWS 区域

1. 在导航窗格中，选择 **Environments**（环境），然后从列表中选择环境的名称。

1. 在导航窗格中，选择 **Configuration (配置)**。

1. 在 **Database**（数据库）配置类别中，选择 **Edit**（编辑）。

1. 对于**引擎**，选择 **mysql**。

1. 键入主 **username**（用户名）和 **password**（密码）。Elastic Beanstalk 将使用环境属性为应用程序提供这些值。

1. 要保存更改，请选择页面底部的 **Apply**（应用）。

创建数据库实例需要大约 10 分钟。有关数据库与 Elastic Beanstalk 环境耦合的更多信息，请参阅[将数据库添加到 Elastic Beanstalk 环境](using-features.managing.db.md)。

同时，您可更新源代码，以便从环境中读取连接信息。Elastic Beanstalk 使用 `RDS_HOSTNAME` 等环境变量提供连接详细信息，以便您可以从应用程序中访问。

Laravel 的数据库配置存储在项目代码中 `database.php` 文件夹下名为 `config` 的文件内。查找 `mysql` 条目并修改 `host`、`database`、`username` 和 `and password` 变量，以便从 Elastic Beanstalk 中读取对应的值：

**Example \~/Eb-.php laravel/config/database**  

```
...
    'connections' => [

        'sqlite' => [
            'driver' => 'sqlite',
            'database' => env('DB_DATABASE', database_path('database.sqlite')),
            'prefix' => '',
        ],

        'mysql' => [
            'driver' => 'mysql',
            'host' => env('RDS_HOSTNAME', '127.0.0.1'),
            'port' => env('RDS_PORT', '3306'),
            'database' => env('RDS_DB_NAME', 'forge'),
            'username' => env('RDS_USERNAME', 'forge'),
            'password' => env('RDS_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
...
```

要验证数据库连接是否已正确配置，请向 `index.php` 添加代码以连接到数据库，并向默认响应添加一些代码：

**Example \~/Eb-.php laravel/public/index**  

```
...
if(DB::connection()->getDatabaseName())
{
   echo "Connected to database ".DB::connection()->getDatabaseName();
}
$response->send();
...
```

在数据库实例完成启动后，将已更新的应用程序打包并将其部署到环境。

**更新 Elastic Beanstalk 环境**

1. 创建源包：

   ```
   ~/eb-laravel$ zip ../laravel-v2-rds.zip -r * .[^.]* -x "vendor/*"
   ```

1. 打开 [Elastic Beanstalk](https://console.aws.amazon.com/elasticbeanstalk) 控制台，然后**在 “区域” 列表中，选择您**的。 AWS 区域

1. 在导航窗格中，选择 **Environments**（环境），然后从列表中选择环境的名称。

1. 选择 **Upload and Deploy**。

1. 选择 **Browse**（浏览），然后上传 `laravel-v2-rds.zip`。

1. 选择**部署**。

部署应用程序的新版本花费不到 1 分钟的时间。完成部署后，再次刷新网页，以验证数据库连接成功：

![Laravel 应用程序主页显示了与 ebdb 的成功数据库连接。](http://docs.aws.amazon.com/zh_cn/elasticbeanstalk/latest/dg/images/php-laravel-defaultwdb.png)


## 清理
<a name="php-laravel-tutorial-cleanup"></a>

演示代码使用完毕后，您可以终止环境。[Elastic Beanstalk 会删除 AWS 所有相关资源，例如 [Amazon EC2](using-features.managing.ec2.md)[实例、数据库实例、](using-features.managing.db.md)负载均衡器[、安全组](using-features.managing.elb.md)和警报。](using-features.alarms.md#using-features.alarms.title)

移除资源不会删除 Elastic Beanstalk 应用程序，因此您可以随时为您的应用程序创建新环境。

**从控制台终止 Elastic Beanstalk 环境**

1. 打开 [Elastic Beanstalk](https://console.aws.amazon.com/elasticbeanstalk) 控制台，然后**在 “区域” 列表中，选择您**的。 AWS 区域

1. 在导航窗格中，选择 **Environments**（环境），然后从列表中选择环境的名称。

1. 选择 **Actions**（操作），然后选择 **Terminate environment**（终止环境）。

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

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

**终止您的 RDS 数据库实例**

1. 打开 [Amazon RDS 控制台](https://console.aws.amazon.com/rds)。

1. 选择 **Databases**（数据库）。

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

1. 选择**操作**，然后选择**删除**。

1. 选择是否创建快照，然后选择**删除**。

## 后续步骤
<a name="php-laravel-tutorial-nextsteps"></a>

有关 Laravel 的更多信息，请访问 Laravel 官方网站 [laravel.com](https://laravel.com/)。

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

在本教程中，您使用了 Elastic Beanstalk 控制台来配置 Composer 选项。要使此配置成为应用程序源的一部分，您可以使用类似于下面的配置文件。

**Example .ebextensions/composer.config**  

```
option_settings:
  aws:elasticbeanstalk:container:php:phpini:
    document_root: /public
```

有关更多信息，请参阅 [使用配置文件 (`.ebextensions`) 进行高级环境自定义](ebextensions.md)。

在 Elastic Beanstalk 环境中运行 Amazon RDS 数据库实例不仅适合开发和测试，还将数据库的生命周期与环境相关联。请参阅[将 Amazon RDS DB 实例添加到 PHP Elastic Beanstalk 环境](create_deploy_PHP.rds.md)，浏览有关连接到在环境外运行的数据库的说明。

最后，如果计划在生产环境中使用应用程序，您会希望为环境[配置自定义域名](customdomains.md)，并为安全连接[启用 HTTPS](configuring-https.md)。