52
Deploying with Phusion Passenger

AMS Node Meetup December presentation Phusion Passenger

Embed Size (px)

Citation preview

Page 1: AMS Node Meetup December presentation Phusion Passenger

Deploying with

Phusion Passenger

Page 2: AMS Node Meetup December presentation Phusion Passenger
Page 3: AMS Node Meetup December presentation Phusion Passenger
Page 4: AMS Node Meetup December presentation Phusion Passenger

Our Node.js app is done. How do we deploy to production?

Can’t be that hard. Let’s ask Google.

Page 5: AMS Node Meetup December presentation Phusion Passenger
Page 6: AMS Node Meetup December presentation Phusion Passenger

Make sure your app keeps running(restart on crash)

Step 1

forever  start  app.js

Page 7: AMS Node Meetup December presentation Phusion Passenger

Start your app on system boot

Step 2

systemd, SysV init,upstart, etc.

Page 8: AMS Node Meetup December presentation Phusion Passenger

#!/bin/bash  DIR=/var/www/YOUR_NODE_APP_GOES_HERE  PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin  NODE_PATH=/usr/local/lib/node_modules  NODE=/usr/local/bin/node      test  -­‐x  $NODE  ||  exit  0      function  start_app  {      NODE_ENV=production  nohup  "$NODE"  "$DIR/YOUR_APP_SERVER_FILE.js"  1>>  "$DIR/logs/YOUR_APP_NAME.log"  2>&1  &      echo  $!  >  "$DIR/pids/YOUR_APP.pid"  }      function  stop_app  {      kill  `cat  $DIR/pids/YOUR_APP.pid`  }      case  $1  in        start)              start_app  ;;          stop)              stop_app  ;;          restart)              stop_app              start_app              ;;          *)              echo  "usage:  YOUR_APP_NAME  {start|stop}"  ;;  esac  exit  0

Page 9: AMS Node Meetup December presentation Phusion Passenger

Reverse proxy from Nginx!

Step 3

• Serve files faster and better• Improves security: better

HTTP sanitizer!• Easier SSL configuration

Page 10: AMS Node Meetup December presentation Phusion Passenger

server  {          listen  0.0.0.0:80;          server_name  yourdomain.com  yourdomain;          root  /yourapp/public;  }

Page 11: AMS Node Meetup December presentation Phusion Passenger

server  {          listen  0.0.0.0:80;          server_name  yourdomain.com  yourdomain;          root  /yourapp/public;  

       location  ~*  \.(css|js|gif|jpe?g|png)$  {                  add_header  Pragma  public;                  add_header  Cache-­‐Control  "public,  must-­‐revalidate,  proxy-­‐revalidate";          }  }

Page 12: AMS Node Meetup December presentation Phusion Passenger

upstream  app_yourdomain  {          server  127.0.0.1:3000;  }  

server  {          listen  0.0.0.0:80;          server_name  yourdomain.com  yourdomain;          root  /yourapp/public;  

       location  ~*  \.(css|js|gif|jpe?g|png)$  {                  add_header  Pragma  public;                  add_header  Cache-­‐Control  "public,  must-­‐revalidate,  proxy-­‐revalidate";          }  

       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;  

           proxy_pass  http://app_yourdomain/;              proxy_redirect  off;          }  }

Page 13: AMS Node Meetup December presentation Phusion Passenger
Page 14: AMS Node Meetup December presentation Phusion Passenger

Multi-core!

Step 4

Cluster module

Page 15: AMS Node Meetup December presentation Phusion Passenger

var  cluster  =  require('cluster');  var  http  =  require('http');  var  numCPUs  =  require('os').cpus().length;  

if  (cluster.isMaster)  {      //  Fork  workers.      for  (var  i  =  0;  i  <  numCPUs;  i++)  {          cluster.fork();      }  

   cluster.on('exit',  function(worker,  code,  signal)  {          console.log('worker  '  +  worker.process.pid  +  '  died');      });  }  else  {      //  Workers  can  share  any  TCP  connection      //  In  this  case  its  a  HTTP  server      http.createServer(function(req,  res)  {          res.writeHead(200);          res.end("hello  world\n");      }).listen(8000);  }

Page 16: AMS Node Meetup December presentation Phusion Passenger
Page 17: AMS Node Meetup December presentation Phusion Passenger

How can we see application statistics? Uhhh.... sign up with

proprietary monitoring services?

Page 18: AMS Node Meetup December presentation Phusion Passenger

Configure forever

Configure init

Configure Nginx

Use Cluster module

Sign up for proprietary monitoring service

Page 19: AMS Node Meetup December presentation Phusion Passenger

Node.js≠

boilerplate

Page 20: AMS Node Meetup December presentation Phusion Passenger

Passenger: rethinking the workflow

Page 21: AMS Node Meetup December presentation Phusion Passenger

server  {          listen  0.0.0.0:80;          server_name  yourdomain.com;          root  /yourapp/public;  }

Page 22: AMS Node Meetup December presentation Phusion Passenger

server  {          listen  0.0.0.0:80;          server_name  yourdomain.com;          root  /yourapp/public;          deploy_my_damn_app  on;  }

Page 23: AMS Node Meetup December presentation Phusion Passenger

server  {          listen  0.0.0.0:80;          server_name  yourdomain.com;          root  /yourapp/public;          deploy_my_damn_app  on;  }

✓ Restarting on crash✓ Start during system

boot✓ Nginx reverse proxy✓ Multi-core

Page 24: AMS Node Meetup December presentation Phusion Passenger

server  {          listen  0.0.0.0:80;          server_name  yourdomain.com;          root  /yourapp/public;          deploy_my_damn_app  on;  }

✓ Restarting on crash✓ Start during system

boot✓ Nginx reverse proxy✓ Multi-core

bash$  show-­‐my-­‐app-­‐status

Page 25: AMS Node Meetup December presentation Phusion Passenger

server  {          listen  0.0.0.0:80;          server_name  yourdomain.com;          root  /yourapp/public;          deploy_my_damn_app  on;  

}

✓ Restarting on crash✓ Start during system

boot✓ Nginx reverse proxy✓ Multi-core

bash$  show-­‐my-­‐app-­‐status

       passenger_enabled  on;

bash$  passenger-­‐status

Page 26: AMS Node Meetup December presentation Phusion Passenger

#  passenger-­‐status  -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐  General  information  -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐  Max  pool  size  :  9  Processes          :  3  Requests  in  top-­‐level  queue  :  0  

-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐  Application  groups  -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐  /u/apps/bubbleconf/current#default:      App  root:  /u/apps/bubbleconf/current      Requests  in  queue:  0      *  PID:  25408      Sessions:  0              Processed:  4              Uptime:  4h  17m  2s          CPU:  0%            Memory    :  95M          Last  used:  34m  30s  a  

/u/apps/passenger_website/current#default:      App  root:  /u/apps/passenger_website/current      Requests  in  queue:  0      *  PID:  20696      Sessions:  0              Processed:  27291      Uptime:  6h  10m  0s          CPU:  8%            Memory    :  155M        Last  used:  0s  ago

Page 27: AMS Node Meetup December presentation Phusion Passenger

#  passenger-­‐config  system-­‐metrics  -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐  General  -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐  Kernel  version        :  3.14.1-­‐x86_64-­‐linode39  Uptime                        :  225d  15h  52m  20s  Load  averages          :  0.10%,  0.10%,  0.13%  Fork  rate                  :  0  

-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐  CPU  -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐  Number  of  CPUs        :        4  Average  CPU  usage  :    14%    -­‐-­‐    10%  user,      0%  nice,      4%  system,    86%  idle      CPU  1                      :      0%    -­‐-­‐      0%  user,      0%  nice,      0%  system,  100%  idle      CPU  2                      :    40%    -­‐-­‐    40%  user,      0%  nice,      0%  system,    60%  idle  I/O  pressure            :      0%      CPU  1                      :      0%      CPU  2                      :      0%  Interference  from  other  VMs:      0%      CPU  1                                        :      0%      CPU  2                                        :      0%  

-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐  Memory  -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐  RAM  total                  :      6008  MB  RAM  used                    :      1940  MB  (32%)  RAM  free                    :      4068  MB  Swap  total                :      1711  MB  Swap  used                  :        172  MB  (10%)  Swap  free                  :      1539  MB

Page 28: AMS Node Meetup December presentation Phusion Passenger

Nginx

Forever/PM2

Cluster

Init script

Monitoring software

Page 29: AMS Node Meetup December presentation Phusion Passenger

Lets you focus on what is

really important

Page 30: AMS Node Meetup December presentation Phusion Passenger

Keeps you

out of the dark

Page 31: AMS Node Meetup December presentation Phusion Passenger

Identify and solve

problems

Page 32: AMS Node Meetup December presentation Phusion Passenger

How it works

Easy to migrate to? Easy to setup?

Page 33: AMS Node Meetup December presentation Phusion Passenger
Page 34: AMS Node Meetup December presentation Phusion Passenger

$  brew  install  passenger  $  brew  install  nginx  —with-­‐passenger  …follow  instructions…

OS X

…add  our  APT  repo…  $  sudo  apt-­‐get  install  passenger  nginx-­‐extras

Debian/Ubuntu

Page 35: AMS Node Meetup December presentation Phusion Passenger

$  node  app.js  

$  passenger  start  \      —app-­‐type  node  —startup-­‐file  app.js

Standalone mode

Page 36: AMS Node Meetup December presentation Phusion Passenger

Nginx mode

server  {          listen  0.0.0.0:80;          server_name  yourdomain.com;          root  /yourapp/public;          passenger_enabled  on;  }

Page 37: AMS Node Meetup December presentation Phusion Passenger

Is it any good?

Is it stable?

Who uses it?

Page 38: AMS Node Meetup December presentation Phusion Passenger

6 years

Page 39: AMS Node Meetup December presentation Phusion Passenger
Page 40: AMS Node Meetup December presentation Phusion Passenger
Page 41: AMS Node Meetup December presentation Phusion Passenger
Page 42: AMS Node Meetup December presentation Phusion Passenger
Page 43: AMS Node Meetup December presentation Phusion Passenger

• Host multiple apps at once• Improve security with privilege separation• Dynamic worker management• etc…

Many more features not mentioned

Page 44: AMS Node Meetup December presentation Phusion Passenger
Page 45: AMS Node Meetup December presentation Phusion Passenger

• Zero-downtime rolling restarts• Error resistant deploys• Mass deployment• Resource control• Unstuck stuck apps• Memory limiting• Priority support

Paid offering

Page 46: AMS Node Meetup December presentation Phusion Passenger

The future

Page 47: AMS Node Meetup December presentation Phusion Passenger

Easily setup dev environmentwith one command

• Repeatable• Shareable

Page 48: AMS Node Meetup December presentation Phusion Passenger

Easily setup and push to productionwith one command

• Repeatable• Shareable

Page 49: AMS Node Meetup December presentation Phusion Passenger

Debugging

Page 50: AMS Node Meetup December presentation Phusion Passenger
Page 51: AMS Node Meetup December presentation Phusion Passenger
Page 52: AMS Node Meetup December presentation Phusion Passenger

www.phusionpassenger.com