I won’t go heavily into the reasons why you would want to use Apache as your proxy to JBoss, but I’ll give some popular ones here so you can see if any of the areas interest you.
- You want to run PHP and ColdFusion on the same server with minimal headaches
- You want to host multiple domains on your JBoss instance
- You need to use complex URI rewriting rules for incoming requests
- You need to run IIS and JBoss on the same server
- You just need a solid, lightweight web server
The reasons I chose to use Apache to act as the web server for my JBoss servers were 1 and 2. I eventually needed to do a little bit of 3. I temporarily had to do number 4, and how easily I have been able to do all of this led me to believe number 5.
Preparing JBoss
The only thing you need to change on JBoss to have Apache act as a proxy to it is ensure that is it not listening on port 80 (which you may have set if it was acting as your web server). Read step 5 in my standalone primer article for instructions on how to change your HTTP port if you haven’t done this before.
Install Apache
I downloaded version 2.0.58 which works just fine for my purposes. However, by the time you read this article, there may be a much better and/or feature-rich version of Apache available. Just download the version you feel best suits your purposes based on your needs.
Configure Apache
Find the ‘Listen’ section of in the \Apache\conf\httpd.conf file and specify the IP address and port on which Apache is listening.
Listen <server ip address>:80
Next, you need to tell Apache where to direct traffic coming in on port 80 on that IP address. For this, we use Virtual Hosts.
NameVirtualHost <server ip address>:80
Now that Apache is prepared to accept request for multiple domain names, we need to set up each of those domains using the <virtualhost> tag. All you need to specify is the ServerName property, which the the base URL of the domain, and the ProxyPass property which simply tells Apache where to redirect the original request.
If your JBoss server is internal only and not public facing, you’ll have to use the IP address from Apache since that’s the designator for it.
<virtualhost>
ServerName www.orbwave.com
ProxyPass / http://{jboss server IP}:8080/
</virtualhost>
<virtualhost>
ServerName www.fusioncube.net
ProxyPass / http://{jboss server IP}:8080/
</virtualhost>
If you have both Apache and JBoss sitting on your public web server, you’ll need to use the domain name instead of the IP address.
<virtualhost>
ServerName www.orbwave.com
ProxyPass / http://www.orbwave.com:8080/
</virtualhost>
<virtualhost>
ServerName www.fusioncube.net
ProxyPass / http://www.fusioncube.net:8080/
</virtualhost>
Configure JBoss to accept requests for multiple domains
What you need to do is create a seperate Host configuration for the edach domain in the server definition file which is located at \jboss\server\default\deploy\jbossweb-tomcat55.sar\server.xml.
Open that file and you’ll see a Host configuration already for localhost. This is the default host meaning that all traffic directed via your web server port (8080) will be directed to your root application. This will be your default domain, meaning the one for which you don’t define a Host.
Now let’s create a new Host designation that will direct requests for two new domain names.
<Host name="domain2 {this can be whatever you want}" autoDeploy="false" deployOnStartup="false" deployXML="false">
<Alias>www.second-domain-name.com</Alias>
<Valve className="org.apache.catalina.valves.AccessLogValve"
prefix="things" suffix=".log" pattern="common"
directory="${jboss.server.home.dir}/log"/>
<DefaultContext cookies="true" crossContext="true" override="true"/>
</Host>
<Host name="domain3 {this can be whatever you want}" autoDeploy="false" deployOnStartup="false" deployXML="false">
<Alias>www.third-domain-name.com</Alias>
<Valve className="org.apache.catalina.valves.AccessLogValve"
prefix="things" suffix=".log" pattern="common"
directory="${jboss.server.home.dir}/log"/>
<DefaultContext cookies="true" crossContext="true" override="true"/>
</Host>
Define Virtual Hosts for Applications
The last step is to modify the jboss-web.xml file for each application. We’ve set up a brand new Host designation, so now each application can be set up as another root application, except now it sits in its own Host space rather than in the one set up for localhost.
So open up the jboss-web.xml file of the application that will be running for second-domain-name.com. Change the context-root definition to root (/) and then match it up with one of the Host entries you made in the server.xml file.
<jboss-web>
<context-root>/</context-root>
<virtual-host>domain2</virtual-host>
</jboss-web>
Similarly for another application that will be served for third-domain-name.com
<jboss-web>
<context-root>/</context-root>
<virtual-host>domain3</virtual-host>
</jboss-web>
All you need to do is start/restart your Jboss instance and request for both domain names will now be redirected to the appropriate application. Just be sure that you have made the requisite changes to your DNS records and they have propagated.
