I ran into the same problem and tried your solution. Although it worked more or less, there were still several glitches. And frankly, this is more like fighting symptoms, rather than treating a disease.
So here is what finally worked for me:
Instead of installing the deployments separately along the way, I assigned each deployment to its own port:
foo.war <-- http://localhost:8080/ -- | Proxy | <-- http://www.foo.com -- | Client | bar.war <-- http://localhost:8181/ -- | Proxy | <-- http://www.bar.com -- | Client |
Thus, both deployments can use / as their context path, so there is no need to edit the context path.
To do this, you do not have to run two application servers. In my case (Wildfly 10.0), it was enough to define two pallets in the wildfly configuration, each with its own virtual host and http listener, for example:
<server name="foo-server"> <http-listener name="foo-listener" proxy-address-forwarding="true" socket-binding="foo-http"/> <host name="foo-host" default-web-module="foo.war" alias="localhost, foo.com, wwww.foo.com"/> </server> <server name="bar-server"> <http-listener name="bar-listener" proxy-address-forwarding="true" socket-binding="bar-http"/> <host name="bar-host" default-web-module="bar.war" alias="localhost, bar.com, wwww.bar.com"/> </server> <socket-binding name="foo-http" port="${jboss.http.port:8080}"/> <socket-binding name="bar-http" port="${jboss.http.port:8181}"/>
You will also need jboss-web.xml in your project:
<?xml version="1.0" encoding="UTF-8"?> <jboss-web> <server-instance>foo-server</server-instance> <virtual-host>foo-host</virtual-host> <context-root>/</context-root> </jboss-web>
Two servers are needed because you cannot add socket binding to a virtual host. Thus, there is little overhead, but they are negligible compared to the launch of two full application servers.
Change 1:
It just seemed to me that probably you don’t even need to use different ports, and using one subsystem server for each object is probably also redundant.
Since the proxy server can redirect the host at the client’s request to the application server, it should be able to select the desired virtual host through the alias parameter.
Thus, the proxy would forward any request to foo.com or bar.com to localhost: 8080 and allow AS sort out.
I have not tested this one , but here is how it could work (again, this is for Wildfly 10.0):
<server name="default-server"> <http-listener name="http" proxy-address-forwarding="true" socket-binding="http"/> <host name="foo-host" default-web-module="foo.war" alias="foo.com, wwww.foo.com"/> <host name="bar-host" default-web-module="bar.war" alias="bar.com, wwww.bar.com"/> </server>
And jboss-web.xml will lose the server tag:
<?xml version="1.0" encoding="UTF-8"?> <jboss-web> <virtual-host>foo-host</virtual-host> <context-root>/</context-root> </jboss-web>
In case this works, there will be no overhead.
Edit 2:
Just tested a simplified approach - yep, it works :)