Question

Mapping subdomain to tomcat web application

Posted June 27, 2019 2.1k views
ApacheUbuntu 16.04

I have a subdomain test.example.com.
I have a java web application running in tomcat 8.5 on port 8086.

In /opt/tomcat/conf/server.xml I have a virtual host defined like below.

<Host name="test.example.com" appBase="webapps/myapp-0.2" unpackWARs="true" autoDeploy="true">
        <Alias>www.test.example.com</Alias>
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="test_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>

I have an apache2 conf defines like below.
/etc/apache2/sites-available/test.example.com.conf

<VirtualHost *:80>
        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.
        #ServerName www.example.com

        ServerAdmin webmaster@localhost
        ServerName test.example.com
        ServerAlias www.test.example.com.com
        DocumentRoot /var/www/test.example.com/public_html

        <Directory /var/www/test.example.com/public_html>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
</VirtualHost>

In public_html I have .htaccess defined like below.

RedirectPermanent / http://test.example.com:8086

My goal is to be able to hit the myapp-02 tomcat web app on port 8086 like so http://canicarry.thehatapps.com:8086

I’m not sure what’s wrong but I get 404. I can’t seem to resolve http://canicarry.thehatapps.com:8086 to my web app running in tomcat.

Any help would be appreciated.

These answers are provided by our Community. If you find them useful, show some love by clicking the heart. If you run into issues leave a comment, or add your own answer to help others.

×
1 answer

Hello,

I would recommend using Apache Reverse Proxy, that way you would be able to pass all requests from http://test.example.com to your Tomcat without even having to add the port at the end.

You can take a look a this step by step guide on how to configure that:

https://www.digitalocean.com/community/tutorials/how-to-use-apache-as-a-reverse-proxy-with-mod_proxy-on-ubuntu-16-04

Hope that this helps!
Regards,
Bobby

by Mateusz Papiernik
In this tutorial, you will set up Apache as a reverse proxy using the `mod_proxy` extension to redirect incoming connections to underlying application server(s) running on the same network. There are instructions on setting up a simple web app using the Flask framework to show how Apache interacts with the real application hidden behind it, but you can also follow this tutorial using your existing application server, if you have one.
  • @bobbyiliev Thank you for your help. This has got me much further. However, because I already have mobile apps being used that point to www.example.com:8086, I need to ideally support both www.example.com and www.example.com:8086. Using reverse proxy as you indicated, www.example.com is properly redirected to my tomcat server but I can’t seem to get www.example.com:8086 virtualhost to work.

    Below is my apache2 site conf file.

    Listen 8086
    
    <VirtualHost *:80>
      ServerName canicarry.thehatapps.com
      ProxyPreserveHost On
      ProxyPass / http://localhost:8086/SecondAmendmentSupporters-0.2/
      ProxyPassReverse / http://localhost:8086/SecondAmendmentSupporters-0.2/
    </VirtualHost>
    
    <VirtualHost *:8086>
      ServerName canicarry.thehatapps.com
      ProxyPreserveHost On
      ProxyPass / http://localhost:8086/SecondAmendmentSupporters-0.2/
      ProxyPassReverse / http://localhost:8086/SecondAmendmentSupporters-0.2/
    </VirtualHost>
    

    Any more suggestions?

    • Hello,

      As port 8086 is already being used by tomcat you should not add it in your Apache Vhost as Apache might not be able to start (only one service can listen on 1 port at the same time).

      Instead if you just leave the reverse proxy setup for port 80 to forward the traffic to 8086. Then if you access your domain.com:8086 it should work as you would be hitting tomcat directly without going through Apache first.

      Hope that this helps and let me know how it goes!
      Regards,
      Bobby

Submit an Answer