Using Apache Virtual Hosts and ProxyPass Together

I recently ran into a situation where I had a server with Apache on it that was already hosting a few PHP sites using VirtualHost mappings, but I now wanted to add a new Tomcat-hosted site to the same machine.

In a way, what I wanted was to setup a new VirtualHost entry on Apache to handle the new domain but also make use of the ProxyPass and ProxyReversePass directives to have Apache transparently pass-through traffic from the VirtualHost domain to Tomcat running in the background on some non-conflicting port, like port 80.

At first I didn’t know how to approach this problem; the Googling I was doing was showing me how to use the VirtualHost directive (which I already had a few of) or the ProxyPass/ProxyPassReverse… but not both together.

I thought maybe what I was trying to do didn’t make sense, until I came across an article on the Atlassian website for suggestions on how to setup one of their products.

It seems that in order to use both of these constructs together in Apache, it’s as straight forward as you might think… you simply put your ProxyPass and ProxyPassReverse mappings inside your VirtualHost declaration, like so:

<VirtualHost *:80>
    ServerAdmin john@doe.com
    ServerName <my domain>.com
    ServerAlias www.<my domain>.com
    ProxyPass / http://localhost:8080/<web-app context root>/
    ProxyPassReverse / http://localhost:8080/<web-app context root>/
    ErrorLog logs/<my domain>.com-error_log
    CustomLog logs/<my domain>.com-access_log combined
</VirtualHost>

NOTE: Don’t forget the trailing / at the end of the mapped URL for ProxyPass and ProxyPassReverse; otherwise your traffic will get redirected to invalid URLs like http://mydomain.comblahblah, instead of /blahblah.

Notice the ProxyPass mappings to the root (/) which is safe to do since it’s occuring inside the VirtualHost. Very cool trick and I owe thanks to Marc Chung of OpenRain getting me started down the right Apache-directive-path when I began researching this.

Update #1: User G. Gibson noted that using the settings above didn’t work for him and he had to modify them slightly, in case any other readers are running into this hickup, here are the settings G. Gibson used (thanks G!):

RewriteEngine on
# Tomcat rewrite rule – as route
RewriteCond %{REQUEST_URI} /tomcatAppName*
RewriteRule ^(/.*)$ http://localhost:8080$1 [P]
ProxyPassReverse / http://localhost:8080/
# Rails Server
ServerName myFunkyServer.myDomain.net
ServerAlias http://www.myFunkyServer.myDomain.net
DocumentRoot /path/to/railsapp/public
ServerAdmin admin@myDomain.net
LogLevel warn
ErrorLog /path/to/railsapp/logs/error.log
CustomLog /path/to/railsapp/logs/access.log combined
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
allow from all

Tags: , , , , , ,

About Riyad Kalla

Software development, video games, writing, reading and anything shiny. I ultimately just want to provide a resource that helps people and if I can't do that, then at least make them laugh.

, , , , , ,

15 Responses to “Using Apache Virtual Hosts and ProxyPass Together”

  1. MIke Boland September 15, 2008 at 3:59 am #

    this is fine for sites with no session state – i have this fie on a site with no security as oon as i added spring security it does not work. the proxy needs to go to the same contexts as the war file

  2. rex jolley February 28, 2009 at 2:41 pm #

    Mike, proxypass works fine with sessions in tomcat, but you have use the ajp connector. You can set the ajp port in your tomcat server.xml file and here is how you connect to it in your apache configuration:

    ProxyPass / ajp://localhost:/
    ProxyPassReverse / ajp://localhost:/

    Hope this helps, the article helped me accomplish the rest of what I needed. Huge thanks!

  3. Milo Felipe May 29, 2009 at 5:49 am #

    This works for me. But my only problem is some urls in my application still use the webapp context and not “/”. Most of this URL’s where generated by tags. Any idea how to solve this? Thanks!

  4. Riyad Kalla May 30, 2009 at 8:34 am #

    Milo,

    Double check that the links aren’t being generated with something like < %= request.getContextRoot() %> + because that would be easy to correct.

    If that’s not the case I think what you’ll need is some url rewrite rules for paths starting with /webcontext/… to just /…

  5. Milo Felipe May 31, 2009 at 11:14 pm #

    I solved my problem by deploying my webapps to the root context “/” of the web container. Then I configured the webapps to have Virtual Hosts. I’m using Jetty, but I’ve also tested in on Tomcat. On Apache, I configured it to use:

    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/

    I did not indicate any webapp context root in the URLs. Basically, Apache will forward all requests to the URL. It will be the job of the web container to figure out which webapp it will forward the request to.

  6. Giovanni June 10, 2009 at 8:13 am #

    hi ryhad… i thank you very much for your post. I need something more.. i need to do something like this:

    ServerAdmin john@doe.com
    ServerName .com
    ProxyPass / http://somewhere
    ProxyPassReverse / http://somewhere
    ProxyPass /foo/ http://somewhere-else
    ProxyPassReverse /foo/ http://somewhere-else

    how could i do??? it seems not to work ( / requests “override” /foo/ requests)

    thank you in advance!

  7. sadfasdf June 29, 2009 at 8:21 am #

    try:

    ServerAdmin john@doe.com
    ServerName .com
    ProxyPass /foo/ http://somewhere-else… [L]
    ProxyPassReverse /foo/ http://somewhere-else…[L]
    ProxyPass / http://somewhere
    ProxyPassReverse / http://somewhere

  8. G. Gibson December 29, 2009 at 11:40 am #

    Hrm, none of that worked for me – but this did:

    RewriteEngine on
    # Tomcat rewrite rule – as route
    RewriteCond %{REQUEST_URI} /tomcatAppName*
    RewriteRule ^(/.*)$ http://localhost:8080$1 [P]
    ProxyPassReverse / http://localhost:8080/

    # Rails Server
    ServerName myFunkyServer.myDomain.net
    ServerAlias http://www.myFunkyServer.myDomain.net
    DocumentRoot /path/to/railsapp/public
    ServerAdmin admin@myDomain.net
    LogLevel warn
    ErrorLog /path/to/railsapp/logs/error.log
    CustomLog /path/to/railsapp/logs/access.log combined

    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    allow from all

    • Riyad Kalla January 22, 2010 at 7:54 am #

      G. Gibson, sorry to hear it didn’t work — maybe I missed something in there that was unique to your setup. Thanks for posting your own settings though incase others run into it!

      What was happening when you used the other settings? Forwards just not working right?

    • Harsha April 20, 2011 at 2:16 pm #

      Wonderful solution Gibson. This problem is prominent for many sites I have seen. Your solution is an excellent answer. Thanks again.

Trackbacks/Pingbacks

  1. Recent Links Tagged With "virtualhost" - JabberTags - September 29, 2008

    [...] Note to self: Phusion Passenger and PassengerMaxPoolSize Saved by pithcell on Sat 27-9-2008 Using Apache Virtual Hosts and ProxyPass Together Saved by sawing14s on Sat 27-9-2008 apache2 mod-jk Saved by hsmLove on Fri 26-9-2008 Setting [...]

  2. What is thebuzzmedia.com? | kallasoft - February 9, 2010

    [...] is a programming/linux/tech blog with tips and tricks that programmers and server admins might find handy as well as the home for some of my [...]

  3. Delicious Bookmarks for October 29th from 21:17 to 21:45 « Lâmôlabs - October 29, 2010

    [...] Using Apache Virtual Hosts and ProxyPass Together | The Buzz Media – October 29th ( tags: apache proxy virtualhost proxypass howto example tutorial guide ) [...]

  4. redirect to subdomain on jboss on a virtual ip - SitePoint Forums - April 14, 2011

    [...] sounds like it has a configuration that does what you want using ProxyPass instead of mod_rewrite Using Apache Virtual Hosts and ProxyPass Together HTH __________________ A man should look for what is, and not for what he thinks should be. — [...]

  5. Set up proxy module for Apache web and Tomcat server (run on the same port) | kenzo - January 2, 2013

    [...] Apache Virtual Hosts and ProxyPass Together Source: http://www.thebuzzmedia.com/using-apache-virtual-hosts-and-proxypass-together/ Share this:TwitterFacebookLike this:LikeBe the first to like this. Tháng 13Tháng Một 3, 2013 [...]

Leave a Reply


eight − 5 =