在Node.js共享主机帐户上设置Webfaction申请所需的步骤是什么?
答案 0 :(得分:55)
以下说明的结果是一个连续运行的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+,所以必须临时将较新的版本设置为默认版本。请参阅以下代码段(有关详细信息,另请参阅this article)。请注意由于Webfaction的环境限制而需要的--prefix=$HOME
(您只能访问您的主目录)。
> 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就像下面的代码片段。关键点是使用应用程序的给定端口号。
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作为a 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
也有积极的影响。有关详细信息,请参阅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在声明非旋转之前完全启动。对于--spinSleepTime
来说,2000是一个很好的避免循环,但在问题情况解决后仍然试图快速启动脚本。
> 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
永远不包括服务器重新启动的情况。为此,您需要使用@reboot
规则指定a cronjob,以便在重新启动后永久启动。
> 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
。
现在你有一个节点进程真正永远运行,或者至少只要有维护人员给服务器供电。很多事情已经完成,但可能还会有更多。您可能希望将来做的事情包括以下内容:
--watch
中的forever --help
)另见
任何想法,评论或更正?
答案 1 :(得分:6)
好吧,你可能已经按照了另一个答案中的所有步骤(哇!这么详细!很棒),但它现在变得容易多了:他们now有一个node.js的单击安装程序。
答案 2 :(得分:1)