Node.js 运行时是负责安装 Web 服务代码及其依赖项并运行服务的软件栈。
适用于 App Engine 标准环境的 Node.js 运行时环境在 app.yaml
文件中进行声明:
runtime: nodejsVERSION
其中 VERSION 是 Node.js MAJOR
版本号。例如,如需使用最新的 Node.js 版本 Node.js 20,请指定 20
。
如需了解其他受支持的 Node.js 版本以及 Node.js 版本对应的 Ubuntu 版本,请参阅运行时支持时间表。
Node.js 版本
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 版本兼容。
例如,对于 20:
20.x.x
^20.0.0
~20
>=6
如果您在 package.json
文件中指定了不兼容的 Node.js 版本,则部署将失败并显示错误消息。
依赖项
在部署期间,运行时会使用 npm install
命令安装依赖项。运行时还支持 Yarn (yarn.lock
) 和 Pnpm (pnpm-lock.yaml
) 软件包管理器。如需了解详情,请参阅指定依赖项。由于运行时会执行全新安装,因此您无需上传 node_modules
文件夹。
为了支持需要原生扩展程序的 Node.js 软件包,运行时包含系统软件包,以便您能够使用 ImageMagick、FFmpeg 和 Chrome headless 等工具。如需查看完整的软件包列表,请参阅包含的系统软件包。如需提交软件包请求,请在问题跟踪器中提交问题。
NPM 构建脚本
默认情况下,如果 package.json
中检测到 build
脚本,则 Node.js 运行时会执行 npm run build
。如果您需要在启动应用之前对构建步骤进行额外的控制,则可以通过向 package.json
文件添加 gcp-build
脚本来提供自定义构建步骤。
如需阻止构建运行 npm run build
脚本,您必须执行以下操作之一:
- 在
package.json
文件中添加具有空值的gcp-build
脚本:"gcp-build":""
。如需详细了解如何配置package.json
,请参阅 Node.js Buildpack 配置。 在
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
脚本应启动一个 Web 服务器,该服务器侦听主机的 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 和转发代理
App Engine 在负载均衡器上终止 HTTPS 连接,并将请求转发到您的应用。某些应用需要确定原始请求 IP 地址和协议。用户的 IP 地址可在标准 X-Forwarded-For
标头中获取。对于需要此信息的应用,应将其 Web 框架配置为信任代理。
在 Express.js 框架中,使用 trust proxy
设置:
app.set('trust proxy', true);
文件系统
运行时包含一个完整的文件系统。该文件系统是只读的,但位置 /tmp
除外(该位置是在 App Engine 实例的 RAM 中存储数据的虚拟磁盘)。
元数据服务器
应用的每个实例都可以使用 App Engine 元数据服务器来查询有关实例和项目的信息。
您可以通过以下端点访问元数据服务器:
http://metadata
http://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
发送请求。