Powered by Blogger.

Virtual Hosting with Tomcat

This is a guide on setting up Tomcat to do virtual hosting and make it behave like a simple webserver with jsp and servlet support, for many different sites all hosted on the same IP address. The aim is to have a single directory for each virtual host, which can be manipulated individually without hassles from managing multiple .war files and other configuration difficulties.

To configure Tomcat for a virtual host, you need a <Host ..> directive in the server.xml file, and a ROOT.xml file in the conf/Catalina/$host directory. Here's the minimal setup required for a copy of Tomcat serving directly on Port 80, using no connectors or other configuration difficulties.

This was written for Tomcat 5 on linux, with Tomcat installed in /usr/local/tomcat

We start with the simplest configuration, of one website, called 'localhost' which keeps it's files in /usr/local/tomcat/webapps/localhost . We're not using any .war files here - all the files are placed straight into the directory.

conf/server.xml

<Server port="8005" shutdown="SHUTDOWN" debug="0">

  <!-- Define the Tomcat Stand-Alone Service -->
  <Service name="Catalina">
    
        <!-- Define a non-SSL Coyote HTTP/1.1 Connector on port 8080 -->
    <Connector port="80"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               debug="0" connectionTimeout="20000" 
               disableUploadTimeout="true" />

                <Engine name="Catalina" defaultHost="localhost" debug="0">

   
      <!-- Define the default virtual host
           Note: XML Schema validation will not work with Xerces 2.2.
       -->
      <Host name="localhost" debug="0" appBase="webapps/localhost"
       unpackWARs="true" autoDeploy="true"
       xmlValidation="false" xmlNamespaceAware="false">
        <Logger className="org.apache.catalina.logger.FileLogger"
                 directory="logs"  prefix="localhost_log." suffix=".txt"
            timestamp="true"/>
      </Host>

         <!-- VIRTUAL HOST INJECTION POINT -->
          
    </Engine>

  </Service>

</Server>

conf/Catalina/localhost/ROOT.xml

<?xml version='1.0' encoding='utf-8'?>
<Context displayName="localhost" docBase="" path=""
workDir="work/Catalina/localhost/_">
</Context>

webapps/localhost

index.jsp
WEB-INF/web.xml

webapps/localhost/WEB-INF/web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app>
</web-app>

Adding a virtual host to this config.

From here, to add a virtual host $host with an alias of $alias, the following steps are required.
  • Shut down tomcat.
  • Add a Host entry to the server.xml file at the VIRTUAL HOST INJECTION POINT
    <Host name="$host" debug="0" appBase="webapps/$host"
            unpackWARs="true" autoDeploy="true"
        xmlValidation="false" xmlNamespaceAware="false">
    
    <Logger className="org.apache.catalina.logger.FileLogger"
    directory="logs"  prefix="$host\_log." suffix=".txt" timestamp="true"/>
    
    <Alias>$alias</Alias>
    </Host>
    
  • Add a configuration file for the host
    mkdir conf/Catalina/$host
    
    cat >conf/Catalina/$host/ROOT.xml
    <?xml version='1.0' encoding='utf-8'?>
    <Context displayName="$host" docBase="" path=""
    workDir="work/Catalina/$host/_">
    </Context>
    ^D
    
    
  • Add a skeleton directory structure for the files
    mkdir $tomcatdir/webapps/$host
    mkdir $tomcatdir/webapps/$host/WEB-INF
    mkdir $tomcatdir/webapps/$host/WEB-INF/classes
    mkdir $tomcatdir/webapps/$host/WEB-INF/lib
    
  • Add a minimal web.xml file
    cat >webapps/$host/WEB-INF/web.xml
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <web-app>
    </web-app>
    
  • Add a trivial holding page
    cat >index.jsp
    <html>
    <head>
    <title>Not yet configured</title>
    </head>
    
    <body>
    <p>This virtual server $host is not yet configured.</p>
    </body>
    </html>
    
  • Start tomcat back up again.
    Blogger Comment
    Facebook Comment