This article describes how to upgrade Tomcat running under Plesk and how to disconnect the control Plesk has over the Tomcat server. This may not be the ideal configuration for you if you have many clients using JSP webapps. Your clients will no longer have the ability to use the Plesk war upload feature from the Plesk admin page.
Upgrade Java
If you plan to install the latest version of Tomcat on your server, you may need to upgrade to the latest version of Java as well. Many Plesk installations use Tomcat 4 and Java 1.4, so you may want Tomcat 5 + Java 5 or Tomcat 6 Java 6.
There are several ways to upgrade Java, and this article will give a simple outline without details.
You can download the latest Java JDK at this link. Note, you will need the stand alone JDK (java development kit) not with Netbeans, and not the JRE version.
http://java.sun.com/javase/downloads/index.jsp
Once you download the version for your platform, install the JDK. On Plesk 7.5, the current JVM is installed at /usr/lib/jvm The RPM install may install to this location. If you downloaded a tar package, you should move the expanded folder to this location.
Upgrade Tomcat
The latest version of Tomcat is available at this location
Because Tomcat runs on the Java virtual machine, you do not need to download a platform specific version or build the code on your server. Simply choose between the .zip or tar.gz download package.
On Plesk 7.5, Tomcat 4 is installed in /var/lib and you should install the new version there. Simply unzip or untar the Tomcat download package in /var/lib
Note – the following describes Tomcat 5. Substitute Tomcat 6 or greater if needed.
You should also create a symlink in /var folder called tomcat5, notice there should be a symlink there from the older Tomcat.
ln -s /var/lib/apache-tomcat-5.5.15/ tomcat5
Add a new Tomcat user and Group
Plesk uses a user and group of tomcat4 | tomcat4 and you should create a new group and user for your new Tomcat version.
groupadd tomcat5
useradd -G tomcat5 tomcat5
Modify the Startup Script
You should copy /etc/init.d/tomcat4 to /etc/init.d/tomcat5 and change all instances of ‘tomcat4’ to ‘tomcat5’
You should also make a symlink in /usr/bin
/usr/bin/dtomcat5 -> /var/tomcat5/bin/catalina.sh
#!/bin/sh
#
# Startup script for Tomcat 5.0, the Apache Servlet Engine
#
# chkconfig: - 80 20
# description: Tomcat 5.0 is the Apache Servlet Engine RI for Servlet 2.3/JSP 1.2
# processname: tomcat
# pidfile: /var/run/tomcat5.pid
# config: /etc/tomcat4/tomcat5.conf
#
# Gomez Henri
# Keith Irwin
# Nicolas Mailhot
#
# version 1.02 - Removed initlog support
# version 1.03 - Removed config:
# version 1.04 - tomcat will start before httpd and stop after httpd
# version 1.05 - jdk hardcoded to link /usr/java/jdk and tomcat runs as "nobody"
# version 1.06 - split up into script and config file
# version 1.07 - Rework from Nicolas ideas
# version 1.08 - Fix work dir permission at start time, switch to use tomcat4
# version 1.09 - Fix pidfile and config tags
# version 1.10 - Fallback to su direct use on systems without Redhat/Mandrake init.d functions
# version 1.11 - Fix webapps dir permissions
# version 1.12 - remove initial start/stop level for chkconfig (- 80 20)
# version 1.13 - remove chown of logs/work/temp/webapps dir, owned by tomcat4 at install time
# version 1.14 - correct the start/stop ugly hack by waiting all the threads stops
# version 1.15 - ensure we're looking for TOMCAT_USER running catalina
# version 1.16 - Add support for CATALINA_PID env var
# version 1.17 - Remove run files only tomcat started correctl
# in start area, check that tomcat is not allready running
# version 1.18 - Fix kill typo (thanks Kaj J. Niemi)
# version 1.19 - Add jar relinking
# version 1.20 - Check there is no stalling tomcat4.pid
# version 2.00 - updated to tomcat5
# Source function library.
if [ -x /etc/rc.d/init.d/functions ]; then
. /etc/rc.d/init.d/functions
fi
SHUTDOWN_WAIT=30
# Path to the tomcat launch script (direct don't use wrapper)
TOMCAT_SCRIPT=/usr/bin/dtomcat5
# Path to the script that will refresh jar symlinks on startup
#TOMCAT_RELINK_SCRIPT="/usr/share/tomcat5/bin/relink"
# Tomcat name :)
TOMCAT_PROG=tomcat5
# if TOMCAT_USER is not set, use tomcat4 like Apache HTTP server
if [ -z "$TOMCAT_USER" ]; then
TOMCAT_USER="tomcat5"
fi
# Since the daemon function will sandbox $tomcat
# no environment stuff should be defined here anymore.
# Please use the /etc/tomcat.conf file instead ; it will
# be read by the $tomcat script
RETVAL=0
# See how we were called.
start() {
echo -n "Starting $TOMCAT_PROG: "
if [ -f /var/lock/subsys/tomcat5 ] ; then
if [ -f /var/run/tomcat5.pid ]; then
read kpid < /var/run/tomcat5.pid
if checkpid $kpid 2>&1; then
echo "process allready running"
return -1
else
echo "lock file found but no process running for pid $kpid, continuing"
fi
fi
fi
export CATALINA_PID=/var/run/tomcat5.pid
touch $CATALINA_PID
chown $TOMCAT_USER:$TOMCAT_USER $CATALINA_PID
$TOMCAT_RELINK_SCRIPT
if [ -x /etc/rc.d/init.d/functions ]; then
# daemon --user $TOMCAT_USER $TOMCAT_SCRIPT start -security
daemon --user $TOMCAT_USER $TOMCAT_SCRIPT start
else
# su - $TOMCAT_USER -c "$TOMCAT_SCRipT start -security"
su - $TOMCAT_USER -c "$TOMCAT_SCRIPT start"
fi
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch /var/lock/subsys/tomcat5
return $RETVAL
}
stop() {
echo -n "Stopping $TOMCAT_PROG: "
if [ -f /var/lock/subsys/tomcat5 ] ; then
if [ -x /etc/rc.d/init.d/functions ]; then
daemon --user $TOMCAT_USER $TOMCAT_SCRIPT stop
else
su - $TOMCAT_USER -c "$TOMCAT_SCRIPT stop"
fi
RETVAL=$?
if [ 0 ]; then
count=0;
if [ -f /var/run/tomcat5.pid ]; then
read kpid < /var/run/tomcat5.pid
let kwait=$SHUTDOWN_WAIT
until [ `ps --pid $kpid | grep -c $kpid` = '0' ] || [ $count -gt $kwait ]
do
echo "waiting for processes to exit";
sleep 1
let count=$count+1;
done
if [ $count -gt $kwait ]; then
echo "killing processes which didn't stop after $SHUTDOWN_WAIT seconds"
kill -9 $kpid
fi
fi
rm -f /var/lock/subsys/tomcat5 /var/run/tomcat5.pid
fi
fi
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 2
start
;;
condrestart)
if [ -f /var/run/tomcat5.pid ] ; then
stop
start
fi
;;
*)
echo "Usage: $TOMCAT_PROG {start|stop|restart|condrestart}"
exit 1
esac
exit $RETVAL
Modify Startup Symlinks
You will need to break the existing symlinks that point to the tomcat4 startup script and have them point to the tomcat5 script.
Your server's configuration may vary, but you should find similar links from the tomcat4 installation. Simply delete them and create new ones for Tomcat 5 that point to ../init.d/tomcat5
/etc/rc.d/rc0.d/K20tomcat4 /etc/rc.d/rc0.d/K20tomcat5
/etc/rc.d/rc1.d/K20tomcat4 /etc/rc.d/rc1.d/K20tomcat5
/etc/rc.d/rc2.d/S80tomcat4 /etc/rc.d/rc2.d/S80tomcat5
/etc/rc.d/rc3.d/S80tomcat4 /etc/rc.d/rc3.d/S80tomcat5
/etc/rc.d/rc4.d/S80tomcat4 /etc/rc.d/rc4.d/S80tomcat5
/etc/rc.d/rc5.d/S80tomcat4 /etc/rc.d/rc5.d/S80tomcat5
/etc/rc.d/rc6.d/K20tomcat4 /etc/rc.d/rc6.d/K20tomcat5
Get rid of mod_webapp
Plesk may have used mod_webapp to bridge Apache with Tomcat and pass all .JSP and servelet request to Tomcat. When upgrading Tomcat, you should also switch to the latest version of mod_jk
You will need to download and build the .so file and add this to your /etc/httpd/conf/htpd.conf file for Apache to include. Details of this process are not covered here, but should be a Google search away.
Also, you will most likely need to add a text file /etc/httpd/conf/workers.properties
worker.list= ajp13
# Definition for Ajp13 worker
#
worker.ajp13.port=8009
worker.ajp13.host=localhost
worker.ajp13.type=ajp13
For each virtual host, you will need to give Apache several mod_jk configuration directives as listed here This step is covered at the end of this article.
Modify Tomcat's Startup Script /bin/catalina.sh
You can set the JAVA_HOME and CATALINA_HOME as environment variables if you like. Otherwise, you can set them directly in the catalina.sh file for Tomcat to pick up.
Of course you need to set these values to the version and the path that you used for both Java and Tomcat.
JAVA_HOME="/usr/lib/jvm/jdk1.5.0_06/"
CATALINA_HOME="/var/tomcat5/"
CATALINA_PID=/var/run/tomcat5.pid
Modify Tomcat's Config file /conf/server.xml
In this step, you can configure one or more domains under Plesk to serve a JSP webapp. Although this process is done by hand, you can configure scripts to modify this file when a new domain is added.
To add a webapp for a domain, you need to add a new host declaration.
Find the default virtual host:
<!-- Define the default virtual host
Note: XML Schema validation will not work with Xerces 2.2.
-->
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
and add a new virtual host:
<Host name="mydomain.com" debug="0" appBase="/home/httpd/vhosts/mydomain.com/webapps/"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Alias>www.mydomain.com</Alias>
</Host>
Create a directory /home/httpd/vhosts/mydomain.com/webapps/ for each virtual host's webapp.
Change ownership of this directory so that Tomcat can work with the files chown tomcat5:tomcat5 /home/httpd/vhosts/mydomain.com/webapps/
And finally, for each virtual host that you define, you will need to modify the vhost.conf file to have Apache play nice with Tomcat. This step gives Apache the mod_jk configuration directives for your virtual host.
Restart Tomcat
You should now be ready to restart Apache and Tomcat
/etc/init.d/httpd restart
/etc/init.d/tomcat5 restart
Try connecting to one of your virtual hosts, and if this does not work, try using port 8080 http://www.mydomain.com:8080/ If port 8080 is working, there is a problem with Apache talking to Tomcat and you will need to check your mod_jk settings.
If all is working, try restarting your server to make sure the startup script works and Tomcat runs on startup. Nobody likes webserver downtime!
Some things to consider
This upgrade does break the Plesk / Tomcat relationship. If you have customers with their own domains, you may want to take additional steps such as defining the security policy for Tomcat, automating the addition of virtual hosts to server.xml, and exposing the Tomcat manager to each virtual host client so they can deploy .war files on their own.