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. ```sh 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. ```sh 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 ...`. ```sh #!/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: ```sh chmod ug+x /etc/init.d/tomcat ``` Configure the system to run the script at boot: ```sh sudo update-rc.d tomcat defaults # Debian, Ubuntu sudo chkconfig --add tomcat # Red Hat & co. ``` If you want to remove the service ```sh sudo update-rc.d -f tomcat remove # Debian, Ubuntu ``` To start/stop the script manually: ```sh service tomcat [start | stop] ``` Or the old-fashioned way (Ubuntu): ```sh /etc/init.d/tomcat [start | stop] ``` ### Using systemd Add `/etc/systemd/system/tomcat.service` init script: ```sh # 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: ```sh systemctl daemon-reload ``` Enable the service to start at boot: ```sh systemctl enable tomcat.service ``` To control the service: ```sh service tomcat [start | stop | restart | status] ``` Or with Systemd directly: ```sh 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