19

在Webfaction共享主机帐户上设置Node.js应用程序需要哪些步骤?

4

3 回答 3

56

介绍

以下指令的结果是一个持续运行的 Node.js 应用程序,即使在服务器计算机重新启动后也会生成日志文件并自行重新启动。这些说明特别针对Webfaction上的共享主机帐户,但也可用于一般目的。

安装 Node.js

尽管Node.js 下载页面提供了 Linux 二进制文件,但从源代码安装 Node.js 会更加健壮。下载最新的源代码并将它们解压缩到~/src/.

(log in to your webfaction console)
> mkdir -p ~/src/
> cd src/
> wget http://nodejs.org/dist/v0.10.18/node-v0.10.18.tar.gz
> tar -xzf node-v0.10.18.tar.gz

下一步是编译和安装代码。为此使用了 Python。因为默认python版本是 2.4(至少在我的 Webfaction 服务器 web223 上)并且因为 Node.js 安装需要 2.6+ 版本之一,所以您必须临时将较新的版本设置为默认版本。请参阅以下代码段(有关详细信息,另请参阅本文)。请注意--prefix=$HOME,由于 Webfaction 的环境限制,这是必需的(您只能访问您的主目录)。

> cd node-v0.10.18/
> alias python=python2.7
> python configure --prefix=$HOME
> make
> make install

安装了 Node.js。通过以下方式验证成功

> node -v
v0.10.18

那还安装了节点包管理器npm

> npm -v
1.3.8

永久安装

为了让 Node.js 应用程序尽可能长时间地运行并记录输出以进行维护,您需要Forever。为方便起见,请使用 flag 全局(为您)安装它-g

> cd ~
> npm install -g forever
> forever --version
v0.10.8

您以后可以通过以下方式永久更新

> npm update -g forever

启动应用程序

首先,通过Webfaction 控制面板创建一个自定义应用程序(自定义应用程序(监听端口))。将其命名为例如foonode。您还可以为应用程序创建域和网站。

其次,记下 Webfaction 为应用程序提供的套接字端口号。让示例为48888

第三,将您的应用程序代码复制到应用程序的目录,即~/webapps/foonode/. 之后,目录内容将如下所示。

> cd ~/webapps/foonode/
> ls
node_modules/
index.js

Index.js 类似于下面的代码片段。关键是使用应用程序的给定端口号。

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello Universe.\n');
}).listen(48888, '127.0.0.1');
console.log('Listening at http://127.0.0.1:48888/');

现在您可以通过node index.js. 但是有一个问题:当您退出 shell 时,应用程序也会退出。因此,您应该将 Node.js 作为daemon运行。这是 Forever 为您做了很多工作的地方。永远启动节点:

> cd ~/webapps/foonode/
> forever start index.js

现在,该应用程序在您注销后继续运行,并且作为一件非常好的事情,如果它发生崩溃,它会迅速重新启动。这很多,但仍然不够。如果服务器重启怎么办?应用程序的输出在哪里?如果脚本不断崩溃怎么办?如果您有多个同名的脚本index.js怎么办?继续阅读。

永远使用绝对路径

Forever 通过提供给forever start <filename_of_script>. 当您有多个应用程序具有相同的脚本文件名时,就会出现问题。

例如,假设您有两个应用程序/home/foouser/webapps/foonode/index.js/home/foouser/webapps/barnode/index.js. 如果您现在forever start index.js在应用程序的目录中启动这两个程序,然后forever stop index.js只运行一次,结果是两个应用程序都停止了。发生这种情况是因为他们都有相同的身份index.js

解决方案是在指定脚本时使用绝对文件路径。

> forever start /home/foouser/webapps/foonode/index.js

并停止执行:

> forever stop /home/foouser/webapps/foonode/index.js

这可确保仅停止预期的应用程序。这种使用绝对路径的习惯对forever list. 有关详细信息,请参阅此问题

日志记录

要将应用程序输出存储到某处,请指定以下参数。

-l <logfile>  = stream all output to this file. Relative to ~/.forever/
-o <logfile>  = stream script's stdout to this file. Relative to current dir.
-e <logfile>  = stream script's stderr to this file. Relative to current dir.
-a  = append to the files instead of overwriting them.

为日志设置一个子目录似乎很方便,例如logs/. 使用参数、绝对路径和子目录 logs/ 命令变为以下内容:

> cd ~/webapps/foonode/
> mkdir -p logs/
> forever start -a -l forever.log -o logs/out.log -e logs/err.log /home/foouser/webapps/foonode/index.js

检测并重新启动纺纱过程

Forever 有参数--minUptime--spinSleepTime目前没有很好的文档记录。参数的含义是控制脚本崩溃和重启后几乎立即再次崩溃的情况。由于永远尝试在崩溃后尽快重新启动脚本,这可能会导致繁忙的循环,这可能会占用服务器的大量资源。

--minUptime指定脚本必须在不崩溃的情况下立即重新启动并运行的毫秒数。如果崩溃脚本的正常运行时间小于 minUptime,则认为该脚本正在旋转,即有问题。如果正常运行时间更长,则脚本被认为是非旋转的

如果旋转脚本崩溃,即脚本的正常运行时间小于--minUptime然后永远等待--spinSleepTime毫秒数,然后重新启动脚本。否则脚本会尽快重新启动。这可以防止资源消耗循环。请参阅此答案以进行进一步讨论。

我个人使用 5000--minUptime来确保 Node 在声明它不旋转之前完全启动。2000--spinSleepTime可以避免循环,但在问题情况解决后仍试图快速启动脚本。

> forever start -a -l forever.log -o logs/out.log -e logs/err.log --minUptime=5000 --spinSleepTime=2000 /home/foouser/webapps/foonode/index.js

管理应用程序

随着命令的增长,记忆和编写它们变得越来越麻烦。因此,将它们复制到 Makefile 中很方便。当您需要指定在服务器重新启动后运行的命令时,makefile 也会变得很方便。

> cd ~/webapps/foonode/
> cat Makefile

foreverstart:
    # Run server forever (until reboot)
    mkdir -p logs
    forever start -a -l forever.log -o logs/out.log -e logs/err.log --minUptime 5000 --spinSleepTime 2000 /home/foouser/webapps/foonode/index.js

foreverstop:
    forever stop /home/foouser/webapps/foonode/index.js

保持应用程序运行

Forever 不涵盖服务器重新启动的情况。为此,您需要指定一个带有规则的 cronjob@reboot ,该规则在重新启动后永远启动。

> export EDITOR=nano   # Editor to use to edit crontab. A matter of taste.
> crontab -e

添加以下行并保存。

@reboot make -C ~/webapps/foonode/ -f ~/webapps/foonode/Makefile foreverstart

该行确保 foonode 在服务器重新启动后立即启动。该标志-C指定运行makefile 的目录和makefile-f的实际位置。有关使用的详细信息,请参阅此答案@reboot

结论

现在你有一个真正永远运行的节点进程,或者至少只要有维护人员为服务器供电。很多事情已经完成,但也许还会有更多。此处未涵盖的您将来可能想做的事情包括以下内容。

  • 监视文件更改并在检测到时自动重新启动(--watch参见forever --help
  • 使用 Grunt.js 代替 Make(参见bustardcelly/grunt-forever
  • 不时备份应用程序。

也可以看看

有什么想法、评论或更正吗?

于 2013-09-08T19:37:50.440 回答
6

好吧,您可能已经遵循了另一个答案中的所有步骤(哇!如此详细!太棒了),但现在变得容易多了:他们现在有一个 node.js 的一键式安装程序。

于 2013-11-06T13:25:51.840 回答
1

另一种选择是安装nvm(节点版本管理器)并输入:

nvm install node

它不仅对 Webfaction 有效。

于 2018-10-17T16:04:19.843 回答