There is a bunch of step by step tutorials and good references about putting Apache
in front of Tomcat
around net.
Nevertheless, I wrote this article, mainly for myself, in case I come up with same requirement in sometime later.
First, let me give a little background information about problem. We have served JIRA
through Tomcat
for only our
internal use so far. Recently, we have come up with a requirement of letting customers located outside to access JIRA
.
The network architecture doesn’t allow direct access to internal systems, instead there is a DMZ
to put those services
which need to be accessed from outside world. However, it was not a wise approach to move JIRA
installation to DMZ
zone to open it outside world. Therefore, we decided to put an Apache HTTP Server
into DMZ
and make it forward
requests to Tomcat
instance running in internal network. Hence, solution will be built upon Apache 2.2.x
and
Tomcat 6.0.x
.
In order to integrate Apache
with Tomcat
, mod_jk
module needs to be loaded and configured. Here are the main steps
and configuration parts to achieve this.
Configure a Connector
with AJP
protocol on port 8009
in Tomcat
’s server.xml
. It’s probably available in the
config file but commented, just uncomment it.
<Connector port="8009" enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />
Download mod_jk.so
and put it into modules
directory of Apache
installation. We need to create and configure
workers.properties
file in order to tell Apache
about target Tomcat
host and port. There is a full featured and
a minimal workers.properties
file in source distribution of mod_jk
. The minimal configuration was enough for us:
# The workers that jk should create and work with
worker.list=wlb,jkstatus
# Defining a worker named ajp13w and of type ajp13
# Note that the name and the type do not have to match.
worker.ajp13w.type=ajp13
worker.ajp13w.host=jira.hostname.com
worker.ajp13w.port=8009
# Defining a load balancer
worker.wlb.type=lb
worker.wlb.balance_workers=ajp13w
# Define status worker
worker.jkstatus.type=status
Configure Apache
to load and run mod_jk
module. It is done inside httpd.conf
file. However, it is better to put
those mod_jk
specific commands into its own conf file and include it into httpd.conf
. That way becomes easier to
enable/disable mod_jk
by just commenting/uncommenting this include line.
Following piece is from inside newly created httpd-mod_jk.conf
file:
# Load mod_jk module
LoadModule jk_module modules/mod_jk.so
# Where to find workers.properties
JkWorkersFile E:/work/tools/Apache2.2/mod_jk/workers.properties
# Where to put jk shared memory
JkShmFile E:/work/tools/Apache2.2/mod_jk/mod_jk.shm
# Where to put jk logs
JkLogFile E:/work/tools/Apache2.2/mod_jk/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel info
# Select the timestamp log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
# Send all requests to worker named wlb
JkMount /* wlb
You can find detailed information about meanings of those commands in the mod_jk
’s development site. You simply load
mod_jk
module, tell Apache
about place of the workers.properties
file, and define which requests will be handled
by defined workers. Here we forward all incoming requests to the Tomcat
instance. It is possible to restrict which
requests to be forwarded, and to forward requests to different workers as well.
Following piece is from inside httpd.conf
file:
#Tomcat integration
Include conf/extra/httpd-mod_jk.conf
Finally, you just need to restart your Apache
and Tomcat
instances for changes to take effect.