17
Deploying Node.js With Forever and Nginx “a no-downtime tale”

[Js hcm] Deploying node.js with Forever.js and nginx

Embed Size (px)

DESCRIPTION

You have a project in Node.js and you wonder how to make it run on your server? A real "production" server? You have some application and you want to ensure that it will run - without downtime, that you can easily update - without downtime, and that you can scale it over multiple webservices as a load Balancing? We will cover that by using: - Nginx - Forever.js - Node.js

Citation preview

Page 1: [Js hcm] Deploying node.js with Forever.js and nginx

Deploying Node.js With Forever and Nginx

“a no-downtime tale”

Page 2: [Js hcm] Deploying node.js with Forever.js and nginx

Node.js •  Runs as a standalone server, listen its own

port •  Just need to proxy the request to Node.js

and relay the result back •  Installing is easy (let's try in MacOS/Ubuntu)

o  sudo apt-get update sudo apt-get install python-software-properties python g++ make sudo add-apt-repository ppa:chris-lea/node.js sudo apt-get update sudo apt-get install nodejs

Page 3: [Js hcm] Deploying node.js with Forever.js and nginx

Sample server with Compound.js •  sudo npm install compound -g •  compound init todo-list-app •  cd todo-list-app && npm install How to start the project: •  node .

Page 4: [Js hcm] Deploying node.js with Forever.js and nginx

Making Node.js run "forever" •  Using Forever.js •  Forever.js is a "daemonized version" of your

Node app. •  Will check if the app is killed and re-spawn it

Page 5: [Js hcm] Deploying node.js with Forever.js and nginx

Forever.js setup and commands •  It's an npm package.

o  sudo npm install forever -g

•  Main commands o  start - Start SCRIPT as a daemon o  stop - Stop the daemon SCRIPT o  stopall - Stop all running forever scripts o  restart - Restart the daemon SCRIPT o  restartall - Restart all running forever scripts o  list - List all running forever script

Page 6: [Js hcm] Deploying node.js with Forever.js and nginx

Let's try it! •  Identify the script to run

o  Inspecting package.json is often a good idea o  Example with compound.js

§  , "main": "server.js"

o  Command: "node ." loads package.json, finds "main" script and executes it.

•  Run on Forever: o  forever start /full-path-to-script/server.js

Page 7: [Js hcm] Deploying node.js with Forever.js and nginx

Ok, a bit more of Forever.js (featuring up and inspecting)

•  How to keep the log o  -l LOGFILE - Logs the forever output to LOGFILE o  -o OUTFILE - Logs stdout from child script to OUTFILE o  -e ERRFILE - Logs stderr from child script to ERRFILE

•  Some other useful commands o  -p PATH - Base path for all forever related files (pid files, etc.)

§  To make your line shorter o  -c COMMAND - COMMAND to execute (defaults to node)

§  For when you have "more" than just "node" to run (server init params for example)

•  List running processes o  forever list (easy, right?)

Page 8: [Js hcm] Deploying node.js with Forever.js and nginx

•  forever restart /full-path-to-script/script •  If you're not sure about the script path, just

do "forever list" and take it up from there

Now, the cherry, "no downtime"

Page 9: [Js hcm] Deploying node.js with Forever.js and nginx

Now we're all set, let's get serious •  Nginx

o  Awesome o  Event-driven o  Asynchronous o  10k-friendly

•  Not quite hard to setup (ubuntu) o  sudo apt-get install nginx

Page 10: [Js hcm] Deploying node.js with Forever.js and nginx

Configure Nginx •  Sites management

o  Config files are best kept per-site o  1 file per site in

§  /etc/nginx/sites-available/ (standard) o  To activate a site, make a symbolic link to

§  /etc/nginx/sites-enabled/ o  Restart gracefully

§  sudo service nginx reload o  Done.

Page 11: [Js hcm] Deploying node.js with Forever.js and nginx

Let's configure our proxy •  cd /etc/nginx/sites-available/ •  sudo view compoundapp.com

o  (name it based on your FQDN as a best practice)

•  Create a proxy block o  upstream node_boxes {

server 127.0.0.1:3000; }

•  Proxy Will be used as the relay

Page 12: [Js hcm] Deploying node.js with Forever.js and nginx

Architecture •  Traffic goes through

the load balancer •  nginx redirects to

the "upstream" node_box

•  Want to scale? Just

add more boxes and update nginx config.

nginx load balancer

Traffic

Node.js box Node.js box Node.js box Node.js box

Page 13: [Js hcm] Deploying node.js with Forever.js and nginx

Configs: Load balancer server {

# server_name yourdomain.com yourdomain; # set the domain name to bind to access_log /var/log/nginx/compountapp.com_access.log; error_log /var/log/nginx/compountapp.com_error.log; # reroute all and pass the correct headers location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true;

# then proxy the request proxy_pass http://node_boxes/; proxy_redirect off; }

}

Page 14: [Js hcm] Deploying node.js with Forever.js and nginx

Load balancing? o  upstream node_boxes {

server 50.20.14.8:3000; server 50.20.14.9:3001; server 50.20.14.10:3002; server 50.20.14.11:3000;

} o  sudo service nginx reload

Page 15: [Js hcm] Deploying node.js with Forever.js and nginx

What's next? •  WebSockets •  Load balancing •  What about the Databases/services? •  Centralize your logs •  Performance analysis •  Cloud

Page 16: [Js hcm] Deploying node.js with Forever.js and nginx

Resources •  http://stackoverflow.com/a/5015178/519649

o  Config node.js as a proxy

•  https://github.com/nodejitsu/forever

•  https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager o  Install Node.js via package manager

Page 17: [Js hcm] Deploying node.js with Forever.js and nginx

About us Author: Nicolas Embleton Find me at: [email protected] Presentation made for “Javascript Ho Chi Minh City” meetup group You can find us at: •  http://meetup.com/JavaScript-Ho-Chi-Minh-City/ •  https://www.facebook.com/JavaScriptHCMC •  https://plus.google.com/communities/116105314977285194967