This page is targeted at Scala Developers, who want to get a simple, or multiple web applications going, or create a dynamic web site using Scala. However nearly everything will also apply to people who want to use Java, Kotlin and other JVM language. Its not geared towards advanced professional Scala developers who will almost all be using other solutions. If like me you come to the Tomcat Server, with only the experience of running Apache vanilla servers, setting up Tomcat is significantly more complicated than the extreme simplicity of installing an Apache Vanilla server. Note referring to it as Apache Vanilla is my own naming scheme as referring to it just as "Apache" can be confusing. So here follows a list of steps for setting up Tomcat on your own Desktop, laptop, home server or VPS.
There are default values here that you can change as you work down the page. Although once you've used a value, stick with it or you will create an inconsistent system. Insert your own values below. the data is used for page generation locally and is not sent back to our servers.
sudo apt update
sudo apt upgrade
Install Fail2Ban to protect against brute force login attacks
sudo apt install fail2ban
sudo systemctl enable --now fail2ban
sudo apt install openjdk-25-jdk -y
Check the version
java -version
openjdk version "25" 2025-09-16
OpenJDK Runtime Environment (build 25+36-Ubuntu-1)
OpenJDK 64-Bit Server VM (build 25+36-Ubuntu-1, mixed mode, sharing)
Open the all users environment configuration file
sudo nano /etc/environment
Add line
JAVA_HOME=/usr/lib/jvm/java-25-openjdk-amd64
Save and exit (Ctrl-X and then Y)
sudo reboot
After reboot or logging in again for remote server
echo $JAVA_HOME
/usr/lib/jvm/java-25-openjdk-amd64
sudo useradd -ms /bin/bash -G sudo tommy
sudo passwd tommy
sudo mkdir /opt/tomcat
sudo chown tommy:tommy /opt/tomcat
Switch user to tommy. Then change directory.
Change user unless, you already login in as the tomcat owner.
sudo su tommy
cd /opt/tomcat
Create a directory called Base inside the tomcat directory. This will be used for CatalinaBase and will allow you to keep configuration files to use
with multiple installs and major version changes of Apache.
tommy@computer:/opt/tomcat mkdir Base
tommy@computer:/opt/tomcat wget
https://dlcdn.apache.org/tomcat/tomcat-11/v11.0.14/bin/apache-tomcat-11.0.14.tar.gz
tommy@computer:/opt/tomcat sha512sum apache-tomcat-11.0.14.tar.gz | grep
alongsequenceoflettersanddigits
tommy@computer:/opt/tomcat tar xf apache-tomcat-11.0.14.tar.gz -C /opt/tomcat
tommy@computer:/opt/tomcat ln -s apache-tomcat-11.0.14 tom11
Then checking what we've got.
tommy@computer:/opt/tomcat ls
apache-tomcat-11.0.14 apache-tomcat-11.0.14.tar.gz Base tom11
tommy@computer:/opt/tomcat mkdir Base/logs
tommy@computer:/opt/tomcat mkdir Base/conf
tommy@computer:/opt/tomcat cp tom11/conf/server.xml tom11/conf/web.xml Base/conf
Create a home page for your server. Again not necessary if base and home are set to the same directory, as Tomcat comes with web pages and example apps.
tommy@computer:/opt/tomcat mkdir -p Base/webapps/ROOT
tommy@computer:/opt/tomcat nano Base/webapps/ROOT/index.html
Copy the code below into the editor.
<!doctype html>
<html>
<head>
<title>Holding Page</title>
<meta charset='UTF-8'>
<meta name='viewport' content='width=device-width,initial-scale=1.0'>
</head>
<body>
<h1>Holding Page</h1>
This is coming from computer, a tomcat 11.0.14 server
</body>
</html>
sudo nano /etc/systemd/system/tom11.service
Add the following code. Then control o, return, control x.
[Unit]
Description=Apache Tomcat 11.0 Web Application Container
After=network.target
[Service]
Type=forking
Environment="JAVA_HOME=/usr/lib/jvm/java-1.25.0-openjdk-amd64"
Environment="CATALINA_PID=/opt/tomcat/Base/temp/tomcat.pid"
Environment="CATALINA_HOME=/opt/tomcat/tom11/"
Environment="CATALINA_BASE=/opt/tomcat/Base/"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
Environment="JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom"
ExecStart=/opt/tomcat/tom11/bin/startup.sh
ExecStop=/opt/tomcat/tom11/bin/shutdown.sh
User=tommy
Group=tommy
UMask=0007
RestartSec=10
Restart=always
[Install]
WantedBy=multi-user.target
sudo systemctl status apache2
If its running
sudo systemctl disable apache2
sudo systemctl stop apache2
Then reset Systemd
sudo systemctl daemon-reload
sudo systemctl start tom11
sudo systemctl status tom11
If status good, open a web page at the IpNumber:8080, or the DomainName:8080 on a VPS, or on a local machine at localhost:8080. On a VPS you will
probably want to now enable the server to start automatically, but perhaps not if this is your personal laptop or desktop
sudo systemctl enable tom11
sudo apt install authbind
sudo touch /etc/authbind/byport/80
sudo chown tommy: /etc/authbind/byport/80
sudo chmod 500 /etc/authbind/byport/80
And for HTTPS to use 443
sudo touch /etc/authbind/byport/443
sudo chown tommy: /etc/authbind/byport/443
sudo chmod 500 /etc/authbind/byport/443
Reopen the Systemd Unit file.
sudo nano /etc/systemd/system/tom11.service
ExecStart=/opt/tomcat/tom11/bin/startup.sh to ExecStart=authbind --deep /opt/tomcat/tom11/bin/startup.shsudo nano /opt/tomcat/Base/conf/server.xml
<Connector port="8080" protocol to <Connector port="80" protocolredirectPort=\"8443\" to redirectPort=\"443\"sudo systemctl daemon-reload
sudo systemctl restart tom11
The page should now be available without the port :8080 suffix.
sudo apt install snapd
Install certbot
sudo snap install --classic certbot
certbot 5.1.0 from Certbot Project (certbot-eff✓) installed
Ensure that the cerbot command can be run
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Stop tomcat.
sudo systemctl stop tom11
Install certificate. When asked to enter domain name, you can enter multiple web domains, but you only use the first in the ensuing commands.
sudo certbot certonly --standalone
Configure permissions to certificates
sudo chgrp -R tommy /etc/letsencrypt/live/
sudo chgrp -R tommy /etc/letsencrypt/archive/
sudo chmod -R 750 /etc/letsencrypt/live/
sudo chmod -R 750 /etc/letsencrypt/archive/
sudo chmod 640 /etc/letsencrypt/live/mywebsite.com/privkey.pem
sudo chmod 644 /etc/letsencrypt/live/mywebsite.com/cert.pem
sudo chmod 644 /etc/letsencrypt/live/mywebsite.com.com/chain.pem
Check permissions - if you dont have access then something wrong...
ls -la /etc/letsencrypt/live/richstrat.com/
nano /opt/tomcat/Base/conf/server.xml
Uncomment the section and modify as below
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" secure="true" scheme="https">
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
<SSLHostConfig>
<Certificate certificateFile="/etc/letsencrypt/live/mywebsite.com/cert.pem"
certificateKeyFile="/etc/letsencrypt/live/mywebsite.com/privkey.pem"
certificateChainFile="/etc/letsencrypt/live/mywebsite.com/chain.pem" />
</SSLHostConfig>
</Connector>
Restart Tomcat
sudo systemctl start tom11
sudo systemctl status tom11
Go to https://mywebsite.com