我正在为我的NodeJs应用程序使用 Google App Engine 标准环境。 一切正常,直到我在Express应用程序中注册了路由“ / *”以捕获我的初始路由(例如“ /”,“ / login”等)之后的所有路由。在GAE上部署我的应用程序后,我得到了:
Error: Server Error
The server encountered an error and could not complete your request.
Please try again in 30 seconds.
在我的App Engine构建日志中:
runtime: nodejs10
env: standard
service: default
health_check:
enable_health_check: False
manual_scaling:
instances: 1
resources:
cpu: 1
memory_gb: 0.5
disk_size_gb: 10
GAE官方文档中的语录: https://cloud.google.com/appengine/docs/standard/nodejs/how-instances-are-managed
启动 创建每个服务实例以响应启动请求,该启动请求是对/ _ah / start的空HTTP GET请求。 App Engine发送此请求以使实例存在。用户无法将请求发送到/ _ah / start。手动和基本伸缩实例必须先响应启动请求,然后才能处理其他请求。启动请求可以用于两个目的:
启动无限期运行的程序,无需进一步接受 要求。在实例收到其他实例之前对其进行初始化 交通。手动,基本和自动扩展实例启动 不一样。启动手动扩展实例时,App Engine 立即向每个实例发送一个/ _ah / start请求。当你 启动基本扩展服务的实例,App Engine允许它 接受流量,但/ _ah / start请求未发送到实例 直到收到第一个用户请求。多种基本缩放 实例仅在必要时启动,以便处理增加的 交通。自动缩放实例不会收到任何/ _ah / start 请求。
当实例使用HTTP响应/ _ah / start请求时 状态码200–299或404,则认为已成功 已启动并可以处理其他请求。否则,App Engine 终止实例。手动扩展实例重新启动 立即,而仅在以下情况下重新启动基本扩展实例 服务流量所需。
我想念什么吗?请帮忙。
预先感谢
答案 0 :(得分:2)
我通过注册我的最后一条路线来解决此问题:
app.get(/^(?!.*_ah).*$/,(req,res,next)=>{
})
与以前的配置相比。
app.get('/*',(req,res,next)=>{
})
在这里我使用了否定正则表达式。 Credit to this SO answer
Quoting from official GAE Docs
在实例收到其他流量之前对其进行初始化。手动,基本和自动扩展实例的启动方式有所不同。启动手动扩展实例时,App Engine会立即向每个实例发送/ _ah / start请求。
上述路由处理程序所做的是捕获除以_ah
开头的路由以外的所有路由,这意味着_ah / start和_ah / stop将不会被我的应用程序监听,因为它们被Google App引擎用于注册应用程序。
我希望这对以后的人有所帮助。
谢谢
答案 1 :(得分:1)
您可能要遍历app.yaml Configuration File,其中有一些不支持的配置(有些是only applicable to the flexible environment),或者在您的环境中只是多余的,对您的应用没有影响:
env: standard
service: default
health_check:
enable_health_check: False
resources:
cpu: 1
memory_gb: 0.5
disk_size_gb: 10
在其中可能相关的资源中,您似乎希望为应用程序提供0.5G的内存。为此,您需要一个instance_class
配置,至少选择一个B4
类。否则,您的应用程序只会获得B2
(具有256M的内存)。来自Runtime and app elements:
默认:如果未与basic_scaling元素或manual_scaling一起指定实例类,则分配 B2 元素。
但这只是一种怀疑。您可能希望找出与500
请求的/_ah/start
错误相匹配的实际错误日志,希望它可以查明失败的根本原因(很多可能性,内存不足只是其中之一) 。没有它,只是猜测。