【发布时间】:2013-09-12 07:54:03
【问题描述】:
在Webfaction 共享主机帐户上设置Node.js 应用程序需要哪些步骤?
【问题讨论】:
-
只是给任何阅读者的注释。第二个答案有一个新的(更新的)解决方案,通过一键式安装程序。因此,暂时不要从最佳答案的步骤开始。向下滚动一些!
标签: node.js web-applications installation webfaction
在Webfaction 共享主机帐户上设置Node.js 应用程序需要哪些步骤?
【问题讨论】:
标签: node.js web-applications installation webfaction
以下指令的结果是 Node.js 应用程序持续运行,生成日志文件并在服务器计算机重新启动后自行重新启动。这些说明特别针对Webfaction 上的共享主机帐户,但也可用于一般用途。
尽管Node.js download page 提供 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+ 版本之一,所以您必须临时将较新的版本设置为默认版本。请参阅以下 sn-p(有关详细信息,另请参阅 this article)。注意--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。为方便起见,请使用标志-g 全局(为您)安装它。
> cd ~
> npm install -g forever
> forever --version
v0.10.8
您以后可以通过以下方式永久更新
> npm update -g forever
首先,通过Webfaction Control Panel(自定义应用程序(监听端口))创建一个自定义应用程序。例如,将其命名为 foonode。您还可以为该应用创建域和网站。
其次,记下 Webfaction 为应用程序提供的套接字端口号。让示例为 48888。
第三,将您的应用程序代码复制到应用程序的目录,即~/webapps/foonode/。之后,目录内容将如下所示。
> cd ~/webapps/foonode/
> ls
node_modules/
index.js
Index.js 类似于下面的 sn-p。关键是使用应用程序的给定端口号。
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 时,应用程序也会退出。因此,您应该以 a daemon 运行 Node.js。这是 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 产生了积极影响。详情请见this issue。
要将应用程序输出存储到某处,请指定以下参数。
-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 毫秒数。否则脚本会尽快重新启动。这可以防止资源消耗循环。更多讨论请见this answer。
我个人将 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 不涵盖服务器重新启动的情况。为此,您需要指定 a 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 的目录,-f 指定makefile 的实际位置。见this answer for details about using @reboot。
现在你有一个真正永远运行的节点进程,或者至少只要有维护人员为服务器供电。很多事情已经完成,但也许还会有更多。此处未涵盖的您将来可能想做的事情包括以下内容。
forever --help 中的 --watch)另见
有什么想法、cmets 或更正吗?
【讨论】:
好吧,您可能已经按照其他答案中的所有步骤进行操作(哇!如此详细!太棒了),但现在要容易得多:他们now 有一个 node.js 的一键式安装程序。
【讨论】:
cd /home/myusername/webapps/myapp ./bin/forever server.js /usr/bin/env: node: No such file or directory
【讨论】: