在Webfaction上设置Node.js

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

介绍

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

安装Node.js

尽pipeNode.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(至less在我的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已安装。 通过validation成功

 > node -v v0.10.18 

那也安装了节点包pipe理器npm

 > npm -v 1.3.8 

永远安装

为了保持运行Node.js应用程序尽可能长时间运行并logging输出以进行维护,您需要Forever 。 为了方便起见,使用标志-g在全局(为你)安装。

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

你以后可以永远更新

 > npm update -g forever 

启动应用程序

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

其次,请记下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作为守护进程 。 Forever为你做了很多事情。 永远启动节点:

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

现在应用程序在注销后继续运行,并且,如果碰巧发生崩溃,很快就会重新启动。 这是很多,但还不够。 如果服务器重新启动会怎么样? 应用程序的输出在哪里? 如果脚本连续崩溃怎么办? 如果你有多个名字为index.js脚本呢? 继续阅读。

永远使用绝对path

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运行一次 forever stop index.js ,结果是两个应用程序都停止了。 发生这种情况是因为它们都具有相同的标识index.js

解决scheme是在指定脚本时使用绝对path。

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

并停止执行:

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

这确保只有预期的应用程序停止。 这种使用绝对path的习惯也对forever list产生积极影响。 详情请参阅此问题 。

logging

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

 -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/ ,似乎很方便。 随着参数,绝对path和子目录日志/命令成为如下:

 > 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 

检测和重新启动一个纺纱过程

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

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

如果旋转脚本崩溃,即脚本的正常运行时间小于--minUptime则永远等待--spinSleepTime重新启动脚本之前的毫秒数。 否则,脚本将尽快重新启动。 这可以防止资源占用循环。 看到这个答案进一步的讨论。

我个人使用5000 --minUptime来确保节点在声明为非旋转前完全启动。 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 

pipe理应用程序

随着指令的增长,记忆和写作变得越来越繁琐。 因此将它们复制到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规则来指定一个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的目录,并指定makefile的实际位置。 有关使用@reboot详细信息,请参阅此答案 。

结论

现在你有一个节点进程永远运行,至less只要有维护人员向服务器供电。 大量的事情,但也许会更多。 以后可能要做的事情,这里没有涉及的内容包括以下内容。

  • --watch文件更改并在检测到时自动重新启动(请参见forever --help --watch forever --help
  • 使用Grunt.js而不是Make(见bustardcelly / grunt-forever )
  • 偶尔反弹一下应用程序。

也可以看看

  • 在Webfaction上设置Redis

任何想法,意见或更正?

好吧,您可能已经按照其他答案中的所有步骤(哇!这样的细节!很好),但现在更容易了:他们现在有一个一键安装node.js的安装程序。