This tutorial shows you how to install Tomcat 8.5 on CentOS 7. Tomcat  is an open-source implementation of Java Servlet, JavaServer Pages,  Java Expression Language, and Java WebSocket technologies.

Prerequisites

Before  starting with this tutorial, make sure you are logged into your server  with a user account with sudo privileges or with the root user. It is  best practice to run administrative commands as sudo user instead of  root. If you don’t have a sudo user on your system, create one by  following these instructions.

Install OpenJDK

Tomcat 8.5 requires Java SE 7 or later. In this tutorial we will install OpenJDK 8, the open-source implementation of the Java Platform which is the default Java development and runtime in CentOS 7.

The installation is simple and straight forward:

sudo yum install java-1.8.0-openjdk-devel

Create Tomcat system user

Running Tomcat as a root user is a security risk and is not recommended. Instead, we will create a new system user and group with home directory /opt/tomcat that will run the Tomcat service:

sudo useradd -m -U -d /opt/tomcat -s /bin/false tomcat

Download Tomcat

We will download the latest version of Tomcat 8.5.x from the Tomcat downloads page.  At the time of writing, the latest version is 8.5.37. Before continuing  with the next step you should check the download page for any new  version.

Change to the /tmp directory and use wget to download the zip file:

cd /tmp

Once the download is completed, extract the zip file and move it to the /opt/tomcat directory:

unzip apache-tomcat-*.zip

Tomcat 8.5 is updated frequently. To have more control over versions and updates, we will create a symbolic link latest which will point to the Tomcat installation directory:

sudo ln -s /opt/tomcat/apache-tomcat-8.5.37 /opt/tomcat/latest

The tomcat user that we previously set up needs to have access to the tomcat directory. Change the directory ownership to user and group tomcat:

sudo chown -R tomcat: /opt/tomcat

Make the scripts inside bin directory executable by issuing the following chmod command:

sudo sh -c 'chmod +x /opt/tomcat/latest/bin/*.sh'

Create a systemd unit file

To run Tomcat as a service create a tomcat.service unit file in the /etc/systemd/system/ directory with the following contents:

/etc/systemd/system/tomcat.service

[Unit]
Description=Tomcat 8.5 servlet container
After=network.target

[Service]
Type=forking

User=tomcat
Group=tomcat

Environment="JAVA_HOME=/usr/lib/jvm/jre"
Environment="JAVA_OPTS=-Djava.security.egd=file:///dev/urandom"

Environment="CATALINA_BASE=/opt/tomcat/latest"
Environment="CATALINA_HOME=/opt/tomcat/latest"
Environment="CATALINA_PID=/opt/tomcat/latest/temp/tomcat.pid"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"

ExecStart=/opt/tomcat/latest/bin/startup.sh
ExecStop=/opt/tomcat/latest/bin/shutdown.sh

[Install]
WantedBy=multi-user.target

Copy

Notify systemd that we created a new unit file and start the Tomcat service by executing:

sudo systemctl daemon-reload

Check the service status with the following command:

sudo systemctl status tomcat
 tomcat.service - Tomcat 8.5 servlet container
   Loaded: loaded (/etc/systemd/system/tomcat.service; disabled; vendor preset: disabled)
   Active: active (running) since Sat 2018-03-31 16:30:48 UTC; 3s ago
  Process: 23826 ExecStart=/opt/tomcat/latest/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 23833 (java)
   CGroup: /system.slice/tomcat.service
           └─23833 /usr/lib/jvm/jre/bin/java -Djava.util.logging.config.file=/opt/tomcat/latest/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.security.egd=fi...

If there are no errors you can enable the Tomcat service to be automatically started at boot time:

sudo systemctl enable tomcat

Adjust the Firewall

If your server is protected by a firewall and you want to access the tomcat interface from the outside of the local network, open port 8080.

Use the following commands to open the necessary port:

sudo firewall-cmd --zone=public --permanent --add-port=8080/tcp

In most cases, when running Tomcat in a production environment you will use a load balancer or reverse proxy. The best practice to allow access to port 8080 only to your internal network.

Configure Tomcat Web Management Interface

At this point Tomcat is installed and we can access it with a web browser on port 8080, but we can not access the web management interface because we have not created a user yet.

Tomcat users and their roles are defined in the tomcat-users.xml file.

If you open the file you will notice that it is filled with comments and examples describing how to configure the file.

sudo nano /opt/tomcat/latest/conf/tomcat-users.xml

To add a new user who will be able to access the tomcat web interface (manager-gui and admin-gui) we need to define the user in tomcat-users.xml file as shown below. Make sure you change the username and password to something more secure:

/opt/tomcat/latest/conf/tomcat-users.xml

<tomcat-users>
<!--
    Comments
-->
   <role rolename="admin-gui"/>
   <role rolename="manager-gui"/>
   <user username="admin" password="admin_password" roles="admin-gui,manager-gui"/>
</tomcat-users>

Copy

By default Tomcat web  management interface is configured to allow access only from the  localhost. If you want to be able to access the web interface from a  remote IP or from anywhere which is not recommended because it is a  security risk you can open the following files and make the following  changes.

If  you need to access the web interface from anywhere open the following  files and comment or remove the lines highlighted in yellow:

/opt/tomcat/latest/webapps/manager/META-INF/context.xml

<Context antiResourceLocking="false" privileged="true" >
<!--
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->
</Context>

Copy/opt/tomcat/latest/webapps/host-manager/META-INF/context.xml

<Context antiResourceLocking="false" privileged="true" >
<!--
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->
</Context>

Copy

If you need to access the web  interface only from a specific IP, instead of commenting the blocks add  your public IP to the list. Let’s say your public IP is 41.41.41.41 and you want to allow access only from that IP:

/opt/tomcat/latest/webapps/manager/META-INF/context.xml

<Context antiResourceLocking="false" privileged="true" >
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|41.41.41.41" />
</Context>

Copy/opt/tomcat/latest/webapps/host-manager/META-INF/context.xml

<Context antiResourceLocking="false" privileged="true" >
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|41.41.41.41" />
</Context>

Copy

The list of allowed IP addresses is a list separated with vertical bar |. You can add single IP addresses or use a regular expressions.

Restart the Tomcat service for changes to take effect:

sudo systemctl restart tomcat

Test the Installation

Open your browser and type: http://<your_domain_or_IP_address>:8080

Upon successful installation, a screen similar to the following will appear:

Tomcat web application manager dashboard is available at http://<your_domain_or_IP_address>:8080/manager/html. From here you can deploy, undeploy, start, stop and reload your applications.

Tomcat virtual host manager dashboard is available at http://<your_domain_or_IP_address>:8080/host-manager/html. From here you can create, delete and manage Tomcat virtual hosts.

Conclusion

You  have successfully installed Tomcat 8.5 on your CentOS 7 system and  learned how to access the Tomcat management interface. You can now visit  the official Apache Tomcat 8 Documentation and learn more about the Apache Tomcat features.

If you hit a problem or have feedback, leave a comment below.