Following a suggestion from Kloanor on a Hacker News article I got a WebFaction account to play around with node.js on.
tl;dr It’s not too hard to set up.
Getting Ready
All of this software will be installed in my home directory, so there are a few things we need to do. First, I created a sources directory so that I would have my hands on exact copies of the installed software in the future, as well as a clean place to unpack and build them.
[[email protected] ~]$ mkdir sources
[[email protected] ~]$
Second, we need to create two custom applications for MongoDB and node.js using the WebFaction control panel.
This is pretty easy, just go to “Domains/Websites > Applications > Add New“. Now give it a name (I used mongodb_master) and select “Custom app (listening on port)” as the App Type.
Hit create and write down the port number it provides. Do this again for node.js. You can also take a moment to map these applications to a website and domain.
MongoDB
MongoDB is actually supported to some extent, with install instructions provided in the WebFaction Doc’s. I did this slightly different, so I’ll detail my version here.
Acquiring MongoDB
You can get MongoDB at http://www.mongodb.org/display/DOCS/Downloads. You’ll need the 32-Bit Linux version. At the time of this writing the most current stable release was 1.4.3.
[[email protected] ~]$ cd sources
[[email protected] sources]$ wget http://downloads.mongodb.org/linux/mongodb-linux-i686-1.4.3.tgz
--2010-06-18 18:43:29-- http://downloads.mongodb.org/linux/mongodb-linux-i686-1.4.3.tgz
Resolving downloads.mongodb.org... 72.21.202.134
Connecting to downloads.mongodb.org|72.21.202.134|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 23709740 (23M) [application/x-tar]
Saving to: “mongodb-linux-i686-1.4.3.tgzâ€
100%[==============>] 23,709,740 202K/s in 1m 55s
2010-06-18 18:45:29 (201 KB/s) - “mongodb-linux-i686-1.4.3.tgz†saved [23709740/23709740]
[[email protected] sources]$
Installing MongoDB
MongoDB comes pre-compiled, so installing it is as easy as unpacking and moving some directories.
[[email protected] sources]$ tar -zxf mongodb-linux-i686-1.4.3.tgz
[[email protected] sources]$ cd mongodb-linux-i686-1.4.3/
[[email protected] mongodb-linux-i686-1.4.3]$ ls
bin GNU-AGPL-3.0 include lib README THIRD-PARTY-NOTICES
[[email protected] mongodb-linux-i686-1.4.3]$ mv bin ~/
[[email protected] mongodb-linux-i686-1.4.3]$ mv lib ~/
[[email protected] mongodb-linux-i686-1.4.3]$ mv include ~/
Configuring MongoDB
In this case, MongoDB is configured at run time. But it will need a data directory. I chose to put this at ~/var/mongo/master/. You don’t have to do anything special, just make sure the directory exists, and is empty.
That’s it! MongoDB is installed. We’ll come back and fire it up after we get node.js installed.
Installing node.js
node.js is almost as easy as MongoDB. And while not documented anywhere, it does run just fine. The major point of contact here is a forum topic that details how to get it running. Again, I’m going to deviate a bit, but I’ll end up in roughly the same place.
Acquiring node.js
You can get node.js at http://nodejs.org/#download. It’s distributed as source, so there is nothing to pick and choose from. At the time of this writing the most current version was 0.1.98.
[[email protected] ~]$ cd sources
[[email protected] sources]$ wget http://nodejs.org/dist/node-v0.1.98.tar.gz
--2010-06-18 18:57:14-- http://nodejs.org/dist/node-v0.1.98.tar.gz
Resolving nodejs.org... 97.107.132.72
Connecting to nodejs.org|97.107.132.72|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3770749 (3.6M) [application/octet-stream]
Saving to: “node-v0.1.98.tar.gzâ€
100%[===========>] 3,770,749 151K/s in 25s
2010-06-18 18:57:39 (147 KB/s) - “node-v0.1.98.tar.gz†saved [3770749/3770749]
[[email protected] sources]$
Easier done than said.
Installing node.js
You have to compile node.js, but this went perfectly clean for me. Just make sure you set the prefix when you configure, or you’ll have to do it all again.
[[email protected] sources]$ tar -zxf node-v0.1.98.tar.gz
[[email protected] sources]$ cd node-v0.1.98/
[[email protected] node-v0.1.98]$ ./configure --prefix=$HOME
Checking for program g++ or c++ : /usr/bin/g++
...snip...
Checking for fdatasync(2) with c++ : yes
'configure' finished successfully (5.495s)
[[email protected] node-v0.1.98]$ make
Waf: Entering directory `/home/littlef/sources/node-v0.1.98/build'
DEST_OS: linux
...snip...
Waf: Leaving directory `/home/littlef/sources/node-v0.1.98/build'
'build' finished successfully (5m33.731s)
[[email protected] node-v0.1.98]$ make install
Configuring node.js
Nothing to configure! It should be ready, like, right now.
Running Your New Software
Okay, everything is installed. Let’s get stuff running.
Running MongoDB
Running MongoDB should only take two options. --dbpath and --port.
Go ahead and fire it up, then shut it down with ctrl-c.
[[email protected] ~]$ mongod --dbpath ~/var/mongo/master/ --port 39381
Fri Jun 18 19:11:24 Mongo DB : starting : pid = 3293 port = 39361 dbpath = ~/var/mongo/master master = 0 slave = 0 32-bit
** NOTE: when using MongoDB 32 bit, you are limited to about 2 gigabytes of data
** see http://blog.mongodb.org/post/137788967/32-bit-limitations for more
Fri Jun 18 11:11:24 db version v1.2.2, pdfile version 4.5
Fri Jun 18 11:11:24 git version: nogitversion
Fri Jun 18 11:11:24 sys info: Linux biber 2.6.26-2-amd64 #1 SMP Thu Feb 11 00:59:32 UTC 2010 i686 BOOST_LIB_VERSION=1_40
Fri Jun 18 11:11:24 waiting for connections on port 39361
^CFri Jun 18 11:11:27 got kill or ctrl c signal 2 (Interrupt), will terminate after current cmd ends
Fri Jun 18 11:11:27 now exiting
Fri Jun 18 11:11:27 dbexit:
Fri Jun 18 11:11:27 shutdown: going to flush oplog...
Fri Jun 18 11:11:27 shutdown: going to close sockets...
Fri Jun 18 11:11:27 shutdown: waiting for fs...
Fri Jun 18 11:11:27 shutdown: closing all files...
Fri Jun 18 11:11:27 closeAllFiles() finished
Fri Jun 18 11:11:27 shutdown: removing fs lock...
Fri Jun 18 11:11:27 dbexit: really exiting now
[[email protected] ~]
That’s great, but we can’t just stay logged in to SSH all the time. Let’s nohup it, background it and forget about it.
[[email protected] ~]$ nohup mongod --dbpath ~/var/mongo/master/ --port 39381 &
[1] 3299
nohup: ignoring input and appending output to `nohup.out
[[email protected] ~]$
Now we can query it by setting the port on mongo
[[email protected] ~]$ mongo --port 39381 noderegator
MongoDB shell version: 1.2.2
url: noderegator
connecting to: 127.0.0.1:39381/noderegator
type "exit" to exit
type "help" for help
> show collections
> exit
bye
[[email protected] ~]$
Running node.js
Before we can actually run node.js, we need to write a little application. In my case this will go in ~/webapps/noderegator_nodejs/app.js. Place yours wherever you set up your custom application for node.
Be sure to change the port number to the one issued to your application by WebFaction.
var http = require( 'http' ),
sys = require( 'sys' );
http.createServer(
function( request, response ) {
sys.puts( 'Request!' );
response.writeHead( 200, { 'Content-Type': 'text/plain' } );
response.end( 'Hello World\n');
}
).listen( 35408 );
sys.puts( 'Server running on port 35408' );
Now let’s fire that up and see it in the browser. ctrl-c to quit.
[[email protected] ~]$ cd webapps/noderegator_nodejs/
[[email protected] noderegator_nodejs]$ node app.js
Server running on port 35408
Request!
Request!
^C
[[email protected] noderegator_nodejs]$
If you got an nginx 503 error when you tried to visit the site, check that your port numbers are set up correctly.
All Done
That’s it, that’s all you need to know. Enjoy MongoDB and node.js on WebFaction. I hope it all goes well for you.
Comments
MongoDB + node.js On WebFaction…
All of this software will be installed in my home directory, so there are a few things we need to do. First, I created a sources directory so that I would have my hands on exact copies of the installed software in the future, as well as a clean place t…
I have rather stupid question, how do you access your application from the web? I can’t find a place where I can bind specific application on web-faction to specific domain.
You need to map the App to a domain through the Webfaction control panel, then it should respond just fine. For testing I believe you can go straight to the port, but I’m no longer running this, so I can’t confirm.
nohup and backgrounding mongodb doesn’t completely help. As soon as the SSH shell is closed, the mongodb server dies. Any clues?
Looks like you now use the --fork option, so nohup and & are no longer needed.
MongoDB Docs: http://www.mongodb.org/display/DOCS/Starting+and+Stopping+Mongo#StartingandStoppingMongo-RunningasaDaemon
Hi,
Do you know how to connect to the Mongo database in the Node app.js file?
Also, why do you setup Node and Mongo under separate apps in your example.
I’ve setup both Mongo and Node under one app on my Webfaction account, and successfully connected to both Mongo and App.js separately through remote access. However, I can’t seem to connect to the database when I call the node app.js script.
Any ideas on this?