【问题标题】:ExpressJS Server Goes Offline Every Night - 502 Bad GatewayExpressJS 服务器每晚离线 - 502 Bad Gateway
【发布时间】:2019-03-14 00:52:14
【问题描述】:

我有一个安装了 Nginx 的网站作为 ExpressJS 服务器的保留代理(端口 3001 的代理)。这将 Node 和 ReactJS 用于我的前端应用程序。

目前这只是一个测试网站,不为任何用户所知或使用。我已经将它安装在带有 Ubuntu 的 Digital Ocean Droplet 上。

每天早上醒来时,我都会加载我的网站并查看502 Bad Gateway。问题是,我不知道如何找出这是怎么发生的。我安装了 PM2,它应该会自动重新启动我的 ExpressJS 服务器,但它没有这样做,当我运行 pm2 list 时,我的应用程序仍然显示 online

当我运行 pm2 logs 时,我收到以下错误(我以管理员身份运行):

所以我将运行pm2 restart all 来重新启动应用程序,但是我没有看到任何崩溃信息。然而,在这次截屏时,有几个不寻常的请求。 /robots.txt/sitemap.xml/.well-known/security.txt,但没有任何迹象表明崩溃:

当我查看我的 Nginx error.log 文件时,我只能看到以下内容:

然而,我的 access.log ([09/Oct/2018:06:33:19 +0000]) 中有一些模糊的东西,但我不知道这意味着什么:

如果我在服务器离线时运行curl localhost:3001,我将收到一条连接错误消息。在我运行pm2 restart all 后,这工作正常。

我完全坚持这一点,即使是最小的帮助也将不胜感激,即使只是告诉我我完全错误地吠叫并需要寻找其他地方 - 谢谢。

【问题讨论】:

  • 查看 Digital Ocean 监控仪表板,您是否看到 CPU/Mem 的任何峰值?
  • 早上 6 点的高峰可能是巨大的 http 请求的结果,正如您从访问日志中看到的那样。你的 Ubuntu 上是否安装了任何额外的安全措施?喜欢 selinux?
  • 您的 node.js 应用程序出现问题。它很可能被记录在 pm2 日志中。感谢您使用比当前共享的最后 15 行更长的 pm2 日志内容更新问题。您可能想要使用 --lines 标志,例如pm2 logs --lines 1000.
  • 更新node.js应用所在目录下的用户/权限,让运行它的用户获得写权限。这将允许写入 npm-debug.log 文件,并可能为您提供有关问题所在的更多信息。
  • 可能在你的 node.js 项目的根目录中。

标签: node.js reactjs express nginx


【解决方案1】:

我认为你应该检查一下这个github thread,它似乎对你有帮助。

基本上,几个小时后,Nodejs 服务器停止运行,可怜的 nginx 无法转发它的请求,因为监听转发端口的服务已经死了。所以它会触发 502 错误。

这都是由于内存泄漏,导致大量垃圾收集,然后导致服务器崩溃。检查你的内存消耗,你可能会有一些惊喜。并尝试调试您的应用程序代码,当时是一块(依赖)。

更新答案:

因此,我将在我的问题中添加另一个分支,因为到目前为止它似乎对您没有帮助。 您可以尝试摆脱pm2,并使用systemd 来管理您的应用程序生命周期。

创建服务文件

sudo vim /lib/systemd/system/appname.service

这是我自己用于随机 ExpressJS 应用程序的一个简单文件:

[Unit]
Description=YourApp Site Server

[Service]
ExecStart=/home/user/appname/index.js
Restart=always
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/home/user/appname

[Install]
WantedBy=multi-user.target

请注意,如果以某种方式失败,它将尝试重新启动Restart=always

使用 systemd 管理它

注册新服务:

sudo systemctl daemon-reload

现在从 systemd 启动您的应用程序:

sudo systemctl start appname

从现在开始,您应该能够使用常用的 systemd 命令来管理您的应用生命周期。

您可以将 stdout 和 stderr 添加到 syslog 以了解您的应用正在做什么

StandardOutput=syslog
StandardError=syslog

希望对你有更多帮助

【讨论】:

  • 嘿,非常感谢。我会看看这个。
  • 不幸的是创作者继续提到僧侣JS,我没有使用。
  • ping @Matt 以获取通知
【解决方案2】:

你不能确切地说 NodeJS 什么时候会崩溃,或者会做大 GC,或者会因为其他原因而眩晕。

解决此类问题的最简单方法是进行运行状况检查并重新启动应用。使用集群时,这应该不是问题。

请看health check module的实现,你可以尝试使用它,或者写一些简单的shell脚本来做检查

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-26
    • 2021-09-11
    • 2018-01-20
    • 2017-05-10
    • 2022-07-14
    • 2014-06-28
    • 2022-01-15
    • 2019-07-16
    相关资源
    最近更新 更多