ExpressJS服务器每天晚上都离线-502错误的网关

时间:2018-10-09 09:32:09

标签: node.js reactjs express nginx

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

当前这只是一个测试网站,任何用户都不知道或未使用过。我已经在Ubuntu的Digital Ocean Droplet上安装了此软件。

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

enter image description here

运行pm2 logs时,出现以下错误(我以管理员身份运行):

enter image description here

因此,我将运行pm2 restart all以重新启动应用程序,但随后看不到任何崩溃信息。但是,在这种情况下,当截取此屏幕截图时,有一些不同寻常的请求。 /robots.txt/sitemap.xml/.well-known/security.txt,但没有崩溃提示:

enter image description here

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

enter image description here

但是,我的access.log[09/Oct/2018:06:33:19 +0000])中有些模糊之处,但是我不知道这意味着什么:

enter image description here

如果我在服务器离线时运行curl localhost:3001,则会收到连接错误消息。我运行pm2 restart all后,此方法正常运行。

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

2 个答案:

答案 0 :(得分:4)

我认为您应该检查此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

希望它能提供更多帮助

答案 1 :(得分:1)

您无法确定NodeJS何时会崩溃,发生大型GC或因其他原因而眩晕。

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

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