使用NodeJS的Google App Engine 502(Bad Gateway)

Fiz*_*zix 19 google-app-engine node.js

我有一个完整的Web应用程序使用NodeJS,MongoDB(Mongoose作为驱动程序)和ExpressJS.

该项目在我的本地机器上完美运行.今天我决定把所有东西都搬到生产区.我正在使用Google App Engine托管我的应用程序,并使用Compose(正式MongoHQ)来托管我的数据库.

App Engine完美地为我的应用程序提供服务,尽管我的API似乎不起作用.我的API是从服务example.com/api,并且每个请求(GET,POST,DELETEPUT)全部返回502(错误网关)错误.

我尝试在我的本地机器上运行我的应用程序,同时连接到我的远程MongoDB数据库,并且工作得很好.所以它一定是App Engine或NodeJS的问题,而不是MongoDB.

虽然没有错误,但我已尝试检查Google Cloud中的所有错误日志.

为什么App Engine/NodeJS完全可以为我的应用程序的静态内容提供服务,尽管不允许对我的API提出任何请求?

Bil*_*rin 14

502 Bad Gateway通常是Nginx方面的错误.不幸的是,这些日志还没有出现在Cloud Logging中.

很多时候问题是你的HTTP数据包对于缓冲区或类似的东西来说太大了.你可以看到nginx日志的方式是这样的:

  • 仅使用1个VM.这不是绝对必要的,但如果您知道在一台计算机上的请求,很多时候它会使您更容易调试应用程序.您可以通过将此添加到您的app.yaml来完成此操作:

manual_scaling: instances: 1 然后重新部署

  • 将VM从"Google拥有"切换为自我管理.这可以在云控制台中完成.转到Compute Engine,实例,单击与App Engine版本匹配的实例名称,您应该看到一个将其切换为自我管理的选项.

  • gcloud compute ssh <instance name> SSH到机器

  • docker ps看到你正在运行的容器.查找名为nginx的容器并获取其id.

  • 拥有容器ID后,您应该能够docker exec -it <container id> -- cat /var/log/nginx/error.log.您可能想要ls整个日志目录.

你可能会在那里看到一个错误,这将是一个更大的暗示,什么是错误的.

我知道这比它应该更复杂: - \如果您对上述步骤有任何问题,请发表评论.如果您确实发现了错误并且您不确定如何处理它,请同时发表评论.


Can*_*ner 5

我遇到了同样的问题,我在 GAE 标准环境中收到“nginx 502 bad gateway”错误。造成这种情况的原因有很多,但我终于成功了。试试这些:

1) 在正确的端口上运行应用程序。Google 将设置PORT环境变量。我在端口 8080 上运行,在 stackdriver 日志中我收到以下警告:

应用程序正在侦听端口 8080。我们建议您的应用程序侦听 PORT 环境变量定义的端口,以利用端口 8080 上的 NGINX 层。

下面的代码从环境中获取端口,如果PORT设置了,则默认为 8080:

const PORT = process.env.PORT || 8080;
Run Code Online (Sandbox Code Playgroud)

2) 前往google cloud console -> logging -> logs viewerGoogle 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);
Run Code Online (Sandbox Code Playgroud)

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}!`)
    });
}
Run Code Online (Sandbox Code Playgroud)

5) 我不需要在 yaml 文件中设置任何处理程序,如果您的配置不正确,可能会导致错误。我的 yaml 文件非常简单:

runtime: nodejs12
env: standard
instance_class: F1
Run Code Online (Sandbox Code Playgroud)