在Webfaction上设置Node.js.

Aks*_*lén 19 installation web-applications webfaction node.js

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

Aks*_*lén 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
Run Code Online (Sandbox Code Playgroud)

下一步是编译和安装代码.为此,使用了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
Run Code Online (Sandbox Code Playgroud)

已安装Node.js. 验证成功

> node -v
v0.10.18
Run Code Online (Sandbox Code Playgroud)

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

> npm -v
1.3.8
Run Code Online (Sandbox Code Playgroud)

永远安装

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

> cd ~
> npm install -g forever
> forever --version
v0.10.8
Run Code Online (Sandbox Code Playgroud)

您可以稍后更新

> npm update -g forever
Run Code Online (Sandbox Code Playgroud)

启动应用程序

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

其次,记下Webfaction为应用程序提供的套接字端口号.让这个例子是48888.

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

> cd ~/webapps/foonode/
> ls
node_modules/
index.js
Run Code Online (Sandbox Code Playgroud)

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/');
Run Code Online (Sandbox Code Playgroud)

现在你可以运行应用程序了node index.js.但是有一个问题:退出shell时,也会退出应用程序.因此,您应该将Node.js作为守护程序运行.这就是Forever为你做的很多事情.永远启动节点:

> cd ~/webapps/foonode/
> forever start index.js
Run Code Online (Sandbox Code Playgroud)

现在,应用程序在您注销后继续运行,并且作为一件非常好的事情,如果碰巧崩溃,将很快重新启动.这很多但仍然不够.如果服务器重新启动怎么办?应用程序的输出在哪里?如果脚本连续崩溃怎么办?如果您有多个带有名称的脚本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
Run Code Online (Sandbox Code Playgroud)

并停止执行:

> forever stop /home/foouser/webapps/foonode/index.js
Run Code Online (Sandbox Code Playgroud)

这可确保仅停止预期的应用程序.这种使用绝对路径的习惯也会产生积极的影响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.
Run Code Online (Sandbox Code Playgroud)

拥有日志的子目录似乎很方便,例如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
Run Code Online (Sandbox Code Playgroud)

检测并重新启动旋转过程

永远有参数--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
Run Code Online (Sandbox Code Playgroud)

管理应用程序

随着命令的增长,记忆和编写它们变得越来越麻烦.因此,将它们复制到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
Run Code Online (Sandbox Code Playgroud)

保持应用程序运行

Forever不包括服务器重新启动的情况.为此,您需要指定一个带有@reboot规则的cronjob,它可以在重新启动后立即启动.

> export EDITOR=nano   # Editor to use to edit crontab. A matter of taste.
> crontab -e
Run Code Online (Sandbox Code Playgroud)

添加以下行并保存.

@reboot make -C ~/webapps/foonode/ -f ~/webapps/foonode/Makefile foreverstart
Run Code Online (Sandbox Code Playgroud)

该行确保在服务器重新启动后立即启动foonode.该标志-C指定运行makefile的目录以及makefile -f的实际位置.见这个答案如何使用的详细信息@reboot.

结论

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

  • 看文件的更改和自动重启检测时(见--watchforever --help)
  • 使用Grunt.js代替Make(参见bustardcelly/grunt-forever)
  • 偶尔备份应用程序.

也可以看看

任何想法,评论或更正?


nat*_*vda 6

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