How to run Apache Httpd and Tomcat on port 80 using mod proxy

This how to assumes you already have installed Apache Httpd and Apache Tomcat running on a Debian/Ubuntu compatible box. Sometimes is it useful to run Apache and Tomcat side by side running on the standard http port (80) in case you need to run other scripts than JSP pages or Servlets. There are several ways to do this. The tomcat project exposes them in the Connector Docs. But in this case we are going to use mod_proxy which is a general propose proxy module. The main idea is to setup a VirtualHost exclusive for tomcat on a given path of our site.

Ensure we have mod_proxy enabled

You need to enable 2 modules: proxy and proxy_http using a2enmod

root@server# a2enmod proxy

Module proxy installed; run /etc/init.d/apache2 force-reload to enable.

root@server# a2enmod proxy_http

Enabling proxy as a dependency

This module is already enabled!

Module proxy_http installed; run /etc/init.d/apache2 force-reload to enable.

Create your VirtualHost

root@server# cd /etc/apache2/sites-available

root@server# vi mysite.com

This is the content of mysite.com

<VirtualHost XXX.XXX.XXX.XXX:80>

ServerAdmin webmaster@localhost

ServerName http://www.mysite.com/

DocumentRoot /home/httpd/publics/mysite.com/

ErrorLog /var/log/apache2/mysite.com-error.log

# Possible values include: debug, info, notice, warn, error, crit,

# alert, emerg.

LogLevel warn

CustomLog /var/log/apache2/mysite.com-access.log combined

ServerSignature Off

<Directory /home/httpd/publics/mysite.com/>

Options FollowSymLinks

AllowOverride All

Options -MultiViews

</Directory>

</VirtualHost>

Now we need to enable this VirtualHost

root@server# a2ensite mysite.com

Site mysite.com installed; run /etc/init.d/apache2 force-reload to enable.

Add your Tomcat VirtualHost

Here lets assume we want to have mysite.com and tomcat.mysite.com where all tomcat request will go

root@server# cd /etc/apache2/sites-available

root@server# vi tomcat.mysite.com

This is the content of tomcat.mysite.com

<VirtualHost XXX.XXX.XXX.XXX:80>

ServerAdmin webmaster@localhost

ServerName tomcat.mysite.com

DocumentRoot /home/httpd/publics/tomcat.mysite.com/

ErrorLog /var/log/apache2/tomcat.mysite.com-error.log

# Possible values include: debug, info, notice, warn, error, crit,

# alert, emerg.

LogLevel warn

CustomLog /var/log/apache2/tomcat.mysite.com-access.log combined

ServerSignature Off

# lets indicate the proxy what path do we want

# to forward to tomcat

ProxyPass / http://localhost:8080/

<Directory /home/httpd/publics/tomcat.mysite.com/>

Options FollowSymLinks

AllowOverride All

Options -MultiViews

</Directory>

</VirtualHost>

Now we need to enable this VirtualHost too

root@server# a2ensite tomcat.mysite.com

Site tomcat.mysite.com installed; run /etc/init.d/apache2 force-reload to enable.

Restart Apache

root@server# apache2ctl restart

The trick

The main trick of this configuration resides on the line

Where we tell the proxy what path should be forwarded to Tomcat. In the same way we could modify this to our needs. Lets say we would like to have our path on /tomcat/ all we should do is:

The advanced way

We may want to run both VirtualHost in the same configuration and only forward to tomcat requests starting on a given path

<VirtualHost XXX.XXX.XXX.XXX:80>

ServerAdmin webmaster@localhost

ServerName mysite.com

DocumentRoot /home/httpd/publics/mysite.com/

ErrorLog /var/log/apache2/mysite.com-error.log

# Possible values include: debug, info, notice, warn, error, crit,

# alert, emerg.

LogLevel warn

CustomLog /var/log/apache2/mysite.com-access.log combined

ServerSignature Off

# lets indicate the proxy what path do we want

# to forward to tomcat

ProxyPass /java/ http://localhost:8080/

<Directory /home/httpd/publics/mysite.com/>

Options FollowSymLinks

AllowOverride All

Options -MultiViews

</Directory>

</VirtualHost>

With the above scheme all requests will be served by apache unless they start with /java/

Will be served by the PHP engine. But however:

Will be forwarded to Tomcat