Node.js 執行階段是一個軟體堆疊,負責安裝網路服務的程式碼和其依附元件,並執行服務。
適用於 App Engine 標準環境的 Node.js 執行階段會在 app.yaml 檔案中宣告:
runtime: nodejsVERSION
其中 VERSION 是 Node.js MAJOR 版本號碼。舉例來說,如要使用最新版 Node.js 24,請指定 24。
如要瞭解其他支援的 Node.js 版本,以及 Node.js 版本對應的 Ubuntu 版本,請參閱執行階段支援時間表。
Node.js 版本
最新支援的 Node.js 版本為 24。Node.js 執行階段會使用 app.yaml 檔案中指定的最新穩定版本。App Engine 會自動更新至新的修補程式和次要版本,但不會自動更新主要版本。
舉例來說,您的應用程式可能先採用 Node.js 10.9.4 版進行部署,並在後續的部署作業中自動更新成 10.10.0 版,但是並不會自動更新至 Node.js 12.x.x。
由於系統會自動更新次要版本和修補程式版本,因此 package.json 檔案中的 engines.node 屬性只能指定主要版本,且必須與 app.yaml 檔案中指定的 Node.js 版本相容。
例如 24:
24.x.x^24.0.0~24>=6
如果您在 package.json 檔案中指定不相容的 Node.js 版本,部署作業將會失敗並出現錯誤訊息。
依附元件
在部署期間,執行階段會使用 npm install 指令安裝依附元件。執行階段也支援 Yarn (yarn.lock) 和 Pnpm (pnpm-lock.yaml) 套件管理員。詳情請參閱「指定依附元件」。由於執行階段會執行全新安裝,因此您不需要上傳 node_modules 資料夾。
為了支援需要原生擴充功能的 Node.js 套件,執行階段包含多項系統套件,可讓您使用 ImageMagick、FFmpeg 及 Chrome headless。如需套件的完整清單,請參閱「包含的系統套件」。如要索取套件,請在問題追蹤工具中提交要求。
NPM 建構指令碼
根據預設,在 App Engine 中部署應用程式時,如果 Node.js 執行階段在 package.json 中偵測到 build 指令碼,就會執行 npm run build。如要在啟動應用程式前進一步控管建構步驟,請在 package.json 檔案中新增 gcp-build 指令碼,提供自訂建構步驟。
如要避免建構作業執行 npm run build 指令碼,請採取下列任一做法:
- 在
package.json檔案中新增值為空白的gcp-build指令碼:"gcp-build":""。如要瞭解如何設定package.json,請參閱 Node.js 建構套件設定。 在
app.yaml檔案中,新增值為空白的GOOGLE_NODE_RUN_SCRIPTS建構環境變數。build_env_variables: GOOGLE_NODE_RUN_SCRIPTS: ''
app.yaml 檔案中的 build_env_variables 節。
啟動應用程式
根據預設,執行階段會執行 node server.js 來啟動應用程式。如果在 package.json 檔案中指定 start 指令碼,執行階段會改為執行指定的啟動指令碼。例如:
"scripts": {
"start": "node app.js"
}
為了讓應用程式接收 HTTP 要求,start 指令碼應啟動在主機 0.0.0.0 上聆聽的網路伺服器,以及 PORT
環境變數指定的通訊埠。您可在 Node.js 中存取這個以 process.env.PORT 形式顯示的環境變數。
如要獲得最佳效能,應使用輕量的 start 指令碼並排除建構步驟,因為每次當您建立新的應用程式執行個體時,都會執行該指令碼。
如要覆寫此行為,請在 app.yaml 的entrypoint 欄位中指定指令碼。執行階段會使用您在 entrypoint 中指定的指令啟動應用程式,而不是執行 node server.js 或啟動指令碼。
環境變數
下列為執行階段設定的環境變數:
| 環境變數 | 說明 |
|---|---|
GAE_APPLICATION
|
App Engine 應用程式的 ID。 這個 ID 的前置字元為「region code~」,例如在歐洲部署的應用程式為「e~」。 |
GAE_DEPLOYMENT_ID |
目前部署的 ID。 |
GAE_ENV |
App Engine 環境。設為 standard。 |
GAE_INSTANCE |
服務目前正在執行的執行個體 ID。 |
GAE_MEMORY_MB |
應用程式程序可用的記憶體量,以 MB 為單位。 |
GAE_RUNTIME |
在 app.yaml 檔案中指定的執行階段。 |
GAE_SERVICE |
在 app.yaml 檔案中指定的服務名稱。如果未指定服務名稱,則會設為 default。 |
GAE_VERSION |
服務目前的版本標籤。 |
GOOGLE_CLOUD_PROJECT |
與應用程式相關聯的 Google Cloud 專案 ID。 |
PORT |
接受 HTTP 要求的通訊埠。 |
NODE_ENV (僅適用於 Node.js 執行階段) |
在部署服務時設定為 production。 |
您可以在 app.yaml 檔案中定義其他環境變數,但無法覆寫上述值 (NODE_ENV 除外)。
HTTPS 和轉送 Proxy
App Engine 會在負載平衡器上終止 HTTPS 連線,並將要求轉送至您的應用程式。部分應用程式需要判斷原始要求 IP 和通訊協定。使用者的 IP 位址會顯示在標準 X-Forwarded-For 標頭中。需要這項資訊的應用程式應將其網路架構設定為「信任 Proxy」。
如要使用 Express.js,請使用 trust proxy 設定:
app.set('trust proxy', true);
請注意,將 trust proxy 設為 true 可能會導致 req.ip 屬性出現 IP 詐欺漏洞。
檔案系統
執行階段包含完整的檔案系統。檔案系統為唯讀狀態,但位置 /tmp 除外。這個位置是在 App Engine 執行個體的 RAM 中儲存資料的虛擬磁碟。
中繼資料伺服器
應用程式的每個執行個體都可以使用 App Engine 中繼資料伺服器來查詢與執行個體和專案相關的資訊。
您可以透過以下端點存取中繼資料伺服器:
http://metadatahttp://metadata.google.internal
傳送至中繼資料伺服器的要求必須包含要求標頭 Metadata-Flavor: Google。此標頭表示要求是為了擷取中繼資料值而傳送。
下表列出可讓您針對特定中繼資料發出 HTTP 要求的端點:
| 中繼資料端點 | 說明 |
|---|---|
/computeMetadata/v1/project/numeric-project-id |
指派給專案的專案編號。 |
/computeMetadata/v1/project/project-id |
指派給專案的專案 ID。 |
/computeMetadata/v1/instance/region |
執行個體執行的區域。 |
/computeMetadata/v1/instance/service-accounts/default/aliases |
|
/computeMetadata/v1/instance/service-accounts/default/email |
指派給專案的預設服務帳戶電子郵件。 |
/computeMetadata/v1/instance/service-accounts/default/ |
列出專案的所有預設服務帳戶。 |
/computeMetadata/v1/instance/service-accounts/default/scopes |
列出預設服務帳戶的所有支援範圍。 |
/computeMetadata/v1/instance/service-accounts/default/token |
傳回可用來向其他 Google Cloud API 驗證應用程式的驗證憑證。 |
舉例來說,如要擷取專案 ID,請將要求傳送至 http://metadata.google.internal/computeMetadata/v1/project/project-id。