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

•  Runs as a standalone server, listen its own
• 
• 

port
Just need to proxy the request to Node.js
and relay th...
Sample server with Compound.js

•  sudo npm install compound -g
•  compound init todo-list-app
•  cd todo-list-app && npm ...
Making Node.js run "forever"

•  Using Forever.js
•  Forever.js is a "daemonized version" of your
• 

Node app.
Will check...
Forever.js setup and commands

•  It's an npm package.
o 

sudo npm install forever -g

o 
o 
o 
o 

start
- Start SCRIPT ...
Let's try it!

•  Identify the script to run
o 
o 

Inspecting package.json is often a good idea
Example with compound.js
...
Ok, a bit more of Forever.js
(featuring up and inspecting)

•  How to keep the log
o 
o 

-l LOGFILE - Logs the forever ou...
Now, the cherry, "no downtime"

•  forever restart /full-path-to-script/script
•  If you're not sure about the script path...
Now we're all set, let's get serious

•  Nginx
o 

Awesome
Event-driven
Asynchronous
10k-friendly

o 

sudo apt-get instal...
Configure Nginx

•  Sites management
o 
o 
o 
o 
o 

Config files are best kept per-site
1 file per site in
§  /etc/nginx...
Let's configure our proxy

•  cd /etc/nginx/sites-available/
•  sudo view compoundapp.com
o 

(name it based on your FQDN ...
Architecture
• 
• 
• 

Traffic

Traffic goes through
the load balancer
nginx redirects to
the "upstream"
node_box
Want to ...
Configs: Load balancer
server {
# server_name yourdomain.com yourdomain; # set the domain name to bind to
access_log /var/...
Load balancing?
o 

o 

upstream node_boxes {
server 50.20.14.8:3000;
server 50.20.14.9:3001;
server 50.20.14.10:3002;
ser...
What's next?

•  WebSockets
•  Load balancing
•  What about the Databases/services?
•  Centralize your logs
•  Performance...
Resources
• 

http://stackoverflow.com/a/5015178/519649
o 

• 
• 

Config node.js as a proxy

https://github.com/nodejitsu...
About us
Author: Nicolas Embleton
Find me at: nicolas.embleton@gmail.com
Presentation made for “Javascript Ho Chi Minh Cit...
Upcoming SlideShare
Loading in...5
×

Nicolas-Embleton - Deploying node.js with forever and nginx

646

Published on

- JavaScript Project - deployment - nginx/forever.js/node.js
(by Nicolas Embleton, Co-founder, CTO, Data Field )
Learn the basics of a professional deployment with load balancing, "always on", and no downtime of your Node.JS project. Work with any Node.JS framework.

Published in: Technology
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
646
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
8
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

Nicolas-Embleton - Deploying node.js with forever and nginx

  1. 1. Deploying Node.js With Forever and Nginx “a no-downtime tale”
  2. 2. 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
  3. 3. 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 . • 
  4. 4. 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
  5. 5. Forever.js setup and commands •  It's an npm package. o  sudo npm install forever -g o  o  o  o  start - Start SCRIPT as a daemon stop - Stop the daemon SCRIPT stopall - Stop all running forever scripts restart - Restart the daemon SCRIPT •  Main commands o  restartall - Restart all running forever scripts o  list - List all running forever script
  6. 6. Let's try it! •  Identify the script to run o  o  Inspecting package.json is often a good idea 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
  7. 7. Ok, a bit more of Forever.js (featuring up and inspecting) •  How to keep the log o  o  -l LOGFILE - Logs the forever output to LOGFILE -o OUTFILE - Logs stdout from child script to OUTFILE o  -e ERRFILE - Logs stderr from child script to ERRFILE o  -p PATH •  Some other useful commands §  o  - Base path for all forever related files (pid files, etc.) To make your line shorter -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?)
  8. 8. Now, the cherry, "no downtime" •  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
  9. 9. Now we're all set, let's get serious •  Nginx o  Awesome Event-driven Asynchronous 10k-friendly o  sudo apt-get install nginx o  o  o  •  Not quite hard to setup (ubuntu)
  10. 10. Configure Nginx •  Sites management o  o  o  o  o  Config files are best kept per-site 1 file per site in §  /etc/nginx/sites-available/ (standard) To activate a site, make a symbolic link to §  /etc/nginx/sites-enabled/ Restart gracefully §  sudo service nginx reload Done.
  11. 11. 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 upstream node_boxes { server 127.0.0.1:3000; } Proxy Will be used as the relay o  • 
  12. 12. Architecture •  •  •  Traffic 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 Node.js box Node.js box Node.js box Node.js box
  13. 13. 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; } }
  14. 14. Load balancing? o  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; } sudo service nginx reload
  15. 15. What's next? •  WebSockets •  Load balancing •  What about the Databases/services? •  Centralize your logs •  Performance analysis •  Cloud
  16. 16. 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
  17. 17. About us Author: Nicolas Embleton Find me at: nicolas.embleton@gmail.com 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
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×