Node.js – Real Production Server Setup for Web Applications

node.jsproductionweb-applications

Being new to node js magic world, i'm wondering how does a web application's setup look like on a real production server?
So far all tutorials, create the js file that is started from a console…and that's it.
Anyone has created a real world web app that uses node js in the back end? Can you please describe how is it setup, and how reliable this infrastructure is ? I'm coming from the asp.net and php world that require heavy web servers…and can't have a clear idea about node stuff.

Best Answer

I work on a node.js web application that is not yet in production, but we do run a development server setup similarly to how I would setup production.

It's a Linux server (CentOS specifically, but any distro would do) with a service account dedicated for running the web app. Deployment is as simple as SCP'ing the tarball file up to the server and running:

$ npm stop <app name>
$ npm install ./<app name>-<version>.tgz
$ npm start <app name>

npm allows for life cycle scripts to be setup via package.json which is how npm stop and npm start are implemented. By default, npm start calls node server.js if there is a server.js in the top-level directory. You can define your own start script easily via package.json.

We use the daemon module when starting up via npm start in order to run the app in the background, totally disconnected, with output redirected to a log file. Starting directly via server.js, however, skips the daemon step so I have an interactive terminal in development.

Since we use npm for packaging and installation, the code ends up living under $HOME/node_modules/. And again, this runs under a dedicated user account, so I know exactly what modules are and are not available at runtime.

In order to leverage multiple CPU's, the server.js script will fork a worker (via the cluster module) for each CPU and monitor them for death. If a worker dies, the master process restarts it. There are modules out there to kick off your app and auto-restart if it dies, however, given that our master does no work except for baby sitting the workers, I don't bother watching the master. The game of "who watches the watchers" could go on infinitely.

When going to production, there are only three more elements to build out, which we have not done yet:

  1. Load balancing, which is not part of the app itself and has nothing to do with node.js
  2. An init script to start and stop the service when the server box is rebooted.
  3. When shutting down the service to install a new release, we need to remove it from the load balancer pool and then put it back in.
Related Topic