Hello All,
I have been looking through the email archives to get instruction on how
to set-up multiple instances of Tomcat on a single machine. I found lots
of good emails but no single source for what I wanted to accomplish.
With the information I gathered, I was able to get a working system, where
I can start and stop Tomcat independently of other Tomcat instances. In
the process, I also put together a document of the procedure I used. This
document follows below.
If possible, I would really appreciate any feedback. The system described
below works, but I'm still not convinced it is the best configuration. I
hope, in any event this document may help others as well.
PLEASE NOTE, this document is a draft version and does not offer any
gaurantees to anyone if they choose to use it for building their own
sites.
I hope to include comments into this document as time goes by and keep
updating it for everyone. Thanks in advance for any comments and I hope
this Open Source Community can benefit from it.
Document Follows:
Our Environment:
Hardware Software
System: Interserv90 OS: TurboLinux Server 7.0
Processor: PIII 450Mhz Kernel: 2.4.9
Ram: 256M Web Server: Apache 1.3.22-2
SWAP: 520M Java jdk 1.3.1_02
JServer Tomcat 3.2.4
Connector mod_jk.so (ajp12 +
ajp13)
Prerequisites:
� You must have already installed both jdk 1.3.1_02 and tomcat 3.2.4.
� JAVA_HOME should be set to the directory in which jdk 1.3.1_02 is
installed.
In this example the java rpm installed java into /usr/java and then we:
ln
JAVA_HOME=/java; export JAVA_HOME
� TOMCAT_HOME should be set to the directory in which tomcat-3.2.4 is
installed.
In this example we installed tomcat into /usr/local/src and then:
ln
TOMCAT_HOME=/tomcat; export TOMCAT_HOME
� Set JAVA_HOME and TOMCAT_HOME in /etc/profile, so they reset on each
reboot.
� Get the appropriate mod_jk from. (either mod_jk-eapi or mod_jk-noeapi)
http://jakarta.apache.org/builds/jakarta-tomcat/release/v3.2.3/bin/linux/i386/
rename it to mod_jk.so
place it in apache
�libexec�
In this example we downloaded mod_jk-eapi to /root
mkdir /etc/httpd/libexec
mv /root/mod_jk-eapi /etc/httpd/libexec/mod_jk.so
Note, If you downloaded the wrong mod_jk, apache will tell you upon its
next startup. There are only two to choose from, simply go back and get
the other one to use.
Note:
Although, not entirely necessary, this document instructs that a separate
directory be set-up for each JVM in order to better separate the
functionality of each JVM. For this example, the individual JVM
directories have been placed under a new directory called /contexts.
Although we will have a separate directory for each JVM under /contexts,
we still only have one TOMCAT_HOME. You do not need to set a TOMCAT_HOME
for each JVM.
Procedure:
(Two new and INDEPENDENT JVM
example below. Instructions that include �site#� apply to both sites)
1. Make �/contexts� and create a new directory for each site within
/contexts.
mkdir /contexts
cd /contexts
mkdir site1
mkdir site2
2. Copy the contents of your original Tomcat Installation into each site
directory.
cp -R /$TOMCAT_HOME /contexts/site1
cp -R /$TOMCAT_HOME /contexts/site2
3. You should now have the following directories & files in each site
directory:
ls -p /contexts/site#
bin/ doc/ lib/ logs/ src/
work/
conf/ KEYS LICENSE RELEASE-NOTES webapps/
4. set-up your �ajp� workers that will eventually be used by apache to
redirect requests to Tomcat. Using a text editor, modify the
/$TOMCAT_HOME/conf/workers.properties file. Note: this is the only
workers.properties file that you have to modify. Ignore the
workers.properties files in the �conf� directories below /contexts/site#.
In this example, we made the following changes to:
/$TOMCAT_HOME/conf/workers.properties
a. set
workers.java_home=/java
b. set
workers.tomcat_home=/tomcat
c. comment out ps=\ and uncomment ps=/
#ps=\
ps=/
d. set-up two new workers for each JVM. There is no harm in leaving the
default workers (ajp12 & ajp13) in here, but we will not be using them in
this example.
worker.list=ajp12, ajp13, ajp12_site1, ajp12_site1, ajp13_site2,
ajp13_site3
default workers new workers
4.Continued.
e. Now, add the following four lines for each new worker (again, just
ignore the default workers, they are already configured but will not be
used). Be careful none of the workers are using the same port.
worker.ajp12_site1.port8010 NOTES:
worker.ajp12_site1.host=localhost
worker.ajp12_site1.type=ajp12 two ports to be designated
worker.ajp12_site1.lbfactor=1 later in server.xml for site1
worker.ajp12_site1.port8011
worker.ajp12_site1.host=localhost
worker.ajp12_site1.type=ajp13
worker.ajp12_site1.lbfactor=1
worker.ajp12_site2.port8012
worker.ajp12_site2.host=localhost
worker.ajp12_site2.type=ajp12 two ports to be designated
worker.ajp12_site2.lbfactor=1 later in server.xml for site2
worker.ajp12_site2.port8013
worker.ajp12_site2.host=localhost
worker.ajp12_site2.type=ajp13
worker.ajp12_site2.lbfactor=1
Your workers.properties file has now been configured. Later these workers
will be used in apache to handle connections destined for Tomcat. You can
add as many workers as you want in this manner. Note: you could just use
ajp12 type by itself, but the ajp13 type is faster. The reason we use
both, is because the ajp12 type worker is still needed in the shutdown
process of Tomcat. In addition, you can load balance your workers, even
across different machines. That topic, however, extends beyond the scope
of this document.
5. Each JVM has its own server.xml file located under
/contexts/site#/conf. You will need to modify the server.xml file for
each JVM.
a. cd /contexts/site#/conf and open the server.xml file with your
favorite editor.
b. Move the three (3) <Logger > directives to the bottom of each of the
server.xml files, (after </Context Manager> but before </Server>). If
you do not move these Logger directives, your log files will be placed in
the original /$TOMCAT_HOME/log directory, rather than the
/contexts/site#/log directory, and the whole JVM may error.
c. Modify the <ContextManager � > line in each server.xml file to reflect
the settings for each site.
site1's server.xml file would have the following line. The following is a
single line.
<ContextManager debug=�0� home=�/contexts/site1�
workDir=�work_site1� showDebugInfo=�true� >
site2's server.xml file would have the following line. The following is a
single line.
<ContextManager debug=�0� home=�/contexts/site2�
workDir=�work_site2� showDebugInfo=�true� >
5. Continued
d. Modify the <!- - ======= Connectors ======= - -> section.
i. comment out the <Connector> for port 8080 in both server.xml files,
otherwise both JVMs will attempt to connect to the 8080 port. You would
get an error when you try to start your second JVM.
<!--
<Connector className=�org.apache.tomcat.service.PoolTCPConnector�>
<Parameter
name=�handler�
value=�org.apache.tomcat.service.http.HttpConnectionHandler�/>
<Parameter name=�port�
value=�8080� />
</Connector>
-->
ii. modify the ajp12 and ajp13 connectors, and assign them the appropriate
ports as they
were set-up in the workers.properties file.
server.xml file for site1
<!--comments, etc -->
<Connector className=�org.apache.tomcat.service.PoolTCPConnector�>
<Parameter
name=�handler�
value=�org.apache.tomcat.service.http.Ajp12ConnectionHandler�/>
<Parameter name=�port� value=�8010� />
</Connector>
<!--comments, etc -->
<Connector className=�org.apache.tomcat.service.PoolTCPConnector�>
<Parameter
name=�handler�
value=�org.apache.tomcat.service.http.Ajp13ConnectionHandler�/>
<Parameter name=�port� value=�8011� />
</Connector>
server.xml file for site2
<!--comments, etc -->
<Connector className=�org.apache.tomcat.service.PoolTCPConnector�>
<Parameter
name=�handler�
value=�org.apache.tomcat.service.http.Ajp12ConnectionHandler�/>
<Parameter name=�port� value=�8012� />
</Connector>
<!--comments, etc -->
<Connector className=�org.apache.tomcat.service.PoolTCPConnector�>
<Parameter
name=�handler�
value=�org.apache.tomcat.service.http.Ajp13ConnectionHandler�/>
<Parameter name=�port� value=�8013� />
</Connector>
5. Continued
e. Under the <!-- ====== special webapps ======= --> section, and after
the <Context> directives, add a virtual host for each site in their
respective server.xml files. Note, each site has its own directory under
/contexts and each site will have its own contextname under
/context/webapps. You can make this contextname anything you want.
i. in server.xml for site1, where site1
<Host name=�192.168.1.100�>
<Context path=�/site1contextname�
docBase=�webapps/site1contextname�
debug=�0� />
</Host>
i. in server.xml for site2, where site1
<Host name=�192.168.1.200�>
<Context path=�/site2contextname�
docBase=�webapps/site2contextname�
debug=�0� />
</Host>
f. Your server.xml files are now configured. These files will be used
when you start and stop Tomcat. You may want to rename these files so you
can better differentiate between them. Example�
cd /context/site1/conf
mv server.xml server_site1.xml
cd /context/site2/conf
mv server.xml server_site2.xml
6. You are now ready to modify Apache to use the workers to send requests
to Tomcat.
a. Open httpd.conf with your favorite text editor. On my TurboLinux 7.0,
this file is located in /etc/httpd/conf.
b. add the following lines that will be required for apache to load and
use mod_jk.so.
LoadModule jk_module libexec/mod_jk.so
AddModule mod_jk.c
c. add the following lines that will be required to tell apache where to
get worker configurations and where & how to log.
#Configure mod_jk
JkWorkersFile /tomcat/conf/workers.properties
JkLogFile /tomcat/logs/mod_jk.log
JkLogLevel error
6. Continued
d. configure your vitual hosts in httpd.conf
excerpt from httpd.conf....
# Virtual Host for site1
<VirtualHost 192.168.1.100:80>
DocumentRoot �/contexts/site1/webapps/site1contextname
ServerName site1.yourdomain.com
ServerAdmin email of server admin
JkMount /* ajp13_site1
JkMount /servlet/* ajp13_site1
JkMount /site1contextname/*.jsp ajp13_site1
RewriteEngine On
RewriteRule ^/$ /site1contextname/index.jsp [NC,R]
</VirtualHost>
# Virtual Host for site2
<VirtualHost 192.168.1.200:80>
DocumentRoot �/contexts/site2/webapps/site2contextname
ServerName site2.yourdomain.com
ServerAdmin email of server admin
JkMount /* ajp13_site2
JkMount /servlet/* ajp13_site2
JkMount /site2contextname/*.jsp ajp13_site2
RewriteEngine On
RewriteRule ^/$ /site2contextname/index.jsp [NC,R]
</VirtualHost>
Ultimately, any requests that come in, Apache will determine if they
should be sent to one of the virtual hosts. Inside the virtual host, if
that request matches anyone of the mount points designated by JkMount,
that request will be sent to the associated worker.
Note: The above virtual hosts from httpd.conf use mod_rewrite directives
to redirect the incoming URL requests to the appropriate context. Tomcat
can handle the redirection, but I found it easier to have Apache do it
here. The R informs rewrite to redirect the request and the NC tells it
not to be case sensitive.
For example a client that requests:
http://site1.Yourdomain.com/
They will be automatically redirected to:
http://site1.Yourdomain.com/site1contextname/index.jsp
In order for the rewrite directives to work, make sure you have a
LoadModule and AddModule line for mod_rewrite.so in your httpd.conf file.
Most all apache web servers today have the rewrite module included by
default.
7. Starting and Stopping the Independent JVMs
To start site1, do the following:
cd /contexts/site1/bin
./startup.sh
To shutdown site1, do the following:
cd /contexts/site1/bin
./startup.sh
To start site2, do the following:
cd /contexts/site2/bin
./startup.sh
To shutdown site2, do the following:
cd /contexts/site2/bin
./startup.sh
Note, everytime you add a new site, you must restart apache. To enhance
security for you sites, you can add an .htaccess file in the /contexts
directory that designates additional directory, location and file
container directives. Consult you Apache documentation on how to set up
.htaccess files. Lastly, you will find helpful security directives in the
auto-generated mod_jk-auto.conf. that you can copy into your .htaccess
file. The mod_jk-auto.conf file is not needed when you have multiple JVMs
(aka. Multiple Tomcat Instances). Even-though this file is not used in
this example, it is still generated by default in Tomcat 3.2.4. In fact
many of the files in your /contexts/site#/conf directory are not used in
this example.
Thanks for Reading!
Rob Walther
--
To unsubscribe: <mailto:[EMAIL PROTECTED]>
For additional commands: <mailto:[EMAIL PROTECTED]>
Troubles with the list: <mailto:[EMAIL PROTECTED]>