Uploaded image for project: 'mod_cluster'
  1. mod_cluster
  2. MODCLUSTER-463

UpperCase Alias never matches any context

XMLWordPrintable

      Problem

      JBossWeb

      Regardless the upper/lower case of an Alias one configured in JBossWeb (EAP 6.4.3, mod_cluster subsystem 1.2.11.Final), it has always been reported to Apache HTTP Server in lower case. For example, the following configuration:

      <subsystem xmlns="urn:jboss:domain:web:2.2" default-virtual-server="default-host" instance-id="workerXXX" 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="true">
              <alias name="localhost"/>
              <alias name="example.com"/>
          </virtual-server>
          <virtual-server name="web1" default-web-module="simplecontext-web1">
              <alias name="web1.rhel7GAx86-64"/>
          </virtual-server>
          <virtual-server name="web2" default-web-module="simplecontext-web2">
              <alias name="web2.rhel7GAx86-64"/>
          </virtual-server>
      </subsystem>
      

      sends this message with aliases actually being reported in lower case: JVMRoute=workerXXX&Alias=web2%2Cweb2.rhel7gax86-64&Context=%2F. Having aliases stored in lower case on the Apache HTTP Server side enables both these URLs to work perfectly:

      curl http://web2.rhel7GAx86-64:6666/
      curl http://web2.rhel7gax86-64:6666/

      . The balancer configuration is just a simple UseAlias 1.

      Undertow

      Undertow (JBossWeb's successor in EAP 7.0.0.DR7, mod_cluster subsystem 1.3.1.Final) behaves differently; it reports verbatim what one sets as an alias, so with the following configuration:

      <subsystem xmlns="urn:jboss:domain:undertow:3.0" instance-id="workerXXX">
          <buffer-cache name="default"/>
          <server name="default-server">
              <ajp-listener name="ajp" socket-binding="ajp"/>
              <http-listener name="default" redirect-socket="https" socket-binding="http"/>
              <host name="default-host" alias="localhost">
                  <location name="/" handler="welcome-content"/>
                  <filter-ref name="server-header"/>
                  <filter-ref name="x-powered-by-header"/>
              </host>
              <host name="web1" alias="web1.rhel7GAx86-64">
                  <location name="/" handler="web1-content"/>
                  <filter-ref name="server-header"/>
                  <filter-ref name="x-powered-by-header"/>
              </host>
              <host name="web2" alias="web2.rhel7GAx86-64">
                  <location name="/" handler="web2-content"/>
                  <filter-ref name="server-header"/>
                  <filter-ref name="x-powered-by-header"/>
              </host>
          </server>
          <servlet-container name="default">
              <jsp-config/>
              <websockets/>
          </servlet-container>
          <handlers>
              <file name="web1-content" path="${jboss.home.dir}/simplecontext-web1"/>
              <file name="web2-content" path="${jboss.home.dir}/simplecontext-web2"/>
              <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
          </handlers>
          <filters>
              <response-header name="server-header" header-value="WildFly/10" header-name="Server"/>
              <response-header name="x-powered-by-header" header-value="Undertow/1" header-name="X-Powered-By"/>
          </filters>
      </subsystem>

      , the message reported to Apache HTTP Server actually is:JVMRoute=workerXXX&Alias=web2%2Cweb2.rhel7GAx86-64&Context=%2F. Due to the fact that aliases are being compared byte-by-byte for equality (because pumping of slash characters takes place) and the accessed domain is always in lower case and alias is stored as it was received, there is never match between these.

      The result is that while these work:http://web2:6666/, http://web1:6666/, one of the upper case containing ones work at all: http://web1.rhel7GAx86-64:6666 and http://web2.rhel7gax86-64:6666/ neither. By not working I actually mean they return the root of Apache HTTP Server Welcome page instead of correctly forwarding to one of the Application server's virtual host contexts.

      Last but not least, while EAP 6.4.3 with JBossWeb itself treats aliases as case-insensitive, EAP 7.0.0.DR7 with Undertow does not; i.e. web1.rhel7GAx86-64:8080/ returns correctly web application content whereas web1.rhel7gax86-64:8080/ returns EAP7 Welcome page.

      While the aforementioned is clearly a bug (or a weird feature ) in Undertow, we must make the Apache HTTP Server code resilient to such behaviour.

      Solution

      I suggest converting aliases to lower case in mod_manager on ENABLE-APP arrival. According to my preliminary tests, this approach works for both JBossWeb and Undertow equipped workers. I think it's cool to do that: RFC 1035.

              mbabacek1@redhat.com Karm Karm
              mbabacek1@redhat.com Karm Karm
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

                Created:
                Updated:
                Resolved: