我有一个 ExpressJS API,我正在尝试将其部署在 Google App Engine 上。我用
gcloud app deploy --version=[NEW_VERSION_NUMBER]
部署了它。
它包括一个返回 200 状态代码的基本根端点:
app.get('/', (req, res) => {
res.status(200).send('OK')
})
它还包括具有相同功能的
GET /health-check
端点。
我在最后有这段代码来验证 API 正在侦听端口:
const PORT = process.env.PORT | 3001
app.listen(PORT, () => {
console.log(`STARTUP: Process listening on port ${PORT}`)
})
当我运行
gcloud app logs tail -s default
时,我可以看到该应用程序正在为我部署的新版本启动:
2024-09-02 05:29:52 default[NEW_VERSION_NUMBER] STARTUP: Process listening on port 8121
但是,当我尝试使用此 URL 向任何端点发送请求时:
https://MY_PROJECT_ID.REGION_ID.r.appspot.com
它运行了 4 分钟,然后返回 503 错误。应用程序日志中没有错误消息,但 GCP 中的日志资源管理器指示由于准备情况检查失败而发生此错误。
所有代码都在本地运行良好,并且我的应用程序中还有其他日志表明 App Engine 已成功连接到我的数据库。
我该如何解决这个问题?
要获得日志的完整可见性,请使用标志运行以下命令
gcloud 应用程序部署 --verbosity=debug
您可能会看到 503 警告消息,因为您的应用程序启动时间过长且未通过就绪性检查,或者由于容器未能通过就绪性检查而导致部署失败。另一种可能性是实例上的资源已耗尽。如果不检查日志,很难指出确切的问题。
解决该问题的一些可能性:
建议将就绪检查值
app\_start\_timeout\_sec
增加到最大值,即1800,因为它可以让应用程序有更多时间变得健康。如果准备情况检查由于容器未报告健康而失败,则 Cloud Logging 应显示 503 响应。如果没有可用磁盘空间,运行状况检查也可能失败。为此,请尝试手动增加 app.yaml
文件中的资源,例如 CPU。您可以在此处查看更多相关信息。另请记住,默认情况下,来自运行状况检查的 HTTP 请求不会转发到您的应用程序容器。如果您想将运行状况检查扩展到应用程序,请指定 liveness checks
或 readiness checks
的路径。如果您的应用程序返回 200 OK 响应代码,则视为成功。
由于我们不知道您的配置部分(例如
app.yaml
文件),并且上述建议都无法帮助您解决问题,因此最好联系 Google 支持以获得有关该问题的更多专门帮助。