Skip to content

Instantly share code, notes, and snippets.

@ovichiro
Last active February 2, 2024 03:20
Show Gist options
  • Save ovichiro/d24c53ce4902ef41cc208efeadd596b6 to your computer and use it in GitHub Desktop.
Save ovichiro/d24c53ce4902ef41cc208efeadd596b6 to your computer and use it in GitHub Desktop.
Tomcat as a service on Linux

Install Tomcat as a service on Linux

Download Tomcat from the Apache website.
Unpack in /opt/apache-tomcat-x.y.z. E.g. /opt/apache-tomcat-8.5.6.
You'll need a terminal and root access.

Create Tomcat user with restricted permissions

This is the user the Tomcat service will run as.

groupadd tomcat
useradd -s /sbin/nologin -g tomcat -d /opt/apache-tomcat-8.5.6 tomcat
passwd tomcat

Set the tomcat user as the owner of the $CATALINA_HOME folder.

chown -R tomcat.tomcat /opt/apache-tomcat-8.5.6

Configure Tomcat to run as a service

Using init.d

Add /etc/init.d/tomcat init script. Notice there are other init scripts in /etc/init.d/.
The script shown below will have a LSB type header to define dependencies and runlevels.
Some details here: https://wiki.debian.org/LSBInitScripts
It will start and stop the server as the tomcat user, preserving the existing environment variables, by using su -p -s /bin/sh tomcat ....

#!/bin/bash

### BEGIN INIT INFO
# Provides:          tomcat
# Required-Start:    $network $remote_fs $syslog
# Required-Stop:     $network $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start Tomcat at boot time
# Description:       Start Tomcat at boot time
### END INIT INFO

export JAVA_HOME=/usr/lib/jvm/jre
export CATALINA_HOME=/opt/apache-tomcat-8.5.6
export JAVA_OPTS="-Xms250m -Xmx1024m"

RETVAL=$?
case $1 in
start)
    if [ -f $CATALINA_HOME/bin/startup.sh ];
    then
        echo $"Starting Tomcat"
        su -p -s /bin/sh tomcat $CATALINA_HOME/bin/startup.sh
    fi
    ;; 
stop)   
    if [ -f $CATALINA_HOME/bin/shutdown.sh ];
    then
        echo $"Stopping Tomcat"
        su -p -s /bin/sh tomcat $CATALINA_HOME/bin/shutdown.sh
    fi
    ;; 
*)
    echo $"Usage: $0 {start|stop}"
    exit 1
    ;;
esac

exit $RETVAL

Make the script executable:

chmod ug+x /etc/init.d/tomcat

Configure the system to run the script at boot:

sudo update-rc.d tomcat defaults     # Debian, Ubuntu
sudo chkconfig --add tomcat          # Red Hat & co.

If you want to remove the service

sudo update-rc.d -f tomcat remove    # Debian, Ubuntu

To start/stop the script manually:

service tomcat [start | stop]

Or the old-fashioned way (Ubuntu):

/etc/init.d/tomcat [start | stop]

Using systemd

Add /etc/systemd/system/tomcat.service init script:

# Systemd unit file for tomcat
[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target

[Service]
Type=forking
User=tomcat
Group=tomcat

Environment=JAVA_HOME=/usr/lib/jvm/jre
Environment=CATALINA_PID=/opt/apache-tomcat-8.5.6/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/apache-tomcat-8.5.6
Environment=CATALINA_BASE=/opt/apache-tomcat-8.5.6
Environment=CATALINA_OPTS=
Environment="JAVA_OPTS=-Dfile.encoding=UTF-8 -Dnet.sf.ehcache.skipUpdateCheck=true \
-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled \
-XX:+UseParNewGC -Xms2g -Xmx4g"

ExecStart=/opt/apache-tomcat-8.5.6/bin/startup.sh
ExecStop=/bin/kill -15 $MAINPID

[Install]
WantedBy=multi-user.target

The script tells the system to run the service as the tomcat user with the specified configs.

Reload Systemd in order to discover and load the new Tomcat service file:

systemctl daemon-reload

Enable the service to start at boot:

systemctl enable tomcat.service

To control the service:

service tomcat [start | stop | restart | status]

Or with Systemd directly:

systemctl [start | stop | restart | status] tomcat

Configure Tomcat with APR native library

For better performance, scalability and SSL usage, especially on production environments, it is recommended to configure Tomcat to run with the APR library.

Docs: https://tomcat.apache.org/tomcat-8.5-doc/apr.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment