Node.js + Node-Foreman
Node Foreman is a Node.js version of the popular Foreman tool, with a few Node specific changes.
Install && Setup
First of all, we need to install globally:
$ npm install -g foreman
Go to the root of your application and create a file with name of Procfile
:
web: node app.js
worker: node workers/checkmail.js
dev: node-supervisor app.js
profile: node --prof app.js
What we did? The Procfile
define applications or server processes. Now we defined a web
that run the main web application, a worker
to run a worker process, a dev
to run our web application with node-supervisor
(if a file changed node restart itself) and a profile
to run the Node.js profiler on our web application.
Run
Why is it good for us? If you want to host you app on Heroku then you need this Procfile
because Heroku uses the same method to run it. Now we can start our app with Node Foreman (of course you can use the original Foreman). So start our web
process with one thread:
$ nf start web=1
If you want to run it with more thread to test concurrency you can change the number after the equal sign:
$ nf start web=5
If you want to run multiple process then just list process identifiers:
$ nf start web=3 worker=5
Environments
A bit (ok, not a little) annoying when your password appears in the git repository. I really hate to see build-in database connection details or username/password pairs. We can use environment variables to tell these information to our app. Foreman and Node Foreman can handle a specified file with name of .env
. We can describe env variables to our app like database access information.
NODE_ENV=development
MYSQL_HOST=localhost
MYSQL_DATABASE=Database Name
MYSQL_USER=MySQL Username
MYSQL_PASSWORD=MySQL Password
MONGO_URL=mongodb://localhost/indexer
REDIS_URL=redis://rediscloud:password@host:port
Now when we run our app with nf start web=1
then the app can reach these variables with process.env.VARIABLE_NAME
. So we can turn on logging in development mode or turn off in production mode with process.env.NODE_ENV
. Foreman define a PORT variable so you need to change the listen port in your code to process.env.PORT || 3000
. Add this file into your .gitignore
and create a new one on production servers. Each workstation has its own configuration.
If you like (as me), you can use json format in your .env
file:
{
"node": {
"env": "development"
},
"mysql": {
"host": "localhost",
"database": "Database Name",
"user": "MySQL Username",
"password": "MySQL Password",
},
"mongo": {
"url": "mongodb://localhost/indexer"
},
"redis": {
"url": "redis://rediscloud:password@host:port"
}
}