JBoss 7 allows for easy hosting of multiple domains with each of them serving different web application in arbitrary context. Here we show how to do it with JBoss 7. Check out other articles for similar tutorials for Tomcat, Glassfish and Jetty.
As a starting point we have http://jboss7.jvmhost.net/ opens JBoss 7 welcome page with link to Administration console. If your JBoss runs on shared hosting server the console URL will include custom port. As we have pristine JBoss installation in our example, first we need to setup admin user and allow remote connections.
In this scenario our primary domain is jboss7.jvmhost.net. We want 2 sample web applications (which are modified
sample.war from Tomcat project) be available at root URLs as below:
jboss7.jvmhost.net -> jboss1.war
jboss72.jvmhost.net -> jboss2.war
1. Additional domain setup
Add the second domain in cPanel as Addon domain and map it to your JBoss in Java Control Panel - Mappings. Click Restore Default Mappings. If you are not using Apache as frotend just make sure the second domain points to your VPS IP (the same IP the application server listens on).
2. JBoss deployment desciptors
Make sure correct
jboss-web.xml is included in
WEB-INF of each WAR so that JBoss correctly assigns the applications to virtual servers and sets them at root URL. In jboss1.war's
WEB-INF/jboss-web.xml we set:
<?xml version="1.0" encoding="UTF-8"?> <jboss-web xmlns="http://www.jboss.com/xml/ns/javaee". xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance". xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-web_5_1.xsd"> <context-root>/</context-root> </jboss-web>
This will assign the application to
default-host at root URL. Similarly jboss2.war's
WEB-INF/jboss-web.xml will contain:
<?xml version="1.0" encoding="UTF-8"?> <jboss-web xmlns="http://www.jboss.com/xml/ns/javaee". xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance". xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-web_5_1.xsd"> <virtual-host>jboss72</virtual-host> <context-root>/</context-root> </jboss-web>
This will assign the web application to virtual host jboss72 at root URL.
3. Disable enable-welcome-root in standalone.xml
Change true to false in
<virtual-server name="default-host" enable-welcome-root="false">
so that our default virtual host uses root application defined by our
jboss-web.xml. Otherwise you would get:
Caused by: java.lang.IllegalArgumentException: Child container with name already exists which means the default root context conflicts with root context from our web application.
In case you try to set custom default module (its default value is
ROOT.war) and the
enable-welcome-root="true" you would get an other error:
JBAS018010: A default web module can not be specified when the welcome root has been enabled
4. Deploy first web application
jboss1.war.deployed will show up in the directory in a moment. Copying
jboss2.war now would result in an error as the required virtual host is not yet defined. http://jboss7.jvmhost.net/ will now work and show message from
5. Create new virtual server for the additional domain
In JBoss console go to Profile tab, choose Web - Servlet/HTTP - Virtual Servers and click Add. Set Name (use the same identifier as in
jboss-web.xml) and domain where you want the application to be accessible at. The default module identifier is not important.
Your virtual servers list will look like this:
### 6. Deploy second web application
jboss2.war.deployed will show up in the directory in a moment. Access the additional domain to verify
jboss2.war content is served like on the below screenshot.
That's all. You now have 2 different web applications bound to root URL of 2 different domains. You can reuse this procedure to server more webapp/domain sets.
7. Setting up JBoss admin user for remote access
[~]# add-user.sh What type of user do you wish to add? a) Management User (mgmt-users.properties) b) Application User (application-users.properties) (a): a Enter the details of the new user to add. Realm (ManagementRealm) : Username : jadmin Password : SECRET Re-enter Password : SECRET About to add user 'jadmin' for realm 'ManagementRealm' Is this correct yes/no? yes Added user 'jadmin' to file '/home/jboss/appservers/jboss-as-7.1.1.Final/standalone/configuration/mgmt-users.properties' Added user 'jadmin' to file '/home/jboss/appservers/jboss-as-7.1.1.Final/domain/configuration/mgmt-users.properties'
8. Multiple cPanel accounts using single JBoss instance
In above example we used single cPanel account with addon domain. In case you run your own cPanel based dedicated server or VPS you can have JBoss runing on a dedciated cPanel account and proxy domains from any other account to it. You can use mod_proxy, mod_proxy_ajp and mod_jk. AJP will require enabling it in
standalone.xml. This can be done by adding the line
<connector name="ajp" protocol="AJP/1.3" socket-binding="ajp" enabled="true" scheme="ajp"/>
<connector name="http" protocol="HTTP/1.1" socket-binding="http" scheme="http"/>.
All accounts and/or domains can be proxied to application server using cPanel's include mechanism. For example by creating
/etc/httpd/conf/userdata/std/2/jboss/domain.com/proxy.conf and placing there:
ProxyPreserveHost On ProxyPass /cpanel ! ProxyPass / http://localhost:YOURAPSERVERHTTPPORT/ ProxyPassReverse / http://localhost:YOURAPSERVERHTTPPORT/
The above example is for mod_proxy but can be easily changed for mod_proxy_ajp or mod_jk. Feel free to add comments or questions that we will try to address.