

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

# 使用 Elastic Beanstalk Ruby 平台
<a name="create_deploy_Ruby.container"></a>

本主题介绍如何在 Elastic Beanstalk 上配置、构建和运行 Ruby 应用程序。

AWS Elastic Beanstalk 支持适用于不同版本的 Ruby 编程语言的许多平台分支。有关完整列表，请参阅 *AWS Elastic Beanstalk 平台*文档中的 [Ruby](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.ruby)。

Ruby Web 应用程序可以在 Puma 应用程序服务器下的 NGINX 代理服务器后面运行。如果使用 RubyGems，则可以在源包[`Gemfile`](ruby-platform-gemfile.md)中包含，以便在部署期间安装软件包。

**应用程序服务器配置**  
Elastic Beanstalk 根据您在创建环境时选择的 Ruby 平台分支安装 Puma 应用程序服务器。有关 Ruby 平台版本提供的组件的更多信息，请参阅 *AWS Elastic Beanstalk 平台*指南中的[支持的平台](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.ruby)。

您可以使用自己提供的 Puma 服务器配置应用程序。这样就可选择使用除 Ruby 平台分支预装版本之外的 Puma 版本。您也可以将应用程序配置为使用其他应用程序服务器，例如 Passenger。为此，您必须在部署中包括并自定义 `Gemfile`。您还需要配置 `Procfile` 以启动应用程序服务器。有关更多信息，请参阅*[使用 Procfile 配置应用程序进程](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/ruby-platform-procfile.html)**。*

**其他配置选项**  
Elastic Beanstalk 提供了[配置选项](command-options.md)，可供您用于自定义在 Elastic Beanstalk 环境中的 Amazon Elastic Compute Cloud（Amazon EC2）实例上运行的软件。您可配置应用程序所需的环境变量，启用日志轮换至 Amazon S3，并将应用程序源中包含静态文件的文件夹映射至代理服务器所提供的路径。该平台还预定义了一些与 Rails 和 Rack 相关的常见环境变量，便于发现和使用。

Elastic Beanstalk 控制台中提供了配置选项，可用于[修改运行环境的配置](environment-configuration-methods-after.md)。要避免在终止环境时丢失环境配置，可以使用[保存的配置](environment-configuration-savedconfig.md)来保存您的设置，并在以后将这些设置应用到其他环境。

要保存源代码中的设置，您可以包含[配置文件](ebextensions.md)。在您每次创建环境或部署应用程序时，会应用配置文件中的设置。您还可在部署期间使用配置文件来安装程序包、运行脚本以及执行其他实例自定义操作。

在 Elastic Beanstalk 控制台中应用的设置会覆盖配置文件中的相同设置（如果存在）。这让您可以在配置文件中包含默认设置，并使用控制台中的特定环境设置加以覆盖。有关优先顺序和其他设置更改方法的更多信息，请参阅[配置选项](command-options.md)。

有关扩展 Elastic Beanstalk 基于 Linux 的平台的各种方法的详细信息，请参阅 [扩展 Elastic Beanstalk Linux 平台](platforms-linux-extend.md)。

## 配置 Ruby 环境
<a name="create-deploy_Ruby.container.CON"></a>

您可以使用 Elastic Beanstalk 控制台启用到 Amazon S3 的日志轮换，并配置应用程序可从环境中读取的变量。

**访问相应环境的软件配置设置**

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

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

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

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

### 日志选项
<a name="create_deploy_Ruby.container.console.logoptions"></a>

**Log options**（日志选项）部分有两个设置：
+ **Instance profile**（实例配置文件）– 指定有权访问与应用程序关联的 Amazon S3 存储桶的实例配置文件。
+ **Enable log file rotation to Amazon S3**（启用到 Amazon S3 的日志轮换）– 指定是否将应用程序的 Amazon EC2 实例的日志文件复制到与应用程序关联的 Amazon S3 存储桶。

### 静态文件
<a name="create_deploy_Ruby.container.console.staticfiles"></a>

为了提高性能，您可以使用 **Static files**（静态文件）部分配置代理服务器，以便从 Web 应用程序内的一组目录提供静态文件（例如 HTML 或图像）。对于每个目录，您都将虚拟路径设置为目录映射。当代理服务器收到对指定路径下的某个文件的请求时，它将直接提供此文件，而不是将请求路由至您的应用程序。

有关使用配置文件或 Elastic Beanstalk 控制台配置静态文件的详细信息，请参阅 [提供静态文件](environment-cfg-staticfiles.md)。

默认情况下，Ruby 环境中的代理服务器配置为提供静态文件，如下所示：
+ `public` 文件夹中的文件通过 `/public` 路径和域根目录（`/` 路径）提供。
+ `public/assets` 子文件夹中的文件通过 `/assets` 路径提供。

以下示例说明默认配置的工作原理：
+ 如果您的应用程序源代码在名为 `public` 的文件夹中包含一个名为 `logo.png` 的文件，则代理服务器将通过 `subdomain.elasticbeanstalk.com/public/logo.png` 和 `subdomain.elasticbeanstalk.com/logo.png` 将其提供给用户。
+ 如果您的应用程序源代码在 `public` 文件夹内名为 `assets` 的文件夹中包含一个名为 `logo.png` 的文件，则代理服务器将通过 `subdomain.elasticbeanstalk.com/assets/logo.png` 将其提供给用户。

您可以配置静态文件的其他映射。有关更多信息，请参阅本主题后面的[Ruby 配置命名空间](#ruby-namespaces)。

**注意**  
对于 *Ruby 2.7 版本 3.3.7 之前的平台 AL2 版本*，默认的 Elastic Beanstalk nginx 代理服务器配置不支持从域根目录 () 提供静态文件。`subdomain.elasticbeanstalk.com/`此平台版本于 2021 年 10 月 21 日发布。有关更多信息，请参阅 *AWS Elastic Beanstalk 发布说明*中的[新平台版本 - Ruby](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2021-10-21-linux.html#release-2021-10-21-linux.platforms.ruby)。

### 环境属性
<a name="create_deploy_Ruby.env.console.ruby.envprops"></a>

在**环境属性**部分，您可以在运行应用程序的 Amazon EC2 实例上指定环境配置设置。环境属性会以密钥值对的形式传递到应用程序。

Ruby 平台为环境配置定义了以下属性：
+  **BUNDLE\$1WITHOUT** – 从 [Gemfile](http://bundler.io/v1.15/man/gemfile.5.html) [安装依赖项](http://bundler.io/bundle_install.html)时所忽略的组的冒号分隔列表。
+ **BUNDLER\$1DEPLOYMENT\$1MODE** – 设置为 `true`（默认值）以使用捆绑程序在[部署模式](https://bundler.io/man/bundle-install.1.html#DEPLOYMENT-MODE)下安装依赖项。设置为 `false` 以在开发模式中运行 `bundle install`。
**注意**  
此环境属性未在 Amazon Linux AMI Ruby 平台分支（在 Amazon Linux 2 之前）上定义。
+  **RAILS\$1SKIP\$1ASSET\$1COMPILATION** – 设置为 `true` 可在部署期间跳过运行 [http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets](http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets)。
+  **RAILS\$1SKIP\$1MIGRATIONS** – 设置为 `true` 可在部署期间跳过运行 [http://guides.rubyonrails.org/active_record_migrations.html#running-migrations](http://guides.rubyonrails.org/active_record_migrations.html#running-migrations)。
+  **RACK\$1ENV** – 指定 Rack 的环境阶段。例如，`development`、`production` 或 `test`。

在运行于 Elastic Beanstalk 中的 Ruby 环境内，可通过使用 `ENV` 对象访问环境变量。例如，您可以使用以下代码将名为 `API_ENDPOINT` 的属性读取到某个变量：

```
endpoint = ENV['API_ENDPOINT']
```

参阅 [环境变量和其他软件设置](environments-cfg-softwaresettings.md) 了解更多信息。

## Ruby 配置命名空间
<a name="ruby-namespaces"></a>

您可以使用[配置文件](ebextensions.md)设置配置选项并在部署期间执行其他实例配置。配置选项可以[特定于平台](command-options-specific.md)，也可以应用于整个 Elastic Beanstalk 服务中的[所有平台](command-options-general.md)。配置选项被组织到*命名空间*中。

您可以使用 `aws:elasticbeanstalk:environment:proxy:staticfiles` 命名空间来配置环境代理以提供静态文件。您可以定义虚拟路径到应用程序目录的映射。

Ruby 平台不定义任何特定于平台的命名空间。相反，它为常见的 Rails 和 Rack 选项定义环境属性。

以下配置文件指定一个静态文件选项，该选项将名为 `staticimages` 的目录映射到路径 `/images`，设置每个平台定义的环境属性，还设置名为 `LOGGING` 的附加环境属性。

**Example .ebextensions/ruby-settings.config**  

```
option_settings:
  aws:elasticbeanstalk:environment:proxy:staticfiles:
    /images: staticimages
  aws:elasticbeanstalk:application:environment:
    BUNDLE_WITHOUT: test
    BUNDLER_DEPLOYMENT_MODE: true
    RACK_ENV: development
    RAILS_SKIP_ASSET_COMPILATION: true
    RAILS_SKIP_MIGRATIONS: true
    LOGGING: debug
```

**注意**  
`BUNDLER_DEPLOYMENT_MODE` 环境属性和 `aws:elasticbeanstalk:environment:proxy:staticfiles` 命名空间未在 Amazon Linux AMI Ruby 平台分支（在 Amazon Linux 2 之前）上定义。

Elastic Beanstalk 提供了许多用于自定义环境的配置选项。除了配置文件之外，您还可使用控制台、保存的配置、EB CLI 或 AWS CLI来配置选项。请参阅[配置选项](command-options.md)了解更多信息。

# 在 Elastic Beanstalk 上使用 Gemfile 安装程序包
<a name="ruby-platform-gemfile"></a>

要使用 RubyGems 来安装应用程序所需的软件包，请在项目源代码的根目录中加入一个`Gemfile`文件。

**Example Gemfile**  

```
source "https://rubygems.org"
gem 'sinatra'
gem 'json'
gem 'rack-parser'
```

如果 `Gemfile` 文件存在，Elastic Beanstalk 将运行 `bundle install` 以安装依赖项。有关更多信息，请参阅 Bundler.io 网站上的 [Gemfiles](https://bundler.io/man/gemfile.5.html) 和 [Bundle](https://bundler.io/man/bundle.1.html)（捆绑包）页面。

**注意**  
除了 Ruby 平台预装的默认版本外，还可以使用其他版本的 Puma。为此，请在 `Gemfile` 中包含指定版本的条目。您还可以使用自定义的 `Gemfile` 来指定不同的应用程序服务器，例如 Passenger。  
对于这两种情况，您都需要配置 `Procfile` 以启动应用程序服务器。  
有关更多信息，请参阅*[使用 Procfile 配置应用程序进程](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/ruby-platform-procfile.html)**。*

# 在 Elastic Beanstalk 上使用 Procfile 配置应用程序进程。
<a name="ruby-platform-procfile"></a>

要指定启动 Ruby 应用程序的命令，请在源代码包的根目录中包含一个名为 `Procfile` 的文件。

**注意**  
Elastic Beanstalk 在 Amazon Linux AMI Ruby 平台分支（在 Amazon Linux 2 之前）上不支持此功能。无论 Ruby 版本为何，名称包含 *with Puma* 或 *with Passenger* 的平台分支都早于 Amazon Linux 2，并且不支持 `Procfile` 属性。

有关编写和使用 `Procfile` 的详细信息，请参阅 [Buildfile 和 Procfile](platforms-linux-extend.build-proc.md)。

如果您未提供 `Procfile`，Elastic Beanstalk 会生成默认的 `Procfile`。如果 `Gemfile` 包含 Puma，Elastic Beanstalk 会假定您想使用您提供的 Puma 版本，并生成以下默认的 `Procfile`。

```
web: bundle exec puma -C /opt/elasticbeanstalk/config/private/pumaconf.rb
```

如果 `Gemfile` 不包含 Puma，则 Elastic Beanstalk 会假定您使用的是预安装的 Puma 应用程序服务器并生成以下默认的 `Procfile`。在 Amazon Linux 2 Ruby 平台分支上，如果您未提供 `Procfile`，Elastic Beanstalk 会始终生成以下默认的 `Procfile`。

```
web: puma -C /opt/elasticbeanstalk/config/private/pumaconf.rb
```

**注意**  
[2024 年 10 月 10 日](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2024-10-10-al2-10-2024-retire.html)，最后一个 Ruby Amazon Linux 2 平台分支停用。目前[受支持的所有 Ruby 平台分支](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.ruby)均基于 Amazon Linux 2023。有关迁移的更多信息，请参阅[从 Amazon Linux 2 迁移到 Amazon Linux 2023](using-features.migration-al.generic.from-al2.md)。

如果要使用 Passenger 应用程序服务器，请使用以下示例文件配置 Ruby 环境，以安装和使用 Passenger。

1. 使用此示例文件安装 Passenger。  
**Example Gemfile**  

   ```
   source 'https://rubygems.org'
   gem 'passenger'
   ```

1. 使用此示例文件指示 Elastic Beanstalk 启动 Passenger。  
**Example Procfile**  

   ```
   web: bundle exec passenger start /var/app/current --socket /var/run/puma/my_app.sock
   ```

**注意**  
您无需在 nginx 代理服务器的配置中更改任何内容即可使用 Passenger。要使用其他应用程序服务器，您可能需要自定义 nginx 配置以将请求正确转发到您的应用程序。