我有一个完整的Web应用程序,使用NodeJS,MongoDB(Mongoose作为驱动程序)和ExpressJS。
该项目在我的本地机器上完美运行。今天我决定把所有东西都搬到生产区。我正在使用Google App Engine托管我的应用程序,并使用Compose(正式MongoHQ)来托管我的数据库。
App Engine完美地为我的应用程序提供服务,尽管我的API似乎不起作用。我的API由example.com/api
提供,每个请求(GET
,POST
,DELETE
和PUT
都返回502(错误网关)错误。< / p>
我尝试在连接到我的远程MongoDB数据库的同时在我的本地计算机上运行我的应用程序,并且工作得很好。所以它一定是App Engine或NodeJS的问题,而不是MongoDB。
我已尝试检查Google Cloud中的所有错误日志,但没有错误。
为什么App Engine / NodeJS完全可以为我的应用程序的静态内容提供服务,尽管不允许对我的API发出任何请求?
答案 0 :(得分:18)
确保您的服务器侦听8080端口 https://cloud.google.com/appengine/docs/flexible/custom-runtimes/build#listen_to_port_8080
答案 1 :(得分:11)
502 Bad Gateway通常是Nginx方面的错误。不幸的是,这些日志还没有出现在Cloud Logging中。
很多时候,问题是您的HTTP数据包对于缓冲区或类似的东西来说太大了。您可以看到nginx日志的方式如下:
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');
}
});
删除通话后,问题消失了。还在寻找原因...