ColdFusion on JBoss with Apache Proxy
Posted by Steve BrownleeSep 6
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.

Thanks a ton for this. I haven’t been able to find any other resource that details how to hook Apache to JBoss like this.
Hi Steve.. Need help!!! I am trying to set up JBoss as my web server. Just downloaded JBoss 4.2.1GA. Changed the port number to 80 in server.xml. I have uploaded my web page in the ROOT.war file. It works fine as when I enter http://localhost. In server.xml I have also put http://www.XYZ.com under the tags… My DNS is set up correctly. Where is jboss-web.xml? in the latest version of JBoss. What else do I need to do to get JBoss wrking as a ser server?
Thanks in advance…
Rom, you need to create the jboss-web.xml file in the WEB-INF directory of your application.
Anybody knows how to configure JBoss with IIS 7 or 6?
So Steve, my copy of Apache 2.2.6 says that ProxyPass is not a valid command inside the virtualhost section. Apache won’t start, and that’s the error that it leaves in my windows event log. Apache’s documentation suggest that ProxyPass isn’t one of the accepted params. Any ideas? Thanks.
ah, digging deeper, I see that it’s definitely a supported param, but I’m still getting the error.
Sorry to flood your site with my stuff.
I have it working now; just needed to uncomment the LoadModule lines for mod_proxy, mod_proxy_ajp and mod_proxy_http.
i follow the steps u provide.
but im getting this forbidden message “You don’t have permission to access / on this server.”
Hi,
Cheers for this useful guide. I have now got our setup working in beautiful harmony. There is one thing that needs mentioning to get it working properly.
The Apache Proxy line should use the DNS name of the JBoss virtual host, rather than an IP address like 127.0.0.1. Otherwise JBoss won’t know what domain is being requested (Proxy doesn’t forward that info). So in other words, you need to have:
ServerName http://www.orbwave.com
ProxyPass / http://www.orbwave.com:8080/
That sort of thing. Took me a while to work out.
Many thanks!
Thanx William. Seems to be working after that. But seems like it wont work if i have 2 jboss instance. I had to put both in the same server and deployment folder.
What do i need to do if both my application is using SSL? I tried putting https:// at ProxyPass but didn’t seem to work. the message is “proxy: No protocol handler was valid for the URL.If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.”
Did i configure it wrong or do i need to get SSL for apache too?
@William:
Very good point, and I’ll make sure that I add it to the documentation. There are multiple ways that a server can be setup and I only covered one of them.
In my case, I had Apache running on my web server box and JBoss running on my application box, so I had to use an internal IP address, but if you have both sitting on the public web server, then your settings would be applicable.
One correction is that ProxyPass does pass the domain name, since I’m using it in my setup and the requests are being handled properly for the multiple domains.
try using this for http to https, works for me
my jboss is using ssl.
ServerName xyz.com
RewriteEngine On
RewriteRule ^(.*)$ https://xyz.com:1
ServerName abc.com
RewriteEngine On
RewriteRule ^(.*)$ https://abc.com:1
i am creating virtual hosts for my application i have one doubt [whether it is possible to create virtual host with out having a proxy of Apache]… pls guide me
Thanks in advance
Hi,
Great guide!
We are trying to move from Apache/CF7/JRun to Apache/CF8/JBoss. With jrun, we had a connector module for Apache (mod_jrun20.so, much like Mod_jk to connect Apache to tomcat). All the web content lives in the Apache doc tree. An instance of Apache lives at cfpro. and its htdocs holds a directory for each CF app. In both Tomcat and JRun environments, we have Apache handle SSL.
If we use ProxyPass, will Apache still hold the cfm content as a doc tree, or does that all move to the cfusion8 server under JBoss? Does there need to be a connector for apache other than the mod_proxy, mod_proxy_ajp and mod_proxy_http? How are those modules configured (used to be wsconfigx directories when running CF under JRun?
Thanks in advance.
Paul