在一台Debian服务器上,我安装了Node.js。我知道如何用这个命令行从putty启动一个应用程序:

node /srv/www/MyUserAccount/server/server.js

并在地址50.51.52.53:8080 (IP和端口)上访问它。

但是当我一关闭putty,我就无法到达50.51.52.53:8080这个地址了。

如何让一个Node.js应用程序永久运行?

你可以猜到,我是Linux和Node.js的初学者。


当前回答

虽然其他答案解决了OP的问题,但它们都是多余的,并没有解释为什么他或她会遇到这个问题。

关键是这一行,“我关闭putty,然后我无法到达地址”

当您在Putty上登录到远程主机时,您已经启动了一个SSH linux进程,从该SSH会话输入的所有命令将作为该进程的子进程执行。

您的问题是,当您关闭Putty时,您正在退出SSH会话,这会杀死该进程和任何活动的子进程。当你关闭putty时,你无意中杀死了你的服务器,因为你在前台运行它。为了避免这种行为,在后台运行服务器,在你的命令后面加上&:

node /srv/www/MyUserAccount/server/server.js &

这里的问题是缺乏linux知识,而不是关于节点的问题。欲了解更多信息,请访问:http://linuxconfig.org/understanding-foreground-and-background-linux-processes

更新:

正如其他人所提到的,节点服务器在退出终端时仍然可能死亡。我遇到的一个常见的问题是,即使节点进程在bg中运行,它的stdout和stderr仍然指向终端。这意味着如果节点服务器写入console.log或console.log。错误,它将收到一个破裂的管道错误和崩溃。这可以通过管道输出你的进程来避免:

node /srv/www/MyUserAccount/server/server.js > stdout.txt 2> stderr.txt &

如果问题仍然存在,那么您应该考虑使用tmux或nohup之类的解决方案,它们仍然比特定于节点的解决方案更健壮,因为它们可以用于运行所有类型的进程(数据库、日志服务和其他语言)。

一个可能导致服务器退出的常见错误是在运行nohup节点your_path/server.js &后,简单地单击一下就关闭了Putty终端。您应该使用exit命令,然后您的节点服务器将启动并运行。

其他回答

不需要安装其他包。

执行此命令

node server.js > stdout.txt 2> stderr.txt &

server.js是你的服务器文件,也可以是api.js

之后,点击“退出”关闭终端

exit

以下是我在个人项目中使用的一个新贵解决方案:

将它放在/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次或更多,它将放弃重新生成应用程序的尝试。

正如我们所知,有很多选择可以做到这一点。这是一个纯Shell解决方案,不需要额外的程序/包。

如果server.js因为某些原因/错误崩溃,这个解决方案将重新启动server.js。

假设这是一个run.sh:

#!/usr/bin/env sh

while :; do
    node server.js

    echo "Restarting..."
    sleep 1
done

确保run.sh文件可执行:

chmod +x run.sh

要运行它:

./run.sh

如果你想在后台运行它:

./run.sh &

在后台超静音运行(分离,没有任何输出):

( ./run.sh > /dev/null 2>&1 & )

我建议寻找诸如Forever之类的东西来在崩溃时重新启动Node,并为您处理这个守护进程。

虽然其他答案解决了OP的问题,但它们都是多余的,并没有解释为什么他或她会遇到这个问题。

关键是这一行,“我关闭putty,然后我无法到达地址”

当您在Putty上登录到远程主机时,您已经启动了一个SSH linux进程,从该SSH会话输入的所有命令将作为该进程的子进程执行。

您的问题是,当您关闭Putty时,您正在退出SSH会话,这会杀死该进程和任何活动的子进程。当你关闭putty时,你无意中杀死了你的服务器,因为你在前台运行它。为了避免这种行为,在后台运行服务器,在你的命令后面加上&:

node /srv/www/MyUserAccount/server/server.js &

这里的问题是缺乏linux知识,而不是关于节点的问题。欲了解更多信息,请访问:http://linuxconfig.org/understanding-foreground-and-background-linux-processes

更新:

正如其他人所提到的,节点服务器在退出终端时仍然可能死亡。我遇到的一个常见的问题是,即使节点进程在bg中运行,它的stdout和stderr仍然指向终端。这意味着如果节点服务器写入console.log或console.log。错误,它将收到一个破裂的管道错误和崩溃。这可以通过管道输出你的进程来避免:

node /srv/www/MyUserAccount/server/server.js > stdout.txt 2> stderr.txt &

如果问题仍然存在,那么您应该考虑使用tmux或nohup之类的解决方案,它们仍然比特定于节点的解决方案更健壮,因为它们可以用于运行所有类型的进程(数据库、日志服务和其他语言)。

一个可能导致服务器退出的常见错误是在运行nohup节点your_path/server.js &后,简单地单击一下就关闭了Putty终端。您应该使用exit命令,然后您的节点服务器将启动并运行。