在Google App Engine中处理/ _ah / start路由NodeJ

时间:2018-11-24 14:54:20

标签: node.js express google-app-engine

我正在为我的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构建日志中:

enter image description here 我的app.yaml看起来像: app.yaml

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   终止实例。手动扩展实例重新启动   立即,而仅在以下情况下重新启动基本扩展实例   服务流量所需。

我想念什么吗?请帮忙。

预先感谢

2 个答案:

答案 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错误相匹配的实际错误日志,希望它可以查明失败的根本原因(很多可能性,内存不足只是其中之一) 。没有它,只是猜测。

旁注-可能感兴趣:How to tell if a Google App Engine documentation page applies to the standard or the flexible environment