Virtual Hosting with Tomcat Rumi, May 30, 2011 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. Administrations Configurations (Linux)