如何让 EC2 上的 Node.js 服务器永远运行?

Posted

技术标签:

【中文标题】如何让 EC2 上的 Node.js 服务器永远运行?【英文标题】:How do I leave Node.js server on EC2 running forever? 【发布时间】:2014-12-02 11:11:52 【问题描述】:

从我的问题可以看出,我是新手...

我建立了我的第一个网站,我设置了我的第一个 Node.js 服务器来为其提供服务,然后将所有内容推送到 EC2 上。

我在我的 EC2 IP 地址上测试了所有内容,一切似乎都正常。

到目前为止,我一直在本地测试我的应用程序,因此每当我关闭终端时,app.js 都会停止运行,因此不会在 localhost 上提供任何服务。

现在我的服务器在 EC2 上,每当我关闭终端时,都会发生同样的事情(“显然”有人可以说..)。

所以我的问题是我如何让我的 Node.js 服务器在 EC2 上运行......永远......这样我的网站才能保持活动......永远:)

我读过一些关于名为“永远”的节点模块的内容,但我想知道(作为新的和所有......)为什么这个“永远”功能不是 Node.js-EC2 系统的默认设置?

我的意思是,如果我错了,请纠正我,但设置 Web 服务器并推动它运行以使其永远保持运行不就是重点吗?这不是服务器应该做的事情(无限地监听请求)吗?如果是这样的话,为什么我们需要额外的模块/设置来实现呢?

感谢您的帮助。如您所知,我不仅在寻找解决方案,还在寻找解释,因为我真的很困惑.. :-)

编辑(您可能需要一些详细信息)- 在 EC2 上安装我的应用程序后,这些是我在终端上执行的步骤(顺便说一下,该应用程序在 Amazon Linux 上运行):

我在 ssh -i xxxxxxxxxxx.pem ec2-user@ec2-xx-xx-xx-x.eu-west-1.compute.amazonaws.com 上键入 终端

登录亚马逊机器后,我然后转到相关文件夹并执行 node app.js

机器中有3个文件夹:nodenode_modules*name of my app*

app.js 驻留在*name of my app*

之后,网站在我的 EC2 IP 上上线

关闭终端后,一切都关闭了

【问题讨论】:

这里的答案基本上已经过时/错误。您只需使用 pm2。 ***.com/a/36907953/294884 完美解释,很简单 Amazon EC2 NodeJS server stops itself after 2 days even after using sudo nohup的可能重复 【参考方案1】:

在调用 Node.js 之前,运行命令:

screen

这将创建一个持久的环境,允许您的进程在断开连接后继续运行。

当你重新连接时,你可以使用这个命令重新连接到那个环境:

screen -r

这里有一个随机链接,可以了解有关屏幕的更多信息:

http://www.rackaid.com/blog/linux-screen-tutorial-and-how-to/

但是,如果您的 EC2 实例重新启动,这将无济于事。有很多不同的方法可以做到这一点。将启动命令添加到 /etc/rc.local 是一种方法。这是亚马逊指南的链接,其中包括向 /etc/rc.local 添加一些内容。

http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/building-shared-amis.html

希望对你有帮助,

詹姆斯

【讨论】:

对于测试/开发目的,这就像 NodeJS Express 设置的魅力。很高兴我不必再打开我的 Putty 终端了!另一个注意事项 - 给新手(比如我自己)的提示:要在 screen 环境中关闭正在运行的进程,请按 CTRL+C 停止它(如果这不起作用,您可以需要找出进程ID或PID并通过从主环境运行的新Putty /终端将其杀死),最后键入exit关闭屏幕环境并返回主环境。 如果我想让多个东西保持运行,比如 mongodb 服务器、nodejs 服务器、react 服务器等,该怎么办?我相信 screen -r 只会将我带到以screen 启动的那个。我正在寻找类似screen myScreenOnescreen myScreenTwo 等的东西?我们可以这样做吗? 在生产环境中使用它安全吗?并且适合java应用吗? @User-8017771 不,不要在生产中使用。大多数发行版都有 systemd 可用。 @Matt 为什么我不应该在生产中使用它?我目前正在从我的节点 HTTP 服务器提供一个 React 应用程序。【参考方案2】:

我使用了一段时间的有效答案,但有时屏幕会无缘无故地结束,屏幕也没有平衡加载器和其他在生产环境中您应该关心的功能,目前我使用 npm 组件来完成这项工作.

https://www.npmjs.com/package/pm2

这很容易使用。

$ npm install pm2 -g

然后像这样使用 pm2 启动您的应用程序

$ pm2 start app.js

如果需要,您可以在上面的链接中找到要执行的不同任务。

希望对像我这样的新手有所帮助。

【讨论】:

我尝试了 pm2,但我的网站开始出现错误,所以我恢复到现在可以使用的“屏幕”解决方案。我会进一步调查,看看发生了什么。 这似乎是一个非常快速和简单的解决方案。为我工作。 感谢非常好用【参考方案3】:

有一个更好的方法。使用forever.js。

在这里查看:https://github.com/foreverjs/forever

这是一个关于如何在 CENTOS 上永远使用 chkconfig 的很好的教程。

http://aronduby.com/starting-node-forever-scripts-at-boot-w-centos/

【讨论】:

【参考方案4】:

或者使用 tmux 只需输入一个 tmux 屏幕运行节点服务器 Ctrl+b 点击 D 就完成了。

【讨论】:

【参考方案5】:

我加入线程很晚,似乎每个新手都存在基本问题。按照以下步骤正确设置您的第一台服务器。

执行 ec2 实例上的步骤(在执行此操作之前,请确保您的 package.json 文件中有 pm2 的启动脚本):

npm install pm2 -g

pm2 startup systemd

查看输出,在最后一行它必须像..

您必须以 root 身份运行此命令。执行以下命令: sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 启动 systemd -u sammy --hp /home/sammy

获取最后一行命令并以 root 权限再次运行。

(在运行下一个命令之前,在 package.json 文件中为 pm2 提供一个新的启动脚本,例如:"pm2-start": "pm2 start ./bin/www"

npm run pm2-start

更多信息请点击链接。

https://www.digitalocean.com/community/tutorials/how-to-set-up-a-node-js-application-for-production-on-ubuntu-16-04

【讨论】:

我将mpm 更改为npm。如果mpm 是故意的,请告诉我。我不认为这是一件事......(很高兴学习新事物!)

以上是关于如何让 EC2 上的 Node.js 服务器永远运行?的主要内容,如果未能解决你的问题,请参考以下文章

AWS EC2 与 AWS API Gateway 上的 Node.js RESTful API 服务器

从 Amazon AWS EC2 服务器上的 Node.js 连接到 Redis 服务器时出错

Amazon EC2 上 Node.js 的 CPU 利用率

无法使用 Node.js 和 AWS EC2 访问 mysql 服务器

如何在 AWS Lambda 中使用 Node.js 列出我的所有 Amazon EC2 实例?

Node.js - 在 Amazon EC2 上获取主机 IP 地址