» JeaseCMS » Блог

Как хостить мульти-сайты на одном контейнере сервлетов?

The following howto uses Jease as an example, but it is applicable for every web-application which needs to generate pretty urls.

Jease tries really hard to make pretty urls simple. In order to achieve this goal, Jease relies on two concepts:

  • Using a smart servlet-filter which can handle content contained within Jease or in the filesystem transparently without the need to add any prefix, extension or parameter. If a ressource can be resolved via Jease, it will be served, otherwise the request will be delegated to be served by the default handler of the servlet container.
  • Jease is deployed as ROOT-application in your servlet container (e.g. Tomcat or Jetty), so no additional context-path is added in front of the path.

This works like a charm for one Jease-Instance. But what do you do if you want to run several independent Jease-instances from one physical server?

The simple approach would be to install and run several servlet containers on different ports and hide them via a proxy (like Apache)... but that's usually a waste of ressources.

A better approach is to deploy several instances within the same servlet container... but stop: we already deployed one Jease-instance as ROOT-application in our webapps-folder, so no second instance can take this special position.

But if we want to run independent sites for different domains, we can make use of a concept called "Virtual Hosting". A servlet contaienr is able to serve different applications depending on the requested domain.

Configure Tomcat to serve multiple sites

  • Create a folder called "sites" in Tomcat (so "sites" and "webapps" are contained within the same directory in the root of your Tomcat-installation).
  • Create a subfolder "yourdomain.org" in sites.
  • Copy a fresh (or already customized) ROOT.war from a Jease-Installation to "sites/yourdomain.org"
  • Now edit Tomcat/conf/server.xml and add a second entry for a new virtual host right below the definition for the default host (which is the first entry below):
...
<!-- This entry is already contained in server.xml -->

<Host name="localhost"  appBase="webapps"
 unpackWARs="true" autoDeploy="true"
  xmlValidation="false" xmlNamespaceAware="false" />

<!-- This entry adds a virtual host for yourdomain.org -->

<Host name="yourdomain.org"  appBase="sites/yourdomain.org"
  unpackWARs="true" autoDeploy="true"
  xmlValidation="false" xmlNamespaceAware="false" />
...
  • Now restart Tomcat.
  • From now on Tomcat serves all requests for http://yourdomain.org/ from the ROOT-application contained in "sites/yourdomain.org".

Configure Jetty to serve multiple sites

  • Create a new folder called "sites" in the root directory of your Jetty installtion.
  • Create a new folder jetty/sites/yourdomain.org/
  • Copy ROOT.war to jetty/sites/yourdomain.org/
  • Create a file with the following content to jetty/conf/yourdomain.xml:
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
 <Set name="contextPath">/</Set>
 <Set name="war">
  <SystemProperty name="jetty.home"/>/sites/yourdomain.org/ROOT.war
 </Set>
 <Set name="virtualHosts">
   <Array type="java.lang.String">
     <Item>www.yourdomain.org</Item>
   </Array>
 </Set>
</Configure>
  • Now restart Jetty.

Configure Apache as proxy for a servlet container

If you're running Apache in front of your servlet container, you'll need to configure Apache as proxy server for your servlet container as follows:

<Proxy http://www.yourdomain.org:8080/>
Order Allow,Deny
Allow from all
</Proxy>

<VirtualHost *:80>
ServerName yourdomain.org
ServerAlias www.yourdomain.org
ProxyPass / http://www.yourdomain.org:8080/
ProxyPassReverse / http://www.yourdomain.org:8080/
</VirtualHost>

This way you can easily add additional sites as well. That's easy, isn't it?

Last modified on 2012-04-23 by Maik Jablonski