Storm Chasing Tornado

I have been working on a project that requires a web server that can scale to tens of thousands of simultaneous connections. In my research I cam across Tornado an open source version of the scalable, non-blocking web server and tools that power FriendFeed.

One of the easiest ways to get started using Tornado is to use virtualization to install it on one of your favorite Unix like platforms. Let’s do a little storm chasing and get Tornado setup.

Here is the software we will be using in this article:

  1. Oracle VM Virtual Box
  2. Ubuntu Server 11.10 64-bit
  3. Tornado

We will be installing this on a MacBook Pro 2.4 GHz i5 with 8 GB running OS X Lion (10.7.3)

Ubuntu Server

We will be downloading the latest server version which at the time of writing is ubuntu-11.10-server-amd64.iso. We are going to save this iso to a folder in our home directory which for this article is ~/Projects/storm_chasing_tornado

http://www.ubuntu.com/start-download?distro=server&bits=64&release=latest

Virtual Box

Will will be grabbing the latest version which at the time of writing is VirtualBox-4.1.8-75467-OSX.dmg. We will also be saving this dmg to the same folder in our home directory and then running the installer.

http://download.virtualbox.org/virtualbox/4.1.8/VirtualBox-4.1.8-75467-OSX.dmg *

* Choose the right installer for your platform if you are not using a Mac, but why are you not using a Mac?

Virtual Machine

Now that we have VirtualBox installed we need to create a new virtual machine.

From the Virtual Box Manager we will select New icon.

This will launch the New Virtual Machine Wizard. Click Continue.

Next we will name our VM, let’s use Ubuntu Server 11.10. This will make it easy to identify if we decided to install other Ubuntu versions. Click Continue.

For memory will go with the default 512 MB which will be more than enough for our purposes. Click Continue.

Now it is time to create the hard disk. When we click on Continue it wil launch the virtual disk creation wizard.

Since we will not be using any other virtualization software we will go with the default VDI (VirtualBox Disk Image). Click Continue.

We will keep the default of dynamically allocated virtual disk so our Ubuntu instance will only use disk space as it is needed. Click Continue.

Let’s bump up the default disk size from 8 MB to 16 MB for a good initial disk size. Click Continue.

Our virtual disk is ready to be created. Click Create.

Here is the summary of our virtual machine that will created. Click Create.

Now that our Virtual Machine is setup we need to configure one more thing before we install Ubuntu. To be able to access our Virtual Machine from our host OS we need configure the VM VirtualBox Network Adapter to use a Bridged adapter. From the main Virtual Box Manager click on the Network link then select the Network tab.

We are going to change “Attached to” from NAT to Bridged Adapter. Click Ok.

Installing Ubuntu Server

Excellent our Virtual Machine is installed and configured now let’s get Ubuntu installed. From the VirtualBox Manager we will click on the Start button.

This will launch the First Run Wizard. Click Continue.

Now we will select the ubuntu-11.10-server-amd64.iso that we downloaded earlier to ~/Projects/storm_chasing_tornado then click Continue.

With the media selected we can now click Start.

The next steps are the same regardless if installing Ubuntu Server on a VM or to bare metal: Installing Ubuntu Server Oneiric Ocelot.

Local Access

Now that we have Ubuntu Server installed we are going to login directly to our VM within VirtualBox.

Ubuntu 11.10 webserver tty1

webserver login: carlos
Password:
Welcome to Ubuntu 11.10 (GNU/Linux 3.0.0-12-server x86_64)

 * Documentation:  https://help.ubuntu.com/11.10/serverguide/C

  System information as of Sat Feb 18 22:20:31 MST 2012

  System load:  0.03              Processes:           59
  Usage of /:   6.8% of 15.00GB   Users logged in:     1
  Memory usage: 24%               IP address for eth0: 192.168.0.15
  Swap usage:   0%

  Graph this data and manage this system at https://landscape.canonical.com/
Last login: Sat Feb 18 18:46:05 2012
carlos@webserver:~$ 

To make things simpler we are going to install open ssh on our server which will allow us to SSH from our host OS just like if we were accessing a real remote server.


carlos@webserver:~$ sudo apt-get install openssh-server
...

Before we logout of our VM we just need to find out the IP address of this server by using the command ifconfig

carlos@webserver:~$ ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:27:bd:69:30  
          inet addr:192.168.0.15  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:febd:6930/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8641 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2465 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:11582133 (11.5 MB)  TX bytes:183986 (183.9 KB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)


carlos@webserver:~$ logout

...

webserver login:

Remote Server Access

Now that we have our VM server all setup we can now do everything locally from our host OS terminal. We just need to open a terminal window and SSH to our Ubuntu Server VM.

ssh carlos@192.168.0.15
The authenticity of host '192.168.0.15 (192.168.0.15)' can't be established.
RSA key fingerprint is 78:9f:c8:f2:23:5c:36:d3:9d:2c:2e:c3:c3:63:af:3c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.15' (RSA) to the list of known hosts.
carlos@192.168.0.15's password: 
Welcome to Ubuntu 11.10 (GNU/Linux 3.0.0-12-server x86_64)

 * Documentation:  https://help.ubuntu.com/11.10/serverguide/C

  System information as of Sat Feb 18 22:20:31 MST 2012

  System load:  0.03              Processes:           59
  Usage of /:   6.8% of 15.00GB   Users logged in:     1
  Memory usage: 24%               IP address for eth0: 192.168.0.15
  Swap usage:   0%

  Graph this data and manage this system at https://landscape.canonical.com/
Last login: Sat Feb 18 18:46:05 2012
carlos@webserver:~$ 

Getting Tornado

Since we are going to use the development version of Tornado from GitHub we need to install Git on our server and then clone the Tornado repository


carlos@webserver: ~$ sudo apt-get install git
carlos@webserver: ~$ git clone https://github.com/facebook/tornado.git
carlos@webserver: ~$ cd ./tornado/

Building Tornado


carlos@webserver:~/tornado$ python setup.py build
carlos@webserver:~/tornado$ sudo python setup.py install

Storm Chasing

To ensure that everything is working we are going to create a simple test app.


carlos@webserver:~/tornado$ cd
carlos@webserver: ~$ sudo nano chasing_tornado.py
...

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("""<h2>Storm Chasing Tornado...</h2>
                      <pre>                       
                         ***********
                          *********
                           *******
                            *****
                             ***
                              **
                               *
                              
                       </pre>
                
                  """)                    

application = tornado.web.Application([
    (r"/", MainHandler),
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

Running Tornado

We will now start up Tornado to serve our application.

$ python chasing_tornado.py

Using the IP address of our VM, we just need to open a browser window

http://192.168.0.15:8888/

Now that we have our basic web server setup with Tornado we can start building more interesting applications..

One thought on “Storm Chasing Tornado

Leave a comment