Specs:
Ubuntu Server 12.04.1 LTS 64-bit
Create a Ubuntu Server 12.04.1 LTS 64-bit t1.micro instance
If you don't know how to do so, read Amazon EC2 - Launching Ubuntu Server 12.04.1 LTS step by step guide.
Uncheck delete on termination for the EBS-root disc.
Create a Security Group called Node JS Production (or anything you want).
Add port 22, 80, 443, 3000 to the Security Group. (I am adding port 3000 because I run the app from port 3000)
Launch the instance.
In the AWS Management Console, Volumes -> Create Volume.
Make the volume with
- type = Standard
- Size = 20GB
- Availability Zone must match the EC2's Availability Zone
- make the drive name xvdf
Associate this EBS with the EC2 instance we just created.
ssh into your instance.
Ex. ssh -i {key} ubuntu@{ec2-address}.compute-1.amazonaws.comsudo apt-get update
We are going to format the xvdf with XFS file system. Refer to Amazon EC2 - Mounting a EBS drive.
Install NodeJS and other dependencies
sudo apt-get -y nodejs npm
If you run "node --version", you will find the node version is 0.6.12. We want to use 0.8.18, since it's a lot faster.
sudo npm install -g n
sudo n 0.8.18
Now "sudo node --version" will show version 0.8.18 while "node --version" will show 0.6.12
Install Git and fetch your code (Optional)
sudo apt-get install git -y
mkdir /vol/src
cd /vol/src
git config --global user.name "your_name"
git config --global user.email "your_email"
git config --global github.user "your_github_login"
git clone ssh://git@github.com/username/repo.git
You will want to establish a connection with Github using ssh rather than https because if you are building an image that can be used for auto-scaling you don't want to input the username and password every time. See Generating SSH Keys for more details.
Test your application by running
sudo node {your_app}
Making the NodeJS start on boot
To make a robust image, we want the NodeJS app to start on boot and respawn when crashed. We will write a simple service. All service scripts are located in /etc/init.
Let's create the file /etc/init/{your_app_name}_service.conf
sudo vi http://upstart.ubuntu.com/wiki/Stanzas
Put the following into the file:
#######################
#!upstart
description "my NodeJS server"
author "Some Dude"
# start on startup
start on started networking
stop on shutdown
# Automatically Respawn:
respawn
respawn limit 5 60
script
cd /vol/src/{your_app}
exec sudo node /vol/src/{your_app}/app.js >> /vol/log/app_`date +"%Y%m%d_%H%M%S"`.log 2>&1
end script
post-start script
# Optionally put a script here that will notifiy you node has (re)started
# /root/bin/hoptoad.sh "node.js has started!"
end script
#######################
Refer to upstart stanzas for more details about what each field mean.
Create the directory to store NodeJS outputs:
sudo mkdir /vol/log
I have marked each log file with the start time of the app. You will probably want to change this to create logs daily.
To check if the services are running:
initctl list | grep {your_app_name}_service.conf
To start a service:
sudo service {your_app_name}_service.conf start
To stop a service:
sudo service {your_app_name}_service.conf stop
Now reboot your EC2 instance in the AWS console.
Test if your site is started.
Create a NodeJS AMI
In the AWS Management Console, click instances at the left sidebar.
Right click on the Wordpress instance created above and click on Create Image.
Fill in the image name. I like to name things in a convention that is systematic. If you are planning to write deploy scripts and do auto-scaling, it is easier to identify what an image is. I use the following convention:
{namespace}_{what_is_it}_{date}
Ex. mycompany_blog_20130118
You will want the date because you may create an image every time you deploy new codes.
Leave the other options as default, and click on Create Image.
On the left sidebar, click on AMIs under Images.
You can see the status of the AMI we just created.
You should launch an instance from this AMI and test all the data is there.
No comments:
Post a Comment