Multiple web applications with JBoss and Apache
I’ve been struggling for about a week with JBoss and Apache.
I admit I am not exactly an expert when it comes to deploy web applications in production environment. This is the first time I tried to deploy more than one web application on the same web / application server using Apache2+ JBoss 7.1.1.
I already had one web application deployed…
First of all, here’s the Apache site configuration (/etc/apache2/sites-available/mydefaultapp):
<VirtualHost *:80>
ServerName www.mydefaultapp.it
DocumentRoot /var/www/mydefaultapp
<Directory /var/www/mydefaultapp>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
SetEnvIf Request_URI "/foto/*" no-jk
JkMount / ajp13
JkMount /* ajp13
</VirtualHost>
On the other hand, the relevant part of JBoss configuration is inside the standalone.xml configuration file (web subsystem):
<subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host" native="false">
<connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http"/>
<connector name="ajp" protocol="AJP/1.3" scheme="http" socket-binding="ajp"/>
<virtual-server name="default-host" enable-welcome-root="false" default-web-module="mydefaultapp">
<alias name="localhost"/>
<alias name="www.mydefaultapp.it"/>
</virtual-server>
</subsystem>
Finally, I had a “per-war” configuration file named “jboss-web.xml” inside WEB-INF directory of my project. It simply was:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
<security-domain>java:/jaas/mydefaultapp</security-domain>
<context-root>/</context-root>
</jboss-web>
This…. works! So, in these days another application needed to be deployed and associated to its own dns name (domain). What do I have to do for making my new web app coexist with the old one? Well, first of all I tried to deploy the “new” war… FAIL!
INSTALL: Failed to process phase INSTALL of deployment “foo.war” Caused by: org.jboss.msc.service.DuplicateServiceException: Service jboss.web.deployment.default-host./.realm is already registered
Well, actually the “jboss-web.xml” of the second war which I am deploying is the same of “mydefaultapp”, the first application already deployed, except for the security-domain name. I mean, the context-root “/” is duplicate. Indeed the documentation is there to be read! You can have multiple war with the same context root deployed, only if they bind to different “virtual hosts”. So I changed my file to be like so:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
<security-domain>java:/jaas/secondapp</security-domain>
<context-root>/</context-root>
<virtual-host>www.secondapp.com</virtual-host>
</jboss-web>
Second try…. broken again! 😦
Now the error claims it can’t find “www.secondapp.com” service.
Gooooogling around and…. I discover that I need to add the virtual server configuration relative to secondapp to JBoss, that was so obvious, so… here it is:
<subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host" native="false">
<connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http"/>
<connector name="ajp" protocol="AJP/1.3" scheme="http" socket-binding="ajp"/>
<virtual-server name="default-host" enable-welcome-root="false" default-web-module="mydefaultapp">
<alias name="localhost"/>
<alias name="www.mydefaultapp.it"/>
</virtual-server>
<virtual-server name="secondApp" enable-welcome-root="false" default-web-module="secondApp">
<alias name="www.secondapp.com"/>
</virtual-server>
Even that… did not work! JBoss keeps telling me: “hey! I can’t find any http://www.secondapp.com web service.”. But I just created it!
After a lot of time spent on looking for examples and specific documentation, and about a thousand test configuration, I found by myself that “virtual-host” value must equal the “virtual-server” name attribute!
So it should be, in my case:
<virtual-host>secondApp</virtual-host>
instead of:
<virtual-host>www.secondapp.com</virtual-host>
Obviously, in my production environment, I had to create another Apache2 site configuration (sites-available / sites-enabled) for the “secondApp”, identical to the firstApp’s one except for the ServerName.
P.S. : I deliberately didn’t explain how to configure mod_jk in Apache2, there are tons of tutorials on that.