我遇到了同样的问题,在 GAE 标准环境中出现“nginx 502 bad gateway”错误。这有很多原因,但我终于让它工作了。试试这些:
1) 在正确的端口上运行应用程序。 Google 将设置 PORT 环境变量。我在端口 8080 上运行,在堆栈驱动程序日志中我收到此警告:
应用正在侦听端口 8080。我们建议您的应用侦听
由 PORT 环境变量定义的端口,以利用
NGINX 层在 8080 端口上。
下面的代码从环境中获取端口,如果设置了PORT,否则默认为8080:
const PORT = process.env.PORT || 8080;
2) 转到google cloud console -> logging -> logs viewer。选择Google App Engine,然后从下方选择您的服务并检查您的日志。您是否收到了请求,或者看起来请求对您的服务器没有反应。就我而言,即使我修复了端口,我也没有得到它们:
2020-03-02 21:50:07 后端[20200302t232314] 服务器监听端口
8081! 2020-03-02 21:50:08 后端 [20200302t232314] "GET /create-user
HTTP/1.1" 502
如果您的应用程序无法启动、抛出异常等,请修复任何错误。
3) 运行服务器时不要传递 IP。 Google 似乎在预定义的 IP 地址上运行该应用程序,并且不希望您对其进行修改:
server.listen(PORT);
4) 不要尝试在 https 上运行! Google 在您的应用程序前面运行一个 nginx 服务器,它正在处理 SSL 并通过 http 重定向到您的应用程序。您可以使用环境变量NODE_ENV(在 GAE 环境中设置为“生产”)在生产环境的 http 和其他地方的 https 上运行,如下所示:
let https = require('https');
let http = require('http');
if (process.env.NODE_ENV == "production") {
http.createServer(app).listen(PORT, function () {
console.log(`Server listening on port ${PORT}!`)
});
} else {
https.createServer({
key: fs.readFileSync('host.key'),
cert: fs.readFileSync('host.cert')
}, app).listen(PORT, function () {
console.log(`Server listening on port ${PORT}!`)
});
}
5) 我不需要在我的 yaml 文件中设置任何处理程序,如果您的配置不正确,它可能会导致错误。我的 yaml 文件非常简单:
runtime: nodejs12
env: standard
instance_class: F1