Multiple tomcats, single install

This is for those who need to run multiple instances of Tomcat out of a single install.

There are a few different ways to do this. Here’s the one I find easiest and least confusing:

1. Download Tomcat from the Apache site.

2. Unzip to install directory.


This will be your $CATALINA_HOME.

3. Create a tomcat6 user and group (try to use the same uid and gid values across systems: you’ll thank me later). Use the “tomcat6” name to avoid colliding with any system install of Tomcat (like Red Hat’s tomcat6-* packages) that may use the “tomcat” name.

4. Chown the install directory for the new user and group. Also give group write permissions on the entire directory.

5. Create a subdirectories for your instances, for example:


These will each be a $CATALINA_BASE.

6. Copy the following directories from $CATALINA_HOME into each $CATALINA_BASE:


You can remove these from under $CATALINA_HOME (except for logs and temp) to reduce confusion and clutter (if you ever need a clean copy, you can always extract from the original .zip file).

7. Edit each $CATALINA_BASE/conf/server.xml to change the default ports to something unique for each instance (the HTTP listen port from 8080 to 8081, for example).

8. Create a new startup and shutdown script under $CATALINA_HOME/bin for each instance by copying the existing and to new files named for the instance. For example: “”, “”. Include all the usual environment variables here, for example:

CATALINA_OPTS="$JAVA_OPTS -Xmx1024m -XX:MaxPermSize=256m"

(Note: you should leave the “CATALINA_OPTS” line out of the shutdown scripts to avoid using additional memory)

You could also put this is a separate .env file and source it within the script, but do you really want to make things that complex?

Some people prefer to create a separate “bin” directory under each $CATALINA_BASE. My reason for not doing so is the same I have for renaming the original startup and shutdown .sh files to .sh.orig and making them un-executable: reducing confusion on the part of the uninitiated to a minimum. If you’ve ever been awakened at 3 AM to explain your wily scripting ways to a panicky sysadmin, you’ll understand what I’m talking about.

9. Create a custom init script (like the one here) that includes your CATALINA_HOME and CATALINA_BASE definitions and points at your custom startup and shutdown scripts (rather than the now renamed originals).