

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

# 使用 Elastic Beanstalk Node.js 平台
<a name="create_deploy_nodejs.container"></a>

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

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

Elastic Beanstalk 提供了[配置选项](command-options.md)，可供您用于自定义在 Elastic Beanstalk 环境中的 EC2 实例上运行的软件。您可[配置应用程序所需的环境变量](environments-cfg-softwaresettings.md#environments-cfg-softwaresettings-console)，启用到 Amazon S3 的日志轮换，并将应用程序源中包含静态文件的文件夹映射至代理服务器所提供的路径。

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

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

您可以在源包中[包含一个 `Package.json` 文件](nodejs-platform-dependencies.md#nodejs-platform-packagejson)，以便在部署期间安装软件包、提供 start 命令以及指定您希望应用程序使用的 Node.js 版本。您可以包含一个 [`npm-shrinkwrap.json` 文件](nodejs-platform-shrinkwrap.md)来锁定依赖项版本。

Node.js 平台包含一个代理服务器，以服务静态资产、将流量转发到应用程序和压缩响应。您可以[扩展或覆盖默认代理配置](nodejs-platform-proxy.md)，以适应高级方案。

可提供多个选项供您启动应用程序。您可以将 [Procfile](nodejs-configuration-procfile.md) 添加到源包来指定用于启动应用程序的命令。如果您不提供 `Procfile`，但提供 `package.json` 文件，则 Elastic Beanstalk 将运行 `npm start`。如果您未提供上述任一项，则 Elastic Beanstalk 会按此顺序查找 `app.js` 或 `server.js` 文件并运行该脚本。

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

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

## 配置您的 Node.js 环境
<a name="nodejs-platform-console"></a>

您可以使用 Node.js 平台设置来微调 Amazon EC2 实例的行为。您可以使用 Elastic Beanstalk 控制台编辑 Elastic Beanstalk 环境的 Amazon EC2 实例配置。

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

**在 Elastic Beanstalk 控制台中配置 Node.js 环境**

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

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

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

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

### 容器选项
<a name="nodejs-platform-console-settings"></a>

您可以指定以下特定于平台的选项：
+ **Proxy server**（代理服务器）– 要在环境实例上使用的代理服务器。默认使用 NGINX。

### 日志选项
<a name="nodejs-platform-console-logging"></a>

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

### 静态文件
<a name="nodejs-platform-console-staticfiles"></a>

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

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

### 环境属性
<a name="nodejs-platform-console-envprops"></a>

使用 **Environment Properties**（环境属性）部分，在运行应用程序的 Amazon EC2 实例上指定环境配置设置。这些设置会以密钥值对的方式传递到应用程序。

在运行的Node.js环境中 AWS Elastic Beanstalk，您可以通过运行来访问环境变量`process.env.ENV_VARIABLE`。

```
var endpoint = process.env.API_ENDPOINT
```

Node.js 平台会将 PORT 环境变量设置为代理服务器将流量传输到的端口。有关更多信息，请参阅 [配置代理服务器](nodejs-platform-proxy.md)。

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

### 配置 Amazon Linux AMI（在 Amazon Linux 2 之前）Node.js 环境
<a name="nodejs-platform-console.alami"></a>

仅在使用 Amazon Linux AMI 平台版本（在 Amazon Linux 2 之前）的 Elastic Beanstalk Node.js 环境中支持以下控制台软件配置类别。

**注意**  
本主题中的信息仅适用于基于亚马逊 Linux AMI (AL1) 的平台分支。 AL2023/AL2 平台分支与之前的 Amazon Linux AMI (AL1) 平台版本不兼容，*需要不同的配置设置*。
 [2022 年 7 月 18 日，](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2022-07-18-linux-al1-retire.html)**Elastic Beanstalk 将所有基于亚马逊 Linux AMI AL1 () 的平台分支的状态设置为停用。**有关迁移到当前且完全受支持的 Amazon Linux 2023 平台分支的更多信息，请参阅 [将 Elastic Beanstalk Linux 应用程序迁移到 Amazon Linux 2023 或 Amazon Linux 2](using-features.migration-al.md)。

#### 容器选项 — 亚马逊 Linux AMI (AL1)
<a name="nodejs-platform-console-settings"></a>

在配置页面上，指定以下内容：
+ **Proxy server**（代理服务器）– 指定要用来代理与 Node.js 连接的 Web 服务器。默认使用 NGINX。如果选择 **none**，则静态文件映射不会生效，并且 GZIP 压缩会被禁用。
+ **Node.js 版本** – 指定 Node.js 的版本。有关受支持的 Node.js 版本的列表，请参阅《AWS Elastic Beanstalk 平台》**指南中的 [https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs)。
+ **GZIP compression**（Gzip 压缩）– 指定是否启用 GZIP 压缩。默认情况下已启用 GZIP 压缩。
+ **Node command**（节点命令）– 供您输入用于启动 Node.js 应用程序的命令。空字符串（默认值）表示 Elastic Beanstalk 将依次使用 `app.js`、`server.js` 和 `npm start`。

## Node.js 配置命名空间
<a name="nodejs-namespaces"></a>

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

您可以使用 `aws:elasticbeanstalk:environment:proxy` 命名空间选择要在环境的实例上使用的代理。以下示例将您的环境配置为使用 Apache HTTPD 代理服务器。

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

```
option_settings:
  aws:elasticbeanstalk:environment:proxy:
    ProxyServer: apache
```

您可以使用 `aws:elasticbeanstalk:environment:proxy:staticfiles` 命名空间将代理配置为提供静态文件。有关更多信息以及示例，请参阅 [提供静态文件](environment-cfg-staticfiles.md)。

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

## Amazon Linux AMI（在 Amazon Linux 2 之前）Node.js 平台
<a name="nodejs.alami"></a>

如果您的 Elastic Beanstalk Node.js 环境使用 Amazon Linux AMI 平台版本（在 Amazon Linux 2 之前），请考虑本节中的特定配置和建议。

**注意**  
本主题中的信息仅适用于基于亚马逊 Linux AMI (AL1) 的平台分支。 AL2023/AL2 平台分支与之前的 Amazon Linux AMI (AL1) 平台版本不兼容，*需要不同的配置设置*。
 [2022 年 7 月 18 日，](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2022-07-18-linux-al1-retire.html)**Elastic Beanstalk 将所有基于亚马逊 Linux AMI AL1 () 的平台分支的状态设置为停用。**有关迁移到当前且完全受支持的 Amazon Linux 2023 平台分支的更多信息，请参阅 [将 Elastic Beanstalk Linux 应用程序迁移到 Amazon Linux 2023 或 Amazon Linux 2](using-features.migration-al.md)。

### Node.js特定于平台的配置选项 — 亚马逊 Linux AMI () AL1
<a name="nodejs.alami.options"></a>

Elastic Beanstalk 支持用于 Amazon Linux AMI Node.js 平台版本的一些特定于平台的配置选项。可以选择先于应用程序运行的代理服务器，选择要运行的特定版本的 Node.js，并选择用于运行应用程序的命令。

对于代理服务器，您可以使用 NGINX 或 Apache 代理服务器。您可以将 `none` 值设置为 `ProxyServer` 选项。在这种设置下，Elastic Beanstalk 将您的应用程序作为独立项运行，而不是在任何代理服务器后面运行。如果您的环境运行独立应用程序，请更新您的代码以侦听 NGINX 将流量转发到的端口。

```
var port = process.env.PORT || 8080;

app.listen(port, function() {
  console.log('Server running at http://127.0.0.1:%s', port);
});
```

### Node.js语言版本 — 亚马逊 Linux AMI (AL1)
<a name="nodejs.alami.versions"></a>

在支持的语言版本方面，Node.js Amazon Linux AMI 平台与其他 Elastic Beanstalk 托管平台略有不同。这是因为每个 Node.js 平台版本均仅支持几个 Node.js 语言版本。有关受支持的 Node.js 版本的列表，请参阅《AWS Elastic Beanstalk 平台》**指南中的 [https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs)。

您可以使用特定于平台的配置选项来设置语言版本。有关说明，请参阅[配置您的 Node.js 环境](#nodejs-platform-console)。或者，使用 Elastic Beanstalk 控制台在更新平台版本的过程中，更新您的环境使用的 Node.js 版本。

**注意**  
如果对您正在使用的 Node.js 版本的支持已从平台中移除，则您必须先更改或移除版本设置再进行[平台更新](using-features.platform.upgrade.md)。当在一个或多个 Node.js 版本中识别到安全漏洞时，可能会发生这种情况。  
发生这种情况时，尝试更新到不支持配置的平台的新版本会[NodeVersion](command-options-specific.md#command-options-nodejs)失败。为避免需要创建新环境，请将*NodeVersion*配置选项更改为旧平台版本和新平台版本都支持的 Node.js 版本，或者[删除该选项设置](environment-configuration-methods-after.md)，然后执行平台更新。

**在 Elastic Beanstalk 控制台中配置环境的 Node.js 版本**

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

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

1. 在环境概述页面上的 **Platform**（平台）下，选择 **Change**（更改）。

1. 在 **Update platform version**（更新平台版本）对话框中，选择 Node.js 版本。  
![\[Elastic Beanstalk 更新平台版本确认\]](http://docs.aws.amazon.com/zh_cn/elasticbeanstalk/latest/dg/images/platform-nodejs-update-node-version.png)

1. 选择**保存**。

### Node.js配置命名空间 — 亚马逊 Linux AMI () AL1
<a name="nodejs.alami.namespaces"></a>

Node.js Amazon Linux AMI 平台在 `aws:elasticbeanstalk:container:nodejs:staticfiles` 和 `aws:elasticbeanstalk:container:nodejs` 命名空间中定义附加选项。

以下配置文件将指示 Elastic Beanstalk 使用 `npm start` 运行应用程序。它也将代理类型设置为 Apache 并启用压缩。最后，它将代理配置为从两个源目录提供静态文件。一个源是来自 `statichtml` 源目录的网站根目录下的 `html` 路径的 HTML  文件。另一个源是来自 `staticimages` 源目录的网站根目录下的 `images` 路径的 HTML 文件。

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

```
option_settings:
  aws:elasticbeanstalk:container:nodejs: 
    NodeCommand: "npm start"
    ProxyServer: apache
    GzipCompression: true
  aws:elasticbeanstalk:container:nodejs:staticfiles:
    /html: statichtml
    /images: staticimages
```

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

# 在 Elastic Beanstalk 上使用 Procfile 配置自定义启动命令
<a name="nodejs-configuration-procfile"></a>

您可以在源包的根目录中包含一个名为 `Procfile` 的文件，来指定启动应用程序的命令。

**Example Procfile**  

```
web: node index.js
```

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

**注意**  
此功能将替换 `aws:elasticbeanstalk:container:nodejs` 命名空间中的旧 `NodeCommand` 选项。

# 配置您的应用程序对 Elastic Beanstalk 的依赖项
<a name="nodejs-platform-dependencies"></a>

您的应用程序可能有某些 Node.js 模块的依赖项，例如您在 `require()` 语句中指定的项。这些模块存储在 `node_modules` 目录中。当您的应用程序运行时，Node.js 将从此目录加载模块。有关更多信息，请参阅 Node.js 文档中的[从 node\$1modules 文件夹加载](https://nodejs.org/api/modules.html#modules_loading_from_node_modules_folders)。

您可以使用 `package.json` 文件指定这些模块依赖项。如果 Elastic Beanstalk 检测到此文件，但 `node_modules` 目录不存在，则 Elastic Beanstalk 将以 *webapp* 用户身份运行 `npm install`。`npm install` 命令将依赖项安装在 Elastic Beanstalk 事先创建的 `node_modules` 目录中。`npm install` 命令会从公共 npm 注册表或其他位置访问 `package.json` 文件中列出的软件包。有关更多信息，请参阅 [npm Docs](https://docs.npmjs.com/about-the-public-npm-registry) 网站。

如果 Elastic Beanstalk 检测到 `node_modules` 目录，则即使存在 `package.json` 文件，Elastic Beanstalk 也不会运行 `npm install`。Elastic Beanstalk 假设依赖项包在 `node_modules` 目录中可供 Node.js 访问和加载。

以下各部分提供有关为应用程序建立 Node.js 模块依赖项的更多信息。

**注意**  
如果您在 Elastic Beanstalk 运行 `npm install` 时遇到任何部署问题，请考虑其他方法。在您的应用程序源包中包括含依赖模块的 `node_modules` 目录。这样做可以避免在调查问题时从公共 npm 注册表安装依赖项时出现问题。由于依赖模块来自本地目录，这样做也可能有助于缩短部署时间。有关更多信息，请参阅 [在 node\$1modules 目录中包括 Node.js 依赖项](#nodejs-platform-nodemodules)。

## 使用 package.json 文件指定 Node.js 依赖项
<a name="nodejs-platform-packagejson"></a>

包含项目源的根目录中的 `package.json` 文件来指定依赖项包并提供启动命令。当 `package.json` 文件存在，且项目源的根目录中不存在 `node_modules` 目录时，Elastic Beanstalk 会以 *webapp* 用户的身份运行 `npm install` 来从公共 npm 注册表安装依赖项。Elastic Beanstalk 还使用 `start` 命令来启动您的应用程序。有关 `package.json` 文件的更多信息，请参阅 *npm Docs* 网站中的[在 `package.json` 文件中指定依赖项](https://docs.npmjs.com/specifying-dependencies-and-devdependencies-in-a-package-json-file)。

使用 `scripts` 关键字来提供启动命令。当前使用 `scripts` 关键字，而不是 `aws:elasticbeanstalk:container:nodejs` 命名空间中的原有 `NodeCommand` 选项。

**Example package.json - Express**  

```
{
    "name": "my-app",
    "version": "0.0.1",
    "private": true,
    "dependencies": {
      "ejs": "latest",
      "aws-sdk": "latest",
      "express": "latest",
      "body-parser": "latest"
    },
    "scripts": {
      "start": "node app.js"
    }
  }
```

**生产模式和开发依赖项**  
要在 `package.json` 文件中指定依赖项，请使用 *dependencies* 和 *devDependencies* 属性。*dependencies* 属性指定您的应用程序在生产中所需的软件包。*devDependencies* 属性指定仅本地开发和测试需要的软件包。

如果您需要安装 *devDependencies* 软件包，则请将 NPM\$1USE\$1PRODUCTION 环境属性设置为 `false`。使用此设置，在运行 npm install 时将不使用上述选项。这将导致 *devDependencies* 软件包被安装。

## 在 node\$1modules 目录中包括 Node.js 依赖项
<a name="nodejs-platform-nodemodules"></a>

要将依赖项程序包与应用程序代码一起部署到环境实例，请将它们包括在项目源根目录下名为 `node_modules` 的目录中。有关更多信息，请参阅 *npm Docs* 网站中的[在本地下载和安装软件包](https://docs.npmjs.com/downloading-and-installing-packages-locally)。

[当您将`node_modules`目录部署到 AL2023/AL2 Node.js平台版本时，Elastic Beanstalk 会假设您提供了自己的依赖包，并避免安装在 package.json 文件中指定的依赖项。](#nodejs-platform-packagejson) Node.js在`node_modules`目录中查找依赖关系。有关详细信息，请参阅 Node.js 文档中的[从 node\$1modules 文件夹加载](https://nodejs.org/api/modules.html#modules_loading_from_node_modules_folders)。

**注意**  
如果您在 Elastic Beanstalk 运行 `npm install` 时遇到任何部署问题，请在调查问题时考虑使用本主题中描述的方法作为解决方法。  
 

### 亚马逊 Linux 上的 Node.js 注意事项 2
<a name="nodejs-al2-considerations"></a>

如果你使用的是在 *Amazon Linux 2* 上运行*的 Node.js* 平台分支，请阅读本节。

#### 亚马逊 Linux 上的 Node.js 注意事项 2
<a name="nodejs-al2-considerations-detail"></a>

**注意**  
本主题中的信息适用于在 Amazon Linux 2 上运行的Node.js平台分支。此处的内容描述了与之不同的 AL2特定功能和行为。 AL2023

**命令变体**  
命令选项因应用程序运行的 Amazon Linux 2 平台分支中包含的 npm 版本而异。
+ npm v6 – 默认情况下，Elastic Beanstalk 在生产模式下安装依赖项。它使用命令 `npm install --production`。
+ npm v7 或更高版本 – Elastic Beanstalk 省略了 *devDependencies*。它使用命令 `npm install --omit=dev`。

上面列出的两个命令都没有安装属于 *devDependencies* 的软件包。

**Git 依赖关系的 SSH 和 HTTPS 协议**  
从 2023 年 3 月 7 日的 Amazon Linux 2 平台版本开始，你可以使用 SSH 和 HTTPS 协议从 Git 存储库中检索软件包。平台分支 Node.js 16 同时支持 SSH 和 HTTPS 协议。Node.js 14 仅支持 HTTPS 协议。

**Example package.json – Node.js 16 同时支持 HTTPS 和 SSH**  

```
    ...
    "dependencies": {
      "aws-sdk": "https://github.com/aws/aws-sdk-js.git",
      "aws-chime": "git+ssh://git@github.com:aws/amazon-chime-sdk-js.git"
    }
```

**版本和版本范围**  
使用 `package.json` 文件中的 `engines` 关键字指定您希望应用程序使用的 Node.js 版本。您还可以使用 npm 表示法指定版本范围。有关版本范围的语法的更多信息，请参阅 Node.js 网站上的[使用 npm 的语义版本控制](https://nodejs.dev/learn/semantic-versioning-using-npm)。Node.js `package.json` 文件中的 `engines` 关键字取代 `aws:elasticbeanstalk:container:nodejs` 命名空间中的原有 `NodeVersion` 选项。

**重要**  
指定版本范围的功能不适用于在其上运行的 Node.js 平台分支 AL2023。我们只支持特定 Node.js 分支中的一个 Node.js 版本 AL2023。如果您的 `package.json` 文件指定了版本范围，我们将忽略它并默认设为 Node.js 的平台分支版本。

**Example `package.json` – 单一 Node.js 版本**  

```
{
    ...
    "engines": { "node" : "14.16.0" }
  }
```

**Example `package.json` – Node.js 版本范围**  

```
{
    ...
    "engines": { "node" : ">=10 <11" }
  }
```

当指示版本范围时，Elastic Beanstalk 会安装该平台在该范围内可用的最新 Node.js 版本。在此示例中，范围指示版本必须大于或等于版本 10，但小于版本 11。因此，Elastic Beanstalk 安装了最新的 Node.js 版本 10.x.y，该版本在[支持的平台](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs)上可用。

请注意，您只能指定与平台分支对应的 Node.js 版本。例如，如果您使用的是 Node.js 16 平台分支，则只能指定 16.x.y Node.js 版本。您可以使用 npm 支持的版本范围选项来提高灵活度。有关每个平台分支的有效 Node.js 版本，请参阅《AWS Elastic Beanstalk 平台》**指南中的 [https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs)。

**注意**  
如果对您正在使用的 Node.js 版本的支持已从平台中移除，则您必须先更改或移除 Node.js 版本设置再进行[平台更新](using-features.platform.upgrade.md)。当在一个或多个 Node.js 版本中识别到安全漏洞时，可能会发生这种情况。  
发生此情况时，尝试更新到不支持所配置的 Node.js 版本的新平台版本会失败。为避免需要创建新环境，请将 `package.json` 中的 Node.js 版本设置更改为旧平台版本和新平台版本都支持的 Node.js 版本。您可以选择指定包含受支持版本的 Node.js 版本范围，如本主题前面所述。您还可以选择删除设置，然后部署新的源包。

# 在 Elastic Beanstalk 上使用 npm shrinkwrap 锁定依赖项
<a name="nodejs-platform-shrinkwrap"></a>

Node.js 平台将在您每次部署时以 *webapp* 用户身份运行 `npm install`。新版本的依赖项可用时，如果您部署应用程序，就会安装这些依赖项，这可能会导致部署需要较长时间才能完成。

您可以通过创建将应用程序的依赖项锁定为当前版本的 `npm-shrinkwrap.json` 文件来避免升级依赖项。

```
$ npm install
$ npm shrinkwrap
wrote npm-shrinkwrap.json
```

在源包中包含此文件可确保依赖项仅安装一次。

# 配置代理服务器
<a name="nodejs-platform-proxy"></a>

Elastic Beanstalk 可使用 NGINX 或 Apache HTTPD 作为反向代理，将应用程序映射到端口 80 上的 Elastic Load Balancing 负载均衡器。默认值为 NGINX。Elastic Beanstalk 提供一个默认代理配置，您可以扩展该配置，也可以使用您自己的配置完全覆盖该配置。

默认情况下，Elastic Beanstalk 将代理配置为通过端口 5000 向您的应用程序转发请求。您可以覆盖默认端口，方法是将 `PORT` [环境属性](create_deploy_nodejs.container.md#nodejs-platform-console)设置为主应用程序侦听的端口。

**注意**  
应用程序侦听的端口不会影响 NGINX 服务器为了从负载均衡器接收请求而侦听的端口。

**在平台版本上配置代理服务器**  
所有 AL2023/AL2 平台都支持统一的代理配置功能。有关在运行 AL2023 /的平台版本上配置代理服务器的更多信息AL2，请参阅[反向代理配置](platforms-linux-extend.proxy.md)。

## 在 Amazon Linux AMI（在 Amazon Linux 2 之前）上配置代理
<a name="nodejs-platform-proxy.alami"></a>

如果您的 Elastic Beanstalk Node.js 环境使用 Amazon Linux AMI 平台版本（在 Amazon Linux 2 之前），请阅读本节中的信息。

**注意**  
本主题中的信息仅适用于基于亚马逊 Linux AMI (AL1) 的平台分支。 AL2023/AL2 平台分支与之前的 Amazon Linux AMI (AL1) 平台版本不兼容，*需要不同的配置设置*。
 [2022 年 7 月 18 日，](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2022-07-18-linux-al1-retire.html)**Elastic Beanstalk 将所有基于亚马逊 Linux AMI AL1 () 的平台分支的状态设置为停用。**有关迁移到当前且完全受支持的 Amazon Linux 2023 平台分支的更多信息，请参阅 [将 Elastic Beanstalk Linux 应用程序迁移到 Amazon Linux 2023 或 Amazon Linux 2](using-features.migration-al.md)。

### 扩展和覆盖默认代理配置 — Amazon Linux AMI () AL1
<a name="nodejs-platform-proxy.alami.extending"></a>

Node.js 平台使用反向代理将来自实例上的端口 80 的请求中继到在端口 8081 上侦听的应用程序。Elastic Beanstalk 提供一个默认代理配置，您可以扩展该配置，也可以使用您自己的配置完全覆盖该配置。

要扩展默认配置，请使用配置文件将 `.conf` 文件添加到 `/etc/nginx/conf.d`。有关具体示例，请参阅 [在运行 Node.js 的 EC2 实例上终止 HTTPS](https-singleinstance-nodejs.md)。

Node.js 平台会将 PORT 环境变量设置为代理服务器将流量传输到的端口。在代码中读取此变量可配置应用程序的端口。

```
    var port = process.env.PORT || 3000;

    var server = app.listen(port, function () {
        console.log('Server running at http://127.0.0.1:' + port + '/');
    });
```

默认 NGINX 配置会将流量转发到 `127.0.0.1:8081` 上名为 `nodejs` 的上游服务器。可以删除默认配置并在[配置文件](ebextensions.md)中提供您自己的配置。

**Example .ebextensions/proxy.config**  
以下示例将删除默认配置并添加一个将流量转发到端口 5000 (而不是 8081) 的自定义配置。  

```
files:
  /etc/nginx/conf.d/proxy.conf:
    mode: "000644"
    owner: root
    group: root
    content: |
      upstream nodejs {
        server 127.0.0.1:5000;
        keepalive 256;
      }

      server {
        listen 8080;

        if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})") {
            set $year $1;
            set $month $2;
            set $day $3;
            set $hour $4;
        }
        access_log /var/log/nginx/healthd/application.log.$year-$month-$day-$hour healthd;
        access_log  /var/log/nginx/access.log  main;

        location / {
            proxy_pass  http://nodejs;
            proxy_set_header   Connection "";
            proxy_http_version 1.1;
            proxy_set_header        Host            $host;
            proxy_set_header        X-Real-IP       $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        gzip on;
        gzip_comp_level 4;
        gzip_types text/html text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        location /static {
            alias /var/app/current/static;
        }

      }

  /opt/elasticbeanstalk/hooks/configdeploy/post/99_kill_default_nginx.sh:
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/bin/bash -xe
      rm -f /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf
      service nginx stop 
      service nginx start

container_commands:
  removeconfig:
    command: "rm -f /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf"
```
示例配置（`/etc/nginx/conf.d/proxy.conf`）使用 `/etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf` 中的默认配置作为包括具有压缩和日志设置以及静态文件映射的默认服务器数据块的基础。  
`removeconfig` 命令删除容器的默认配置，以确保代理服务器使用自定义配置。Elastic Beanstalk 在每次配置部署期间都会重新创建默认配置。为了解决这个问题，在以下示例中，添加了一个 post-configuration-deployment hook (`/opt/elasticbeanstalk/hooks/configdeploy/post/99_kill_default_nginx.sh`)。这删除了默认配置并重新启动代理服务器。

**注意**  
在 Node.js 平台将来的版本中，默认配置可能会发生更改。请使用该配置的最新版本作为您自定义的基础，以确保兼容性。

如果要覆盖默认配置，您必须定义任何静态文件映射和 GZIP 压缩。这是因为平台无法应用[标准设置](create_deploy_nodejs.container.md#nodejs-namespaces)。