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,DELETE和PUT)全部返回502(错误网关)错误.
我尝试在我的本地机器上运行我的应用程序,同时连接到我的远程MongoDB数据库,并且工作得很好.所以它一定是App Engine或NodeJS的问题,而不是MongoDB.
虽然没有错误,但我已尝试检查Google Cloud中的所有错误日志.
为什么App Engine/NodeJS完全可以为我的应用程序的静态内容提供服务,尽管不允许对我的API提出任何请求?
Bil*_*rin 14
502 Bad Gateway通常是Nginx方面的错误.不幸的是,这些日志还没有出现在Cloud Logging中.
很多时候问题是你的HTTP数据包对于缓冲区或类似的东西来说太大了.你可以看到nginx日志的方式是这样的:
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整个日志目录.
你可能会在那里看到一个错误,这将是一个更大的暗示,什么是错误的.
我知道这比它应该更复杂: - \如果您对上述步骤有任何问题,请发表评论.如果您确实发现了错误并且您不确定如何处理它,请同时发表评论.
我遇到了同样的问题,我在 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 viewer。Google 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)
| 归档时间: |
|
| 查看次数: |
11733 次 |
| 最近记录: |