ExpressJS服务器每晚都会脱机 - 502 Bad Gateway

Mat*_*att 9 nginx node.js express reactjs

我有一个安装了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.

我完全坚持这一点,即使是最小的帮助也会受到极大的赞赏,即使它只是告诉我,我正在完全吠叫错误的树,需要寻找其他地方 - 谢谢.

And*_*lin 4

我认为你应该检查这个github 线程,它似乎可以帮助你。

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

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

更新的答案:

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

创建服务文件

sudo vim /lib/systemd/system/appname.service
Run Code Online (Sandbox Code Playgroud)

这是我自己用于随机 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
Run Code Online (Sandbox Code Playgroud)

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

使用systemd管理它

通过以下方式注册新服务:

sudo systemctl daemon-reload
Run Code Online (Sandbox Code Playgroud)

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

sudo systemctl start appname
Run Code Online (Sandbox Code Playgroud)

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

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

StandardOutput=syslog
StandardError=syslog
Run Code Online (Sandbox Code Playgroud)

希望对更多人有帮助