我正在使用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引擎上有另一个应用程序具有完全相同的设置,并且完美运行。
任何建议都将不胜感激。谢谢。
答案 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服务器无法将请求正确转发到您的节点应用。发生这种情况的原因可能有很多,但是这里有一些常见的问题:
默认情况下,App Engine假定您的节点应用程序在8080上运行。nginx本身将在8080上运行并将请求转发到8080。检查您的应用程序的端口号是否为8080。
您的应用可能具有一个定义为hostname
的域名something.appspot.com
或IP 127.18.21.21
等。 从任何地方从您的server.listen
或config.json
或vhost
中删除所有主机名。 App Engine将处理域,IP等,因此您不必这样做。
您的应用可能会崩溃,然后再向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);
});