Production Setup

This page contains example config files and directions for setting up a production portal using a combination of Linux/Apache/Java/Tomcat/uPortal.

Right now it is very much a work in progress. Please, feel free to add/correct and delete content.

Baseline Production Apache Config

TODO:

  • example server.xml with jk on 8009 and with http on 8080 disabled

These instructions cover the following programs and versions:

  • uPortal 2.4.x
  • Redhat Linux AS/ES
  • Apache 2.x
  • Tomcat 5.0.28
  • Java 1.4.2_05

Specific configuration

Java

Install j2sdk-1_4_2_05-linux-i586-rpm.bin

Simlink the sdk's directory to /usr/java. This will make java upgrades easier because the jre can be upgraded by moving the simlink:

simlink Java sdk directory
mv j2sdk1.4.2_05 /usr/java/
ln -s j2sdk1.4.2_05/ java
Set JAVA_HOME
echo export JAVA_HOME="/usr/java/java" >> /etc/profile

Perform the same two commands at the command prompt now to set Java home.

echo JAVA_HOME

Apache

Add the following to /etc/httpd/conf/httpd.conf

httpd.conf
...
Include /usr/local/tomcat/conf/mod_jk.conf
mod_jk.conf
#### Load Mod_Jk ################################

<IfModule !mod_jk.so>
        LoadModule jk_module modules/mod_jk.so
</IfModule>

#Tomcat Security Section
<LocationMatch "/WEB-INF/">
  AllowOverride None
  deny from all
</LocationMatch>

<LocationMatch "/META-INF/">
  AllowOverride None
  deny from all
</LocationMatch>

#### Virtual Hosts ###############################

Listen 0.0.0.0:80
Listen 0.0.0.0:443

NameVirtualHost uportal-vip.foo.edu:80
NameVirtualHost uportal-vip.foo.edu:443

# The non SSL part of the site just redirects to the SSL port
<VirtualHost uportal.foo.edu:80>
        ServerName uportal.foo.edu
        DocumentRoot /usr/local/tomcat/webapps/ROOT
        ErrorLog /etc/httpd/logs/error_log
        CustomLog /etc/httpd/logs/access_log common
        JkMount /*.jsp wrkr
        DirectoryIndex index.jsp
</VirtualHost>

# All access to uPortal is done over SSL
<VirtualHost uportal.foo.edu:443>
        ServerName uportal.foo.edu
        DocumentRoot /usr/local/tomcat/webapps/ROOT
        ErrorLog /etc/httpd/logs/error_log
        CustomLog /etc/httpd/logs/access_log common

        JkMount /*.jsp wrkr
        JkMount /uPortal wrkr
        JkMount /uPortal/*.jsp wrkr
        JkMount /uPortal/*.uP wrkr
        JkMount /uPortal/Authentication wrkr
        JkMount /uPortal/Login wrkr
        JkMount /uPortal/Logout wrkr
        JkMount /uPortal/*.jws wrkr
        JkMount /uPortal/services/* wrkr
        JkMount /uPortal/servlet/* wrkr

        DirectoryIndex index.jsp
        SSLEngine on
        SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
        SSLCertificateFile /etc/httpd/conf/ssl/uportal.foo.edu.crt
        SSLCertificateKeyFile /etc/httpd/conf/ssl/uportal.foo.edu.key
        <Files ~ "\.(cgi|php|shtml|phtml|php3?)$">
           SSLOptions +StdEnvVars
        </Files>

        Alias /uPortal  "/usr/local/tomcat/webapps/uPortal"

        <Directory "/usr/local/tomcat/webapps/ROOT">
            AllowOverride None
            Order allow,deny
            Allow from all
            DirectoryIndex index.jsp
        </Directory>
        <Directory "/usr/local/tomcat/webapps/uPortal">
            AllowOverride None
            Order allow,deny
            Allow from all
        </Directory>


</VirtualHost>

#### Tomcat Log File Setup ######################

JkWorkersFile "/usr/local/tomcat/conf/workers.properties"
JkLogFile "/usr/local/tomcat/logs/mod_jk.log"
JkLogLevel info
JkLogStampFormat "[%a %b %d %H: %M: %S %Y]"

JK Connector

Commands to install and compile mod_jk
tar -zxvf jakarta-tomcat-connectors-jk-1.2.src-current.tar.gz
mv jakarta-tomcat-connectors-jk-1.2.5-src /usr/src
cd /usr/src/jakarta-tomcat-connectors-jk-1.2.5-src/jk/native
./buildconf.sh
./configure -with-apxs=/usr/sbin/apxs
make
mv apache-2.0/mod_jk.so /etc/httpd/modules/
/usr/local/tomcat/conf/workers.properties example
worker.list=wrkr
worker.wrkr.port=8009
worker.wrkr.host=localhost
worker.wrkr.type=ajp13
worker.wrkr.cachesize=10
worker.wrkr.cache_timeout=600
worker.wrkr.socket_timeout=300

Tomcat

useradd tomcat
passwd tomcat (what should we type for the password)
tar -zxvf jakarta-tomcat-5.0.28.tar.gz
mv jakarta-tomcat-5.0.28 /usr/local/
ln -s jakarta-tomcat-5.0.28 tomcat
chown -R tomcat:tomcat jakarta-tomcat-5.0.28

The following script is called when tomcat is shutdown or restarted. This script captures important diagnostic information that will allow you to in many cases diagnose portal problems such as slow external resources, database problems, synchronization/concurrency issues and slow code.

/usr/local/bin/portal-status
#!/bin/bash
date >> /usr/local/tomcat/logs/portal-status.log
# save the garbage colection log
cp /usr/local/tomcat/logs/tomcat_gc.log /usr/local/tomcat/logs/tomcat_gc_`date +%y%m%d_%H%M%S`.log
# run netstat
netstat -e >> /usr/local/tomcat/logs/portal-status.log

# run top to get memory and process info
top -n 1 -b >> /usr/local/tomcat/logs/portal-status.log

# apache status tells us what apache was up to
/usr/sbin/apachectl status >> /usr/local/tomcat/logs/portal-status.log

# send a SIGQUIT to the java process to force it to dump a threaddump to the catalina.out log
PID=`ps -AH | pgrep java |head -n 1`
kill -3 $PID
/etc/init.d/tomcat
#!/bin/sh
#
# Startup script for Tomcat, the Apache Servlet Engine
#
# Tomcat name :)
TOMCAT_PROG=tomcat

# if TOMCAT_USER is not set, use tomcat like Apache HTTP server
if [ -z "$TOMCAT_USER" ]; then
 TOMCAT_USER="tomcat"
fi

RETVAL=0

export JAVA_HOME="/usr/java/java/"
export CATALINA_OPTS="-Xms256m -Xmx512m -Xloggc:/usr/local/tomcat/logs/tomcat_gc.log -Djava.awt.headless=true -Dsun.net.client.defaultReadTimeout=600000 -Dsun.net.client.defaultConnectTimeout=120000"
export CATALINA_HOME=/usr/local/tomcat
export JPDA_ADDRESS=8000

# start and stop functions
start() {
    echo -n "Starting tomcat: "
    ulimit -v 1048576
#    chown -R $TOMCAT_USER:$TOMCAT_USER /usr/local/tomcat/*
#    chown -R $TOMCAT_USER:$TOMCAT_USER /home/tomcat/*
    su $TOMCAT_USER -c "${CATALINA_HOME}/bin/catalina.sh start ${CATALINA_OPTIONS}"
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && touch /var/lock/subsys/tomcat
    return $RETVAL
}

stop() {
    echo -n "Stopping tomcat: "
    ###
    echo "Dumping portal-status to portal-status.log. Dumping JVM thread dump to catalina.out."
    /usr/local/bin/portal-status
    sleep 10
    ###
    su $TOMCAT_USER -c "${CATALINA_HOME}/bin/catalina.sh stop"
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && rm -f /var/lock/subsys/tomcat /var/run/tomcat.pid
    rm -rf /usr/local/tomcat/work/*
}

# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        stop
        # Ugly hack
        # We should really make sure tomcat
        # is stopped before leaving stop
        sleep 2
        start
        ;;
  *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
esac

exit $RETVAL

Copy your JDBC jar to your /usr/local/tomcat/common/lib directory. For example we copy ojdbc14.jar (Oracle jdbc thin client) and jtds-x.x.x.jar (MS SQLServer jdbc driver) because we connect to Oracle and MS SQL using JNDI and DBCP.

ROOT Context

/usr/local/tomcat/webapps/ROOT/index.jsp
<%@ page errorPage="error.jsp" %>
<%
  // we need to do the following instead if tomcat is behind mod_jk with ssl to force ssl
  response.sendRedirect("https://"+request.getServerName() + "/uPortal/render.userLayoutRootNode
.uP");
%>

In the Tomcat 5.x line you will need to edit the web.xml in ROOT/WEB-INF as well, as it maps requests for /index.jsp to the index_jsp servlet. Comment out the <servlet-mapping> and add this code inside the <web-app> block.

<welcome-file-list>
        <welcome-file>
            index.jsp
        </welcome-file>
</welcome-file-list>

Also, I placed a robots.txt file in ROOT:

/usr/local/tomcat/webapps/ROOT/robots.txt
User-agent: *
Disallow: /

web.xml

Configure the default session timeout to your desired session timeout.

Portal Settings

In portal.properties set the following to avoid the mixed-content warning when hosting uPortal over ssl:

properties/portal.properties
...
org.jasig.portal.serialize.ProxyWriter.resource_proxy_enabled=on
org.jasig.portal.serialize.ProxyWriter.resource_proxy_rewrite_prefix=/uPortal/servlet/ProxyServlet/


...

Production Installation Notes:

We have found in our uPortal performance tests completed fall 2003 that leaving on debug information in the class files DOES NOT slow down the portal significantly. The debug information is very important to have when dianosing a stack trace as without it there are no line numbers printed in the stack trace.