在Webfaction共享主机帐户上设置Node.js应用程序需要哪些步骤?
3 回答
介绍
以下指令的结果是一个持续运行的 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)
- 不时备份应用程序。
也可以看看
有什么想法、评论或更正吗?
好吧,您可能已经遵循了另一个答案中的所有步骤(哇!如此详细!太棒了),但现在变得容易多了:他们现在有一个 node.js 的一键式安装程序。