I have created a web application on Play 2.0 framework, in Scala. To deploy it, I looked at various cloud options - Amazon looks the best because, well its free :-)  Once the instance was created, it already had Java 6, I installed Apache HTTPD and Tomcat 7.

Lets first add some swap space

sudo -i
dd if=/dev/zero of=/swapfile bs=1024 count=524288
mkswap /swapfile
swapon /swapfile

Now edit /etc/fstab and append the following line to it:

/swapfile swap swap defaults 0 0

Ok, lets install tomcat and httpd now.

yum -y install httpd
mkdir -p /var/www/html/assets
mkdir -p /usr/share/tomcat7
cd /usr/share/tomcat7
wget http://apache.mirrors.timporter.net/tomcat/tomcat-7/v7.0.27/bin/apache-tomcat-7.0.27.tar.gz
gzip -d apache-tomcat-7.0.27.tar.gz tar xvf apache-tomcat-7.0.27.tar
mkdir -p /var/log/tomcat7 /var/cache/tomcat7/temp /var/lib/tomcat7/webapps /var/cache/tomcat7/work
rm -rf logs temp webapps work
ln -s logs /var/log/tomcat7
ln -s webapps /var/lib/tomcat7/webapps
ln -s work /var/cache/tomcat7/work
ln -s temp /var/cache/tomcat7/temp
useradd -d /usr/share/tomcat7 tomcatusr
chown -R tomcatusr /var/log/tomcat7
chown -R tomcatusr /var/cache/tomcat7/
chown -R tomcatusr /var/lib/tomcat7
chown -R tomcatusr /usr/share/tomcat7

Now open the server.xml (inside /usr/share/tomcat7/conf) and comment out the connector for port 8080

	 <!-- Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" / --> 

Look for 8009 (AJP connector) and modify it to:

	<Connector port="8009" enableLookups="false" redirectPort="8443" protocol="AJP/1.3" URIEncoding="UTF-8" />

Now create a start up script under /etc/init.d and call it tomcat7:

	#!/bin/bash

	# Tomcat7: Start/Stop Tomcat 7
	#
	# chkconfig: - 90 10
	# description: Tomcat is a Java application Server.

	. /etc/init.d/functions
	. /etc/sysconfig/network

	CATALINA_HOME=/usr/share/tomcat7
	TOMCAT_USER=tomcatusr
	LOCKFILE=/var/lock/subsys/tomcat

	RETVAL=0
	start(){
	 echo "Starting Tomcat7: "
	 su - $TOMCAT_USER -c "$CATALINA_HOME/bin/startup.sh"
	 RETVAL=$?
	 echo
	 [ $RETVAL -eq 0 ] && touch $LOCKFILE
	 return $RETVAL
	}

	stop(){
	 echo "Shutting down Tomcat7: "
	 $CATALINA_HOME/bin/shutdown.sh
	 RETVAL=$?
	 echo
	 [ $RETVAL -eq 0 ] && rm -f $LOCKFILE
	 return $RETVAL
	}

	case "$1" in
	 start)
	 start
	 ;;
	 stop)
	 stop
	 ;;
	 restart)
	 stop
	 start
	 ;;
	 status)
	 status tomcat
	 ;;
	 *)
	 echo $"Usage: $0 {start|stop|restart|status}"
	 exit 1
	 ;;
	esac
	exit $?

All set. Now let us connect the HTTPD to talk to Tomcat.

  1. Open /etc/httpd/conf/httpd.conf for editting

  2. Go to the end of the file and uncomment the VirtualHost (port 80). The whole block, of course.

  3. Add the following inside the VirtualHost

	ErrorLog logs/error_log

	CustomLog logs/ajp.log combined

	SetOutputFilter DEFLATE

	BrowserMatch ^Mozilla/4 gzip-only-text/html

	BrowserMatch ^Mozilla/4\.0[678] no-gzip

	BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

	# Don't compress images

	SetEnvIfNoCase Request_URI \

	\.(?:gif|jpe?g|png)$ no-gzip dont-vary

	# Make sure proxies don't deliver the wrong content

	#Header append Vary User-Agent env=!dont-vary

	ExpiresByType image/gif A604800

	ExpiresByType image/png A604800

	ExpiresByType image/jpg A604800

	<Proxy *>

	AddDefaultCharset Off

	Order deny,allow

	Allow from all

	</Proxy>

	ProxyPass /assets !

	ProxyPass / ajp://localhost:8009/

	ProxyPassReverse / ajp://localhost:8009/

The above will enable gzip compression on your pages (for performance), cache images on the client for a week and enable you to serve static assets from the webserver itself.

Set docroot and error pages:

DocumentRoot "/var/www/html"

ErrorDocument 404 /assets/html/missing.html

ErrorDocument 503 /assets/html/missing.html

All done. Now use the Play WAR plugin to generate the WAR file. Copy the generated WAR file into /var/lib/tomcat7/webapps as ROOT.war (otherwise you don’t get the “/” root URL).

Package the static files from inside APP_HOME/public separately into a TAR and extract into the /var/www/html/assets directory.