I want to deploy two applications foo.war
and bar.war
to the same Tomcat instance. Is it possible for them to listen for connections on different ports, e.g. foo listens on port 81 and bar listens on port 82? If so, how can I configure this? I realise that it is not necessary for the applications to listen on different ports, but that is what I want to achieve.
Also, am I right in saying that if I rename foo.war
to ROOT.war
such that it runs in the root context, then all requests to this Tomcat instance will be handled by the foo app and therefore bar would have to be deployed to a separate Tomcat instance?
Simply drop both war files into Tomcat's webapps folder. That is all you need to do. By default, Tomcat expands ("explodes" some say) each war (technically a zip file) into a folder and automatically deploys the app for you. This happens on the fly if Tomcat is already running, or on startup when you launch Tomcat.
As we can see, there are two ways for deploying a web application using the manager: Deploy directory or WAR file located on server. WAR file to deploy.
Is it possible for a single instance of Tomcat to listen on multiple ports? Sure, you can do it. Tomcat is support several protocol such as HTTP(80/8080) default, HTTPS.
Perhaps the simplest way to deploy a WAR file to Tomcat is to copy the file to Tomcat's webapps directory. Copy and paste WAR files into Tomcat's webapps directory to deploy them. Tomcat monitors this webapps directory for changes, and if it finds a new file there, it will attempt to deploy it.
If you want Tomcat to listen to multiple ports, you need to setup a connector for each port. To get each port mapped to a different application, you need need to wrap each connector in a service and create a host with it's own appBase
.
Example of service definition in server.xml
:
<Service name="foo"> <Connector port="80" protocol="org.apache.coyote.http11.Http11NioProtocol" /> <Engine name="Catalina80" defaultHost="localhost"> <Host name="localhost" appBase="foo" unpackWARs="true" autoDeploy="true" /> </Engine> </Service> <Service name="bar"> <Connector port="81" protocol="org.apache.coyote.http11.Http11NioProtocol" /> <Engine name="Catalina81" defaultHost="localhost"> <Host name="localhost" appBase="bar" unpackWARs="true" autoDeploy="true" /> </Engine> </Service>
Instead of dropping the war files in the webapps
directory, you need to create the directory foo
for port 80
and bar
for port 81
. Name both war files ROOT.war
and drop them in their own base directory. You can of course have multiple apps in each directory if you need.
The directory defined in appBase
is relative to the tomcat directory. By using an absolute path, it could be anywhere on your system. From the documentation:
appBase
The Application Base directory for this virtual host. This is the pathname of a directory that may contain web applications to be deployed on this virtual host. You may specify an absolute pathname, or a pathname that is relative to the
$CATALINA_BASE
directory. [...] If not specified, the default ofwebapps
will be used.
Another option is to keep the default tomcat configuration and use another http server (apache, nginx, lighttpd,...) to map a port to the internal path of a tomcat application.
The root application won't receive requests that match other applications, e.g. /foo/example
will go to foo.war
, /example/example
will go to ROOT.war
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With