使用nginx的错误网关502 Google App Engine |节点JS

时间:2017-01-04 19:44:37

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

我正在使用App Engine在Google云平台上托管网页应用,我使用的是ExpressJS和MongoDB,它位于mLab上。

一切顺利,直到2017年1月1日。我之前有过vm:true,现在被迫将env更改为flex。现在我用nginx得到了502错误的网关错误。 App引擎不允许我们更改nginx配置文件。

我曾尝试过这篇文章中提出的建议:Google App Engine 502 (Bad Gateway) with NodeJS但仍然无效。

出于某种原因,我在app引擎上有另一个应用程序具有完全相同的设置,并且完美运行。

任何建议都将不胜感激。谢谢。

8 个答案:

答案 0 :(得分:15)

应用应始终收听端口8080,谷歌转发所有请求从80到8080 https://cloud.google.com/appengine/docs/flexible/custom-runtimes/build#listen_to_port_8080

答案 1 :(得分:9)

查看日志中的任何部署错误

$ gcloud app logs read

我遇到了与本教程(https://cloud.google.com/nodejs/getting-started/authenticate-users

提供的代码类似的问题

发现缺少依赖性。我修复了缺少的依赖项,并部署了应用程序并正常运行。

问题详情:https://github.com/GoogleCloudPlatform/nodejs-getting-started/issues/106

答案 2 :(得分:2)

502不一定是nginx本身的错误,当nginx代理无法与您的应用容器通话时(通常是因为您的应用无法启动),它通常会发生。如果您在迁移到'env:flex'后获得502,则很可能是由于Upgrading to the Latest App Engine Flexible Environment Release中提到的应用中需要更改一些代码。

检查application logs来自NPM的错误也有助于诊断启动失败的确切原因。

答案 3 :(得分:1)

我和Express有同样的问题。为我解决的是不为应用程序提供IP地址。

所以我的旧代码将是:

var ip = "127.0.0.1";
var port = "8080";
var server = http.createServer(app);
server.listen(port, ip);

这将导致应用程序引擎中的502。

删除ip是我的解决方案。

server.listen(port);

答案 4 :(得分:0)

将主机设置为0.0.0.0

引擎默认设置端口8080。实际上,您无法定义环境var PORT,因为它是保留的。

运行下一个命令(如@sravan所述)

gcloud app logs read tail

并确保它看起来像这样,

[Sun May 27 2018 10:32:44 GMT+0000 (UTC)] serving app on 0.0.0.0:8080

干杯

答案 5 :(得分:0)

也请注意http,在部署时,它应该是http服务器而不是https

  var server;
  if (process.env.NODE_ENV == "dev") {
    server = https.createServer(httpsOptions, app);
  } else {
    server = http.createServer(app);
  }

答案 6 :(得分:0)

Google App Engine使用Nginx Front来负载均衡对node.js应用程序的所有请求。使用nginx充当转发代理时,通常会在用户在浏览器中发出的请求到达nginx时发生此错误(您会看到无样式的502错误网关错误页面),但是nginx服务器无法将请求正确转发到您的节点应用。发生这种情况的原因可能有很多,但是这里有一些常见的问题:

  1. 默认情况下,App Engine假定您的节点应用程序在8080上运行。nginx本身将在8080上运行并将请求转发到8080。检查您的应用程序的端口号是否为8080。

  2. 您的应用可能具有一个定义为hostname的域名something.appspot.com或IP 127.18.21.21等。 从任何地方从您的server.listenconfig.jsonvhost中删除所有主机名。 App Engine将处理域,IP等,因此您不必这样做。

  3. 您的应用可能会崩溃,然后再向nginx发送响应。检查Nginx和您的节点应用程序的日志。

要查看日志/了解正在发生的情况,请使用此指南https://cloud.google.com/appengine/docs/flexible/nodejs/debugging-an-instance#connecting_to_the_instance直接在应用程序引擎后面的VM内部进行SSH。 nginx将有一个docker进程,您可以在其中看到nginx错误日志,而节点应用程序将显示一个docker映像,以检查节点应用程序的错误消息。

基于这个问题的活动和时间戳,我只是想知道为什么Google没有更新其文档来解决这个问题! ???

答案 7 :(得分:-1)

创建服务器,然后使用三元条件检查当前环境是否为生产环境,如果当前环境为开发环境,则分配端口“ 80”,否则分配process.env.NODE.ENV。

const app = require('express')();
        const server = require('http').Server(app);
        const port = process.env.NODE_ENV === 'production' ? process.env.PORT :'80';
        server.listen(port, ()=> {
          console.log('listening on port number  *:' + server.address().port);
         });