在 Webfaction 上设置 Node.js
Posted
技术标签:
【中文标题】在 Webfaction 上设置 Node.js【英文标题】:Setting Up Node.js on Webfaction 【发布时间】:2013-09-12 07:54:03 【问题描述】:在Webfaction 共享主机帐户上设置Node.js 应用程序需要哪些步骤?
【问题讨论】:
只是给任何阅读者的注释。第二个答案有一个新的(更新的)解决方案,通过一键式安装程序。因此,暂时不要从最佳答案的步骤开始。向下滚动一些! 【参考方案1】:简介
以下指令的结果是 Node.js 应用程序持续运行,生成日志文件并在服务器计算机重新启动后自行重新启动。这些说明特别针对Webfaction 上的共享主机帐户,但也可用于一般用途。
安装 Node.js
尽管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
)
使用 Grunt.js 代替 Make(参见 bustardcelly/grunt-forever)
不时备份应用程序。
另见
Setting up Redis on Webfaction有什么想法、cmets 或更正吗?
【讨论】:
Webfaction (web510) 现在运行 Python 2.7.5。不再需要别名。【参考方案2】:好吧,您可能已经按照其他答案中的所有步骤进行操作(哇!如此详细!太棒了),但现在要容易得多:他们now 有一个 node.js 的一键式安装程序。
【讨论】:
是的,他们会这样做,但是如果应用程序崩溃,他们的一键安装程序似乎不会重新启动应用程序。不适合生产场景,但我猜 Akseli 从未真正指定过。 实际上,答案是:“他们现在有一个一键式安装程序”,这意味着您可以从他们的仪表板安装一个 node-js 应用程序,链接就是为了证明这一点:) 使用一键式安装程序,我遇到了永远运行的麻烦(我猜是路径变量的问题)...cd /home/myusername/webapps/myapp ./bin/forever server.js /usr/bin/env: node: No such file or directory
我尝试使用我的 Sails 应用程序执行此操作,但核心目录结构非常不同。这些模块位于 lib 文件夹中,并且没有 app.js。正如第一个答案所建议的那样,我将尝试在自定义应用程序中使用命令行来执行此操作。我总是对如何在本地处理我的应用程序感到困惑,然后推送到 webfaction(通过 bitbucket 或其他方式)。【参考方案3】:
另一个选项是安装nvm(节点版本管理器)并输入:
nvm install node
它不仅对 Webfaction 有效。
【讨论】:
以上是关于在 Webfaction 上设置 Node.js的主要内容,如果未能解决你的问题,请参考以下文章
django 中的 css 文件托管在 webfaction 上
对于 Django 开发的初学者来说,Google App Engine 是不是比 Webfaction 更好? [关闭]