ams node meetup december presentation phusion passenger
TRANSCRIPT
![Page 1: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/1.jpg)
Deploying with
Phusion Passenger
![Page 2: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/2.jpg)
![Page 3: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/3.jpg)
![Page 4: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/4.jpg)
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](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/5.jpg)
![Page 6: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/6.jpg)
Make sure your app keeps running(restart on crash)
Step 1
forever start app.js
![Page 7: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/7.jpg)
Start your app on system boot
Step 2
systemd, SysV init,upstart, etc.
![Page 8: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/8.jpg)
#!/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](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/9.jpg)
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](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/10.jpg)
server { listen 0.0.0.0:80; server_name yourdomain.com yourdomain; root /yourapp/public; }
![Page 11: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/11.jpg)
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](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/12.jpg)
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](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/13.jpg)
![Page 14: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/14.jpg)
Multi-core!
Step 4
Cluster module
![Page 15: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/15.jpg)
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](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/16.jpg)
![Page 17: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/17.jpg)
How can we see application statistics? Uhhh.... sign up with
proprietary monitoring services?
![Page 18: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/18.jpg)
Configure forever
Configure init
Configure Nginx
Use Cluster module
Sign up for proprietary monitoring service
![Page 19: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/19.jpg)
Node.js≠
boilerplate
![Page 20: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/20.jpg)
Passenger: rethinking the workflow
![Page 21: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/21.jpg)
server { listen 0.0.0.0:80; server_name yourdomain.com; root /yourapp/public; }
![Page 22: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/22.jpg)
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](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/23.jpg)
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](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/24.jpg)
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](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/25.jpg)
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](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/26.jpg)
# 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](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/27.jpg)
# 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](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/28.jpg)
Nginx
Forever/PM2
Cluster
Init script
Monitoring software
![Page 29: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/29.jpg)
Lets you focus on what is
really important
![Page 30: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/30.jpg)
Keeps you
out of the dark
![Page 31: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/31.jpg)
Identify and solve
problems
![Page 32: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/32.jpg)
How it works
Easy to migrate to? Easy to setup?
![Page 33: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/33.jpg)
![Page 34: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/34.jpg)
$ 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](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/35.jpg)
$ node app.js
$ passenger start \ —app-‐type node —startup-‐file app.js
Standalone mode
![Page 36: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/36.jpg)
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](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/37.jpg)
Is it any good?
Is it stable?
Who uses it?
![Page 38: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/38.jpg)
6 years
![Page 39: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/39.jpg)
![Page 40: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/40.jpg)
![Page 41: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/41.jpg)
![Page 42: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/42.jpg)
![Page 43: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/43.jpg)
• 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](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/44.jpg)
![Page 45: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/45.jpg)
• 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](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/46.jpg)
The future
![Page 47: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/47.jpg)
Easily setup dev environmentwith one command
• Repeatable• Shareable
![Page 48: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/48.jpg)
Easily setup and push to productionwith one command
• Repeatable• Shareable
![Page 49: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/49.jpg)
Debugging
![Page 50: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/50.jpg)
![Page 51: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/51.jpg)
![Page 52: AMS Node Meetup December presentation Phusion Passenger](https://reader037.vdocuments.net/reader037/viewer/2022110311/55ac80451a28aba3258b45f8/html5/thumbnails/52.jpg)
www.phusionpassenger.com