在Debian服务器上,我安装了Node.js。我了解如何使用以下命令行从腻子启动应用程序:
node /srv/www/MyUserAccount/server/server.js
并通过地址50.51.52.53:8080
(IP和端口)访问它。
但是,一旦我关闭腻子,那我就无法到达地址50.51.52.53:8080
了。
如何使Node.js应用程序永久运行?
您可以猜到,我是Linux和Node.js的初学者。
在Debian服务器上,我安装了Node.js。我了解如何使用以下命令行从腻子启动应用程序:
node /srv/www/MyUserAccount/server/server.js
并通过地址50.51.52.53:8080
(IP和端口)访问它。
但是,一旦我关闭腻子,那我就无法到达地址50.51.52.53:8080
了。
如何使Node.js应用程序永久运行?
您可以猜到,我是Linux和Node.js的初学者。
Answers:
尽管其他答案可以解决OP的问题,但它们都是过大的,不能解释为什么他或她遇到此问题。
关键是这一行,“我关闭油灰,然后我无法到达地址”
当您在Putty上登录到远程主机时,您已经启动了SSH linux进程,并且从该SSH会话键入的所有命令都将作为该进程的子进程执行。
您的问题是,当您关闭Putty时,您将退出SSH会话,该会话会终止该进程以及所有活动的子进程。当您关闭腻子时,您无意中杀死了您的服务器,因为它是在前台运行的。为避免此行为,请在命令后附加&来在后台运行服务器:
node /srv/www/MyUserAccount/server/server.js &
这里的问题是缺乏Linux知识,而不是有关节点的问题。有关更多信息,请查看: http //linuxconfig.org/understanding-foreground-and-background-linux-processes
更新:
正如其他人提到的那样,节点服务器在退出终端时可能仍然会死亡。我遇到的一个常见问题是,即使节点进程在bg中运行,它也是stdout,stderr仍然指向终端。这意味着,如果节点服务器写入console.log或console.error,它将收到中断的管道错误并崩溃。可以通过管道处理过程的输出来避免这种情况:
node /srv/www/MyUserAccount/server/server.js > stdout.txt 2> stderr.txt &
如果问题仍然存在,那么您应该研究诸如tmux或nohup 之类的东西,它们比特定于节点的解决方案还要健壮,因为它们可用于运行所有类型的进程(数据库,日志服务,其他语言)。
可能导致服务器退出的常见错误是,在运行服务器后,nohup node your_path/server.js &
您只需单击一下即可关闭Putty终端。您应该改用exit
command,然后节点服务器将启动并运行。
&
此操作时关闭Putty Session,则该服务仍会关闭。(刚刚在Debian Jesse上进行了测试)
nohup node /srv/www/MyUserAccount/server/server.js &
nohup node myApp.js &
在bg中运行了该应用程序,但是在关闭该术语时就死了。不知道为什么。
exit
命令退出终端。
您可以永久安装像这样使用npm:
sudo npm install -g forever
然后使用以下命令启动您的应用程序:
forever server.js
或作为服务:
forever start server.js
由于某种原因而崩溃或停止时,Forever将重新启动您的应用程序。要将重启限制为5次,可以使用:
forever -m5 server.js
列出所有正在运行的进程:
forever list
注意方括号中的整数,并按如下所示使用它来停止进程:
forever stop 0
重新启动正在运行的进程:
forever restart 0
如果您正在处理应用程序文件,则可以-w
在server.js
文件更改时使用参数自动重新启动:
forever -w server.js
forever start <file>
forever server.js
和之间有什么区别forever start server.js
?我知道它说这是“作为服务”,但这意味着什么?
forever server.js
,它将启动服务器。如果按Ctrl
+ C
,则它将停止服务。如果输入,forever start server.js
它将启动服务,即使我按Ctrl
+ 也会C
保持打开状态。然后,您可以执行上面其他引用的命令,以停止/查看列表。至少这是我所经历的。
forever
模块(v0.15.3)容易受到正则表达式拒绝服务攻击,因此不应使用:github.com/foreverjs/forever/issues/960
您可以使用PM2,它是带有内置负载均衡器的Node.js应用程序的生产过程管理器。
安装PM2
$ npm install pm2 -g
开始申请
$ pm2 start app.js
如果您使用Express,则可以像
pm2 start ./bin/www --name="app"
列出所有正在运行的进程:
$ pm2 list
它将列出所有过程。然后,您可以通过以下命令使用应用的ID或名称来停止/重新启动服务。
$ pm2 stop all
$ pm2 stop 0
$ pm2 restart all
显示日志
$ pm2 logs ['all'|app_name|app_id]
我建议您查找诸如Forever之类的东西,以在发生崩溃时重新启动Node,并为您进行守护进程处理。
nohup
,如果以此方式运行ssh会话,则节点将退出(除非您正在使用诸如screen来进行tmux的操作)。
nohup
。如果我们能解决这种混乱,那就太好了。但是我不知道从哪里开始。
nohup
。示例:nohup node app.js &
你可以简单地使用这个
nohup node /srv/www/MyUserAccount/server/server.js &
这将使应用程序保持运行状态,并关闭它,您必须将其杀死。
为此,您可以安装htop
然后搜索节点然后杀死它
exit
命令)。如果用户只是关闭窗口,则除了SIGHUP
结束该过程外,它可能还会使用其他信号,因此节点仍然会关闭。
killall node
,它将杀死所有节点进程,在我的情况下,只有一个。
永远是一个很好的NodeJs模块,可以做到这一点。
forever
通过在命令行中键入进行安装
$ npm install forever -g
然后使用以下命令运行node.js脚本
$ forever start /path/to/script.js
你已准备好出发。另外,您可以运行
$ forever list
查看所有正在运行的脚本。您可以通过键入以下命令终止任何特定的脚本
$ forever stop [pid]
[pid]
您将从list
命令中获得的脚本的进程ID 在哪里。要停止所有脚本,您可以输入
$ forever stopall
安装
$ [sudo] npm install forever -g
您可以永远使用它来连续运行脚本
forever start server.js
forever list
停止服务
forever stop server.js
这是我用于个人项目的新贵解决方案:
将其放在/etc/init/node_app_daemon.conf
:
description "Node.js Daemon"
author "Adam Eberlin"
stop on shutdown
respawn
respawn limit 3 15
script
export APP_HOME="/srv/www/MyUserAccount/server"
cd $APP_HOME
exec sudo -u user /usr/bin/node server.js
end script
这还将处理崩溃时重新生成应用程序的情况。如果在不到15秒的时间内崩溃了3次或更多次,它将放弃重新生成应用程序的尝试。
在开发期间,我建议使用nodemon。每当文件更改时,它将重新启动服务器。正如其他人指出的那样,Forever是一种选择,但在生产中,这完全取决于您使用的平台。您通常会希望使用操作系统推荐的保持服务正常运行的方式(例如http://www.freedesktop.org/wiki/Software/systemd/)。
nodemon
除非指定服务器JS文件,否则运行grunt命令,因此我正在使用它永久/同时运行mongo和node
我发现永远可以做得很好。
假设您已经安装了npm,如果没有,只需执行
sudo apt-get install npm
然后永久安装
npm install forever --global
现在您可以像这样运行它
forever start app.js
首先在全球安装pm2
npm install -g pm2
然后开始
pm2 start bin/www
另一种方法是为您的应用程序创建系统单元。在“ / etc / systemd / system”文件夹中创建一个“ XXX.service”文件,类似于:
[Unit]
Description=swagger
After=network.target
[Service]
ExecStart=/usr/bin/http-server /home/swagger/swagger-editor &
WorkingDirectory=/home/swagger
Restart=always
RestartSec=30
[Install]
WantedBy=multi-user.target
好处是该应用程序将作为服务运行,如果崩溃将自动重新启动。
您还可以使用sytemctl对其进行管理:
systemctl start XXX
启动服务,systemctl stop XXX
停止服务以及systemctl enable XXX
在系统启动时自动启动应用程序。
我建议使用PM2,它是Node.js应用程序的进程管理器。PM2提供了一种简单的方法来管理和守护应用程序(将它们作为服务运行)。
无需安装任何其他软件包。
运行此命令
node server.js > stdout.txt 2> stderr.txt &
server.js是您的服务器文件,也可以是api.js
在那之后点击“ 退出 ”以关闭终端
exit