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

时间:2016-06-24 11:51:26

标签: node.js google-app-engine

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

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

App Engine完美地为我的应用程序提供服务,尽管我的API似乎不起作用。我的API由example.com/api提供,每个请求(GETPOSTDELETEPUT都返回502(错误网关)错误。< / p>

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

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

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

4 个答案:

答案 0 :(得分:18)

答案 1 :(得分:11)

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

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

  • 仅使用1个VM。这并非严格必要,但如果您知道在一台计算机上的请求,则很多时候可以更轻松地调试您的应用程序。您可以通过将此添加到您的app.yaml:
  • 来完成此操作

manual_scaling: instances: 1 然后重新部署

  • 从#34; Google拥有&#34;切换虚拟机自我管理。这可以在云控制台中完成。转到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整个日志目录。

你可能会看到一个错误,这将是一个更大的错误提示。

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

答案 2 :(得分:3)

我遇到了同样的问题,我在GAE标准环境中收到“ nginx 502错误的网关”错误。造成这种情况的原因很多,但我终于使它起作用了。试试这些:

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

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

如果设置了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]“获取/创建用户 HTTP / 1.1“ 502

如果您的应用程序无法启动,引发异常等,请修复所有错误。

3)运行服务器时不要传递IP。 Google似乎以预定的IP地址运行该应用,并且不希望您对其进行修改:

server.listen(PORT);

4)不要尝试在https上运行! Google在您的应用程序前面运行nginx服务器,它正在处理SSL并通过http重定向到您的应用程序。您可以使用环境变量NODE_ENV(在GAE环境中设置为“ production”)在生产环境的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

答案 3 :(得分:0)

在我的情况下,发生此问题是因为我在服务器侦听后立即设置了异步请求,例如下面的代码

const app = express();
const PORT = 8080;

app.use(router);
app.listen(PORT, async () => {
  console.log(`Server loaded on port ${PORT}`);
  try {
    await startNormalRoutines();
  } catch (error) {
    console.log('eror');
  }
});

删除通话后,问题消失了。还在寻找原因...