Comments are embedded below with:

---- Comment ----
some stuff
---- Comment ---- 


----- Original Message -----

> From: Assaf Urieli <assaf.uri...@gmail.com>
> To: Tomcat Users List <users@tomcat.apache.org>
> Cc: 
> Sent: Friday, June 15, 2012 3:33 AM
> Subject: Re: IP-based virtual hosting with useIPVHosts=true always goes to 
> default host
> 
> Hi Chris,
> 
>> 
>>  On 6/8/12 11:12 AM, Assaf Urieli wrote:
>>  > Ok, this is strange. I created a test.jsp page that prints
>>  > request.getLocalName(), request.getServerName(), and
>>  > request.getLocalAddr(). I tried various scenarios in the browser:
>>  > http://domain1.com, http://www.domain1.com, http:/1.2.3.4,
>>  > http://domain2.com, http://www.domain2.com, http://5.6.7.8, as well
>>  > as all of the above with https.
>> 
>>  What /real/ URLs are you using to hit your server? I dont see a port
>>  number anywhere.
>> 
> 
> Sorry, I was trying to keep it generic up to now to see if I was simply
> doing something stupid, but I'll go ahead and publish my real domains/IPs.
>

---- Comment ---- 
First of all, my environment:

Fedora 15 (have to upgrade soon - EOL is at the end of this month)
JDK/JRE 1.6.0_32
Tomcat 6.0.35
Firewall off for this exercise

As I've written up previously, in order to have multiple IP addresses on a 
single interface with Linux, you need to create a second (third, fourth, etc.) 
file with the name ifcfg-eth0:n, where "n" starts at 0. This is assuming that 
your primary interface is eth0. The files will be found in 
/etc/sysconfig/network-scripts.

You MUST set NM_CONTROLLED=no in each interface file, otherwise the virtual 
interface will not come up.

In your /etc/hosts file, you need to have an entry for each interface. Mine 
looks like:

192.168.0.254 phoenix phoenix.mdeggers.org
192.168.0.253 phobos phobos.mdeggers.org

In order to access this from another machine (Windows 7), I've placed the 
entries in that machine's host file.

---- Comment ----  

> So, my test page code is:
> <p>Java Version:<%= System.getProperty( "java.version" ) 
> %>
> <p>Local name:<%= request.getLocalName() %>
> <p>Server name:<%= request.getServerName() %>
> <p>Local IP:<%= request.getLocalAddr() %>
> 

---- Comment ----  


My code is similar, except I put it in a list. I created a simple web 
application called WhoAmI and dropped the WAR file into my environment. More on 
what my Tomcat configuration looks like below.

On my second host (phobos.mdeggers.org), I also have a small verification 
application running as ROOT. This just lets me know that a Tomcat virtual host 
is set up properly and working.

---- Comment ----  


> So, the addresses to test are:
> http://www.joli-ciel.com/test.jsp
> http://www.moyshele.com/test.jsp
> http://178.79.152.69/test.jsp
> http://176.58.107.88/test.jsp
> 
> And exactly the same four, but with HTTPS:
> https://www.joli-ciel.com/test.jsp
> https://www.moyshele.com/test.jsp
> https://178.79.152.69/test.jsp
> https://176.58.107.88/test.jsp
> 
> Now, every single one of these gives the exact same values for
> request.getLocalName() and request.getLocalAddr().
> request.getLocalName(): www.joli-ciel.com
> request.getLocalAddr(): 178.79.152.69
> And this is why, even when useIPVHosts=true, I always get the HTTPS
> Connector corresponding to 178.79.152.69, which gives the wrong SSL
> certificate for https://www.moyshele.com

---- Comment ----  

When I run the tests from a remote host using HTTP (didn't set up HTTPS), I get 
the expected results. 

Going to phoenix.mdeggers.org:8080/WhoAmI/ produces the following:

Java version: 1.6.0_32
Local name: phoenix.mdeggers.org
Local IP: 192.168.0.254
Server name: phoenix.mdeggers.org

Going to phobos.mdeggers.org:8080/WhoAmI/ produces the following:

Java version: 1.6.0_32
Local name: phobos.mdeggers.org
Local IP: 192.168.0.253
Server name: phobos.mdeggers.org

---- Comment ----   


> 

> For info, my /etc/network/interfaces file:
> ************************************************
> auto lo
> iface lo inet loopback
> 
> auto eth0 eth0:0
> 
> iface eth0 inet static
> address 178.79.152.69
> netmask 255.255.255.0
> gateway 178.79.152.1
>         pre-up iptables-restore < /etc/iptables.conf
> 
> iface eth0:0 inet static
> address 176.58.107.88
> netmask 255.255.255.0
>         pre-up iptables-restore < /etc/iptables.conf
> ************************************************
> 

---- Comment ----   

And here's your first problem. You need to specifically state NM_CONTROLLED=no.

Also, you need to add ONPARENT=yes to the eth0:0 interface file.

I've included copies of the interface files in a previous message

---- Comment ----


> Note (in case it's relevent) that /etc/iptables.conf is mapping port 8080
> to port 80 and port 8443 to port 443  - relevent portions below:
> ************************************************
> *nat
> :PREROUTING ACCEPT [11:3512]
> :POSTROUTING ACCEPT [13:844]
> :OUTPUT ACCEPT [13:844]
> -A PREROUTING -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 8443
> -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
> -A OUTPUT -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 8443
> -A OUTPUT -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
> COMMIT
> ************************************************
> 
> My /etc/hosts file:
> ************************************************
> 127.0.0.1        localhost.localdomain  localhost
> 178.79.152.69    www.joli-ciel.com bilbo.joli-ciel.com bilbo.aplikaterm.com
> www.aplikaterm.com joli-ciel.com  bilbo
> 176.58.107.88    www.moyshele.com www.flyingpencil.com moyshele.com
> flyingpencil.com moyshele
> 
> ::1 ip6-localhost ip6-loopback
> fe00::0 ip6-localnet
> ff00::0 ip6-mcastprefix
> ff02::1 ip6-allnodes
> ff02::2 ip6-allrouters
> ff02::3 ip6-allhosts
> ************************************************
> 
> The relevent portions of my server.xml file:
> ************************************************
>   <Service name="Catalina">
>     <Connector port="8080" protocol="HTTP/1.1"
>                connectionTimeout="20000"
>                URIEncoding="UTF-8"
>                redirectPort="8443" />
> 

---- Comment ----   

So you're listening everywhere on port 8080? I'm not sure how this will work. I 
suspect that you have a default interface and everything will come through 
that. Given that you're having problems, could you add two HTTP connectors, one 
listening on each interface? For example, my portion of the server.xml file 
looks like this:

<Connector port="8080" protocol="HTTP/1.1"
           address="192.168.0.254"
           connectionTimeout="20000"
           URIEncoding="UTF-8"
           redirectPort="8443" /> 

<Connector port="8080" protocol="HTTP/1.1"
           address="192.168.0.253"
           connectionTimeout="20000"
           URIEncoding="UTF-8"
           redirectPort="8443" /> 

---- Comment ----

>     <Connector port="8443" protocol="HTTP/1.1" 
> SSLEnabled="true"
> address="178.79.152.69"
>            keystoreFile="/home/tomcat6/.keystore1" 
> keystorePass="********"
>            maxThreads="150" scheme="https" 
> secure="true"
>            clientAuth="false" sslProtocol="TLS" 
> URIEncoding="UTF-8" />
> 
>     <Connector port="8443" protocol="HTTP/1.1" 
> SSLEnabled="true"
> address="176.58.107.88"
>            keystoreFile="/home/tomcat6/.keystore2" 
> keystorePass="********"
>            maxThreads="150" scheme="https" 
> secure="true"
>            clientAuth="false" sslProtocol="TLS" 
> URIEncoding="UTF-8" />
> 
>     <Engine name="Catalina" defaultHost="localhost">
>       <Realm 
> className="org.apache.catalina.realm.UserDatabaseRealm"
>              resourceName="UserDatabase"/>
> 
>       <Host name="localhost"  appBase="webapps"
>             unpackWARs="true" autoDeploy="true"
>             xmlValidation="false" 
> xmlNamespaceAware="false">
>             <Alias>178.79.152.69</Alias>
>             <Alias>aplikaterm.com</Alias>
>             <Alias>www.aplikaterm.com</Alias>
>             <Alias>joli-ciel.com</Alias>
>             <Alias>www.joli-ciel.com</Alias>
> 
>         <Valve 
> className="org.apache.catalina.valves.AccessLogValve"
> directory="/home/tomcat6/logs/joliciel"
>                prefix="joliciel_access_log." suffix=".log" 
> pattern="%A %h
> %l %u %t '%r' %s %b" resolveHosts="false"/>
>       </Host>
>         <Host name="moyshele.com"  
> appBase="/usr/share/moyshele"
>             unpackWARs="true" autoDeploy="true"
>             xmlValidation="false" 
> xmlNamespaceAware="false">
>             <Alias>176.58.107.88</Alias>
>             <Alias>moyshele.com</Alias>
>             <Alias>www.moyshele.com</Alias>
>             <Context path="" docBase="."/>
>             <Valve 
> className="org.apache.catalina.valves.AccessLogValve"
> directory="/home/tomcat6/logs/moyshele"
>                prefix="moyshele_access_log." suffix=".log" 
> pattern="%A %h
> %l %u %t '%r' %s %b" resolveHosts="false"/>
>         </Host>
>     </Engine>
>   </Service>
> ************************************************

---- Comment ----


My Host elements are a bit cleaner. I suggest that you make yours a bit cleaner 
until you get things worked out. Here are mine:

      <Host name="localhost" appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
            <Alias>phoenix.mdeggers.org</Alias>
            <Alias>192.168.0.254</Alias>
            <Valve className="org.apache.catalina.valves.AccessLogValve"
                   directory="logs"  

                   prefix="phoenix_access."
                   suffix=".log"
                   pattern="common"
                   resolveHosts="false"/>
      </Host>

      <!-- not a good place for a virtual host webapps directory -->
      <Host name="phobos" appBase="phobos/webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
            <Alias>phobos.mdeggers.org</Alias>
            <Alias>192.168.0.253</Alias>
            <Valve className="org.apache.catalina.valves.AccessLogValve"
                   directory="logs"  
                   prefix="phobos_access."
                   suffix=".log"
                   pattern="common"
                   resolveHosts="false"/>
      </Host>

---- Comment ---- 

> 
> By the way, if I run netstat (with or without useIPVHosts=true), I get:
> ************************************************
> sudo netstat -ntlp
> Active Internet connections (only servers)
> Proto Recv-Q Send-Q Local Address           Foreign Address
> State       PID/Program name
> tcp        0      0 0.0.0.0:22              0.0.0.0:*
> LISTEN      1967/sshd
> tcp        0      0 127.0.0.1:5432          0.0.0.0:*
> LISTEN      2082/postgres
> tcp6       0      0 127.0.0.1:8005          :::*
> LISTEN      16815/java
> tcp6       0      0 :::8080                 :::*
> LISTEN      16815/java
> tcp6       0      0 :::22                   :::*
> LISTEN      1967/sshd
> tcp6       0      0 176.58.107.88:8443      :::*
> LISTEN      16815/java
> tcp6       0      0 178.79.152.69:8443      :::*
> LISTEN      16815/java
> ************************************************
> 

---- Comment ---- 


My netstat, grepping for 8080:

netstat -an | grep 8080
tcp    0      0 192.168.0.253:8080      0.0.0.0:*           LISTEN
tcp    0      0 192.168.0.254:8080      0.0.0.0:*           LISTEN

In short, this works as expected. I suspect that SSL would work the same way.

I didn't set up SSL, since I normally terminate SSL on a front end Apache HTTPD 
server. I have multiple named virtual hosts (with a SAN certificate) as well as 
some IP virtual hosts with virtual interfaces and separate certificates. From a 
configuration standpoint, it's a bit ugly (although includes and directories 
help with the organization). From an operational standpoint, it all works as 
expected.

---- Comment ----  


. . . . just my two cents.
/mde/

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to