webconf nodejs-production-architecture
DESCRIPTION
TRANSCRIPT
node.jsproduction site architecture
Ben Lin
A full time entrepreneur & JavaScript lover
Fall in love with node.js on Jun 2011
twitter.com/dreamerslabgithub.com/dreamerslab
About me
About me
COKE - Full stack node.js MVC frameworkVodka - Functional testing frameworkThunder - The lightning fast template engine
https://github.com/dreamerslab
Agenda
1. Super brief intro to node.js
2. Run node as a service
3. What if it crashes?
4. Monit VS Forever
5. Nginx or not
6. Scaling node.js
7. Deployment
8. Cloud service
9. Some useful tips
10. Q & A
What is node?
node is an evented, non-blocking I/O server-side Javascript built on chrome V8
What is node?
http://www.youtube.com/watch?v=SAc0vQCC6UQ
Ryan Dahl talks about the history of node.js
What is node?
* node is fast
* node handles a lot of connection with very little resources
* You can develop your whole app with one language
* Easy to scale
But why node?
What is node?
Achieves this by all making network I/O nonblocking and all file I/O asynchronous.
What is node?
L1: 3 cyclesL2: 14 cyclesRAM: 250 cyclesDISK: 41,000,000 cycles NETWORK: 240,000,000 cycles
I/O latency
What is node?
What’s wrong with PHP, Ruby, Python, etc...?
Run node as a service
Run your node app as daemon with upstart
Run node as a service
# Start your appstart your_app_name
# Stop your appstop your_app_name
# Restart your apprestart your_app_name
What if it crashes?
Every little shit can fuck up your node app
Monitor your node app
Installation on Ubuntu$ sudo apt-get install monit
Edit configs * edit /etc/default/monit and set the "startup" variable to 1 * edit /etc/monit/monitrc and use the example file monitrc
Run$ sudo /etc/init.d/monit start$ sudo monit start your_app_name
Monit VS Forever
Monit VS Forever
With `forever` we kind of use an unstable tool to monitor another unstable project?!
Nginx or not?
* Nginx runs faster with serving static files* Use it as a reverse proxy to load balance with multiple nodes
Scaling node.js
Start small with built-in static server, node.js app & database all on the same server.
Scaling node.js
Use nginx as static server for better performance.
Scaling node.js
Use nginx as as proxy server as well to load balance requests.
The number of node.js app instance depends on how many CPU cores on the machine.
Scaling node.js
Split static files to different server for easier maintenance.
Scaling node.js
Use aws S3 for easier setup and maintenance.
Scaling node.js
Split database to another server. Make the node.js app server an unit.
Scaling node.js
Add a load balancer, add more app unit as the site scales up.
Scaling node.js
Add replica set if the database hits its limit.
Scaling node.js
Add CDN for static files for cross reign performance.
Scaling node.js
Split app to difference services as it scales up. Previous scaling steps apply to those services too.
Scaling node.js
Deployment
With ssh, git; The server must stop during deployment.
Deployment
With ssh, git; 0 downtime deployment is possible since we have more than 1 instance( repo ).
Deployment
With ssh, git; Split static file makes it easier to deploy with multi instance( repo ) app.
Deployment
Deploying with multi machine it’s better to use image files on aws ec2.
Deployment
Cloud service
Cloud service
How about using services like Heroku, Nodejitsu, mongoHQ?
Some useful tips
Some useful tips
Set your max file limit
sudo vi /etc/security/limits.conf# add the following 4 linesroot soft nofile 51200root hard nofile 51200* soft nofile 51200* hard nofile 51200
sudo vi /etc/pam.d/common-session# addsession required pam_limits.so
sudo vi /etc/profile# addulimit -SHn 51200
Some useful tips
This ensure that your node app never dies but use with care
process.on('uncaughtException', function (e) { console.dir(e);});
THE ENDThanks
QUESTIONS?