

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 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)，以便在部署期間安裝套件、提供啟動命令，以及指定您希望應用程式使用的 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. 在導覽窗格中，選擇**環境**，然後在清單中選擇您環境的名稱。

1. 在導覽窗格中，選擇**組態**。

1. 在**更新、監控和日誌記錄**組態類別中，選擇**編輯**。

### 容器選項
<a name="nodejs-platform-console-settings"></a>

您可以指定這些平台特有的選項：
+ **代理伺服器** – 要在您的環境執行個體上使用的代理伺服器。預設為使用 NGINX。

### 日誌選項
<a name="nodejs-platform-console-logging"></a>

**Log Options (日誌選項)** 區段有兩個設定：
+ **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 環境才支援以下主控台軟體組態類別。

**備註**  
本主題中的資訊僅適用於以 Amazon 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 會根據 Amazon 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-console-settings"></a>

在組態頁面上指定下列項目：
+ **Proxy server** (代理伺服器) – 指定要使用哪一個 Web 伺服器來將代理連線連至 Node.js。預設為使用 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 壓縮** – 指定是否啟用 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)，請考慮本節中的特定組態和建議。

**備註**  
本主題中的資訊僅適用於以 Amazon 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 會根據 Amazon Linux AMI (AL1) 將所有平台分支的狀態設定為**已淘汰**。如需有關遷移至完全支援的目前 Amazon Linux 2023 平台分支的詳細資訊，請參閱 [將您的 Elastic Beanstalk Linux 應用程式遷移到 Amazon Linux 2023 或 Amazon Linux 2](using-features.migration-al.md)。

### Node.js 平台特定組態選項 — Amazon 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 語言版本 — Amazon 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. 在導覽窗格中，選擇**環境**，然後在清單中選擇您環境的名稱。

1. 在環境概觀頁面的 **Platform (平台)** 下，選擇 **Change (變更)**。

1. 在 **Update platform version** (更新平台版本) 對話方塊中，選取 Node.js 平台版本。  
![\[Elastic Beanstalk 更新平台版本確認\]](http://docs.aws.amazon.com/zh_tw/elasticbeanstalk/latest/dg/images/platform-nodejs-update-node-version.png)

1. 選擇 **Save** (儲存)。

### Node.js 組態命名空間 — Amazon 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` 路徑的映像檔案。

**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 登錄檔的相依性的問題。而由於相依性模組來自本機目錄，所以這可能也有助於縮短部署時間。如需詳細資訊，請參閱[在 a 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` 關鍵字來提供啟動命令。現在，在 `aws:elasticbeanstalk:container:nodejs` 命名空間中使用 `scripts` 關鍵字來取代舊版的 `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* 套件，請將 PM\$1USE\$1PRODUCTION 環境屬性設為 `false`。透過此設定，我們不會在執行 npm 安裝時使用上述選項。這將導致安裝 *devDependencies* 套件。

## 在 a 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_modules` 目錄中Node.js尋找相依性。如需詳細資訊，請參閱 Node.js 文件中的[從 node\$1modules 資料夾載入](https://nodejs.org/api/modules.html#modules_loading_from_node_modules_folders)。

**注意**  
如果您在 Elastic Beanstalk 執行 `npm install` 時遭遇任何部署問題，在調查問題時，請考慮使用本主題中描述的方法作為變通措施。  
 

### Amazon Linux 2 上的 Node.js 考量事項
<a name="nodejs-al2-considerations"></a>

如果您使用在 *Amazon Linux 2* 上執行的 *Node.js* 平台分支，請閱讀本節。

#### Amazon Linux 2 上的 Node.js 考量事項
<a name="nodejs-al2-considerations-detail"></a>

**注意**  
本主題中的資訊適用於在 Amazon Linux 2 上執行的Node.js平台分支。此處的內容說明與 AL2-specific功能和行為。 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 日開始，您可以使用 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 網站上的 [Semantic Versioning using npm](https://nodejs.dev/learn/semantic-versioning-using-npm) (使用 npm 的語意版本控制)。Node.js `package.json` 檔案中的 `engines` 關鍵字取代 `aws:elasticbeanstalk:container:nodejs` 命名空間中的舊版 `NodeVersion` 選項。

**重要**  
指定版本範圍的功能不適用於在 AL2023 上執行的 Node.js 平台分支。在 AL2023 上特定的 Node.js 分支內，只支援一個 Node.js 版本。如果 `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 版本的支援已從平台移除，您必須在[平台更新](using-features.platform.upgrade.md)之前變更或移除 Node.js 版本設定。當發現一個或多個版本的 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)，請閱讀本節中的資訊。

**備註**  
本主題中的資訊僅適用於以 Amazon 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 會根據 Amazon 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**  
下列的範例移除了預設的組態，並新增自訂組態，來將流量轉傳到 5,000 埠而非 8,081 埠。  

```
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)。