Friday, March 9, 2012

Railo, Tomcat and Apache on Amazon EC2 Ubuntu AMI

About this guide

This guide is long because I wanted to give some background info so you can not only install Railo on an Amazon Ubuntu AMI, but so that you understand why you are doing what you are doing.  If you want to see how easy this is, just skip from gray block to gray block below.  There are 13 actual commands to install Apache, Railo and Tomcat.  There are 7 lines of configuration to paste into two config files.  It doesn't get much easier.

Background on why I tried Railo in the cloud
So I've been very fortunate in my life to have been a ColdFusion developer, Ajax developer, Adobe trainer, digital media developer, Flex developer, product manager, project manager, task lead, agile trainer and Director in my short life, which has put me in the unique position to be contacted by start ups for advice on how to get going quickly using an Agile methodology.  The exciting part about this skill set is I get to help them plan their technology stack, development and deployment methods including Scrum, continuous integration, continuous builds, etc.

Now, one thing I am always sure to say is that ColdFusion should be a part of that technology stack.  See, I use ColdFusion differently than many of you.  I use it almost exclusively as a service tier.  I use Flex or HTML/Ajax for my interaction tier and ColdFusion only exists to proxy information and handle my business logic.  ColdFusion does an awesome job of this and with most start ups needing to get to minimum viable product quickly with low overhead, ColdFusion just makes sense.

Over the past 5 years I've had the luxury of working with one start up where money was no problem.  They had the best of everything from a custom data center to 5 rows of racks filled with servers and all the software and processing power we could ever need.  That has happened exactly ONE time.  Most of the start ups I have worked with are cash poor, but idea rich.  The idea that I can take ColdFusion and deploy it to the cloud with virtually no long term commitment is just plain awesome for them.  They can shut down the next day if they had to, or they could add another 10 servers in minutes.  With Amazon I helped take one company from $80k per month in data center costs down to $3k a month.  With savings like that a few Adobe ColdFusion Enterprise licenses were easy to sell.

Recently I have wanted to test Railo in the cloud as an alternative to Adobe ColdFusion for start ups, for no particular reason.  This guide is a result of that test.

Why Amazon
So I chose Amazon as my virtual host for 3 reasons:
  1. Price - can't be beat on processor time cost, and from what I remember, all incoming bandwidth is free.  This is especially important when you are working with digital media.
  2. Familiarity - I've always used Amazon.  The Amazon Management Console makes sense to me and I understand the pricing structure.
  3. Reach - They have data centers all over the place, and Amazon has always been very reliable.
 The fourth reason I could include is more for the start up themselves, but everyone is familiar with Amazon.  Its an easy sell.

Amazon EC2
I've found that Adobe ColdFusion runs great even on Amazon micro instances, depending on load and what sort of application you are running.  I usually will go with a small or large instance though for a service tier.  Amazon recently released medium instances, but I have not been able to test them yet.  For Railo I also deployed to a micro instance, mainly since this was a test.

I'm not going to go through the process of creating a new Amazon EC2 instance, but I will say that I deployed to Ubuntu 11.04 Natty Narwhal.  I am using the 64-bit version.  Your mileage may vary with other versions.

Deploying an instance takes about 5 minutes.  When done you can assign a security group or edit the default.  If this is for a public site you'll probably also want to add an elastic IP (which acts as a static IP for DNS). 

Get Ubuntu Up To Date
The first thing to do is to update Ubuntu
$ sudo apt-get update
$ sudo apt-get upgrade

Apache Installation
Next, we need to get Apache HTTP Server set up.  You technically don't need to use Apache HTTP as Apache Tomcat can serve the pages for you just fine.  I am using Apache HTTP server for familiarity and extensibility.
$ sudo apt-get install apache2

Get Railo
To install Railo I used the Tomcat/Railo installation from getrailo.org.  You may want to have more control over it than I wanted.  I did also deploy Tomcat6 on Ubuntu the one time and downloaded Railo and deployed it manually.  It wasn't hard, but the pre-rolled installer worked just great.  The commands below are for the current version of Railo (3.3.1) at the time of this writing.  I am also using the 64-bit version.  Just go to getrailo.org to grab the latest correct version for your OS.
# get the railo tomcat installer
$ wget http://www.getrailo.org/down.cfm?item=/railo/remote/download/3.3.1.000/tomcat/linux/railo-3.3.1.000-pl1-linux-x64-installer.run -O railo-3.3.1.000-pl1-linux-x64-installer.run
# make it executable
$ sudo chmod +x railo-3.3.1.000-pl1-linux-x64-installer.run
#run the installer
$ sudo ./railo-3.3.1.000-pl1-linux-x64-installer.run

The installer works great on Ubuntu.  All of the defaults should be fine.  The only things I changed were the user Railo was running under (I called it 'railo', the default is 'root' so I suggest you change it) and the default Tomcat port.  The text below is a snapshot of those settings:
Installation Directory [/opt/railo]:
Tomcat Administrator Username [admin]:
Tomcat Administrator Password []: ##########
Tomcat Port [8888]: ####
Tomcat System User [root]: railo
Yes, Start Railo at Boot Time [Y/n]: 
Install Apache Connector? [Y/n]: 
Please choose an option [1] : (Apache 2.2) 
Please choose an option [2] : (64-bit)
Apache Control Script Location [/etc/init.d/apache2]: 
Apache Modules Directory [/usr/lib/apache2/modules]: 
Apache Configuration File [/etc/apache2/apache2.conf]:
Apache Logs Directory [/var/log/apache2]:

Test Railo
Well, you now have Railo installed on Tomcat. Go test Railo by going to http://localhost:8080 and you will see the welcome page.  If you want to test remotely, be sure to add 8080 as an incoming TCP rule in your Amazon security group for the Railo instance.

Connect Railo to Apache
The hardest part for me was getting Railo to work with Apache.  There are lots of guides around, but none simple enough for me.  I'll paste the steps below in one place as that's what I had problems finding.  During installation Apache was configured for the Tomcat connection.  There are a few things we need to do yet.

First, you'll need a few mods to help proxy requests from Apache HTTP to Apache Tomcat.  It is my understanding that this does the same job as the Adobe ColdFusion connector does.  Some of these might already be enabled, but it won't hurt to try adding them.  In older versions of Apache HTTP these would be in your httpd.conf file as includes.  Now, the a2enmod command will symlink the modules from mods-enabled to mods-available.
# add the necessary mods for Apache HTTP Server
$ sudo a2enmod proxy
$ sudo a2enmod proxy_http
$ sudo a2enmod proxy_scgi
$ sudo a2enmod proxy_balancer

If you are familiar with older versions of Apache HTTP, you'll understand we need to create a virtual site.  This virtual site will allow us to define a server name and link it to a host in our Tomcat configuration.  Your virtual host might be more complex than the one below, specifying directory Aliases and custom logs, but what you see below is the minimum.  In older versions of Apache you would be putting these entries into extra/httpd-vhosts.conf which are included in httpd.conf.  That would work as well, but in the current version you create a file in the /etc/apache2/sites-available directory with the name of your site.  The file below, for nictunney.com, is found at /etc/apache2/sites-available/www.nictunney.com.
<VirtualHost *:80>
    ServerAdmin admin@nictunney.com
    DocumentRoot "/var/www"
    ServerName www.nictunney.com
</VirtualHost>

Next, you'll need to enable that site (creating a symlink from sites-enabled to sites-available).  In older versions of Apache you just include the httpd-vhosts file in the main httpd.conf.  In the newer version you use a2ensite.
$ sudo a2ensite www.nictunney.com

Configuring Tomcat
The next thing we have to do is tell Tomcat about the site.  This is done in the server.xml file.  If you are following my instructions this is located at /opt/railo/tomcat/conf/server.xml.  To configure Tomcat you need to add a Host entry.  This needs to be done inside the AJP connector definition (search for '8009' in server.xml).  Make sure to put this inside the Engine definition for Catalina.  I put mine directly under the Host definition for 'localhost'.  Note that the docBase directory matches the directory I defined in my Apache site configuration.  Put yours wherever, but make sure they match.
<Host name="www.nictunney.com" appBase="webapps">
      <Context path="" docBase="/var/www" />
</Host>

Finishing up
All that is left to do is restart Apache HTTP server and Apache Tomcat.
$ sudo service apache2 restart
$ sudo /opt/railo/railo_ctl restart

Caveat
I had fits at this point and was getting 500 errors.  Luckily I have Mark Drew on IM and he found my issue quickly.  Permissions were wacky on my webroot (/var/www) by default.  I had to change them to 766, changed the owner to the railo user and set the group to staff.  You might have differing opinions on how to secure your own web directory.

Initially I had some issues getting Railo up and running as Tomcat was new to me (I deployed to Tomcat), but I figured it was worth learning since Adobe ColdFusion is also coming on a version of Tomcat starting in ColdFusion 10.  The cool thing about deploying to the cloud is I was able to terminate my existing instance and reload from scratch in about 15 minutes.  I did this 4 times.  I love cloud deployment!

I had help
Much thanks goes to Mark Drew for taking them time to sort out my error, letting me see his config files and helping me determine what mods I needed in Apache HTTP server, and to the following folks on Twitter who helped me at various points along the way, being very patient with my Tomcat n00b-ness.  Several of them have tutorials and installation scripts as well, so please give them the proper nod and thanks, in order of appearance:
@talltroym
@azawaza
@gert_railo
@kwispel
@webRat
@bluewebtech
@mikehenke
@mpwoodward
@markdrew

12 comments:

  1. Thank you very much for this guide. I've spent hours researching the whole apache/tomcat/railo-connection stuff, and it simply didn't work until now!!!

    ReplyDelete
  2. Got thie error:

    type Exception report

    message

    description The server encountered an internal error () that prevented it from fulfilling this request.

    exception

    javax.servlet.ServletException: path [/var/www/WEB-INF/railo] is invalid
    railo.runtime.engine.CFMLEngineImpl.getConfigDirectory(CFMLEngineImpl.java:217)
    railo.runtime.engine.CFMLEngineImpl.loadJSPFactory(CFMLEngineImpl.java:169)
    railo.runtime.engine.CFMLEngineImpl.addServletConfig(CFMLEngineImpl.java:142)
    railo.loader.engine.CFMLEngineFactory.getInstance(CFMLEngineFactory.java:135)
    railo.loader.servlet.CFMLServlet.init(CFMLServlet.java:26)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307)
    java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    java.lang.Thread.run(Unknown Source)

    ReplyDelete
  3. Wondering if you could help. I have downloaded the latest beta of railo (I am trying to install it on Tomcat 7). However, when I try and execute the .run file for Railo, nothing happens. It just goes right back to the command prompts. No errors, no messages - nothing. I have made sure that its executable and I am sure that I have the correct files.

    Any thoughts?

    ReplyDelete
  4. Never mind, I found the problem. I had the 32 bit install. I am running 64 bit. Seemed like maybe an error message should have appeared??

    ReplyDelete
  5. SInce this is installed on a (remote) EC2 instance...how can I "test Railo by going to http://localhost:8080"? I'm a total *nix noob...

    ReplyDelete
  6. @heway10 You can use curl to test it, or if you define a rule to open port 8080 to the instance you can test by going to http://yourdomain.com:8080.

    ReplyDelete
  7. I'm getting the same error as Tropicalista.

    The installation seemed to go off beautifully, with no errors except for the "Could not reliably determine the server's fully qualified domain name" warning when restarting Apache.

    But trying to visit any CFM page in either the Apache webroot, or the railo/tomcat web-inf, results in the "path [/var/www/WEB-INF/railo] is invalid" error.

    Anyone have any ideas?

    ReplyDelete
  8. Thank you for taking time to post this.

    For people who are getting the "path [/var/www/WEB-INF/railo] is invalid" error -
    I think it has to do with the permission issue. Railo is not able to generate the WEB-INF folder in your web directory ( in the above example /var/www.) So try changing them using chmod command. I had the same issue and after changing the permission, I can now see WEB-INF folder in my /var/www directory.

    ReplyDelete
  9. Hi Nick,

    Would you be available to help with a config just as you outlined above? AWS/Railo/Tomcat/Apache

    Please, contact me a info@bloggingsparks.com if you are avaialble.

    Thanks,
    Roberto

    ReplyDelete
  10. valid reasons for choosing Amazon as your virtual host and its pretty much make sense on doing that, and yes you are lucky enought to have experience in different development too all the best for your future endeavours

    ReplyDelete