Using mod_jk 1.2.x with JBoss/Tomcat bundle and Apache2
This wiki outlines the various steps required to install a basic load-balancing solution based on JBoss/Tomcat and mod_jk 1.2.
Step 1: Download Apache2 Web Server
Get the latest Apache2 package from Apache.org and install it. We require no special configuration, just use the default settings.
In the following steps, APACHE_HOME will represent the Apache install directory.
Step 2: Download mod_jk 1.2.x
Download the latest package available from Jakarta's 'binary downloads' page . The link is located under the name 'Tomcat Web Server Connectors'. Again, make sure you download mod_jk1.2 (JK 1.2 Binary Releases).
Rename the lib mod_jk.so (or mod_jk.dll on Windows) and drop it in APACHE_HOME/modules directory.
Note:* the below conf files only work with mod-jk 1.2.10 (or higher), 2.6 does not support several of the directives given
I had to build from source as the supplied binaries did not include RH Enterprise Linux
y build instructions are here http://www.paidtech.com/build-jk.html
Step 3: Setup Apache
Add this line at the very bottom in APACHE_HOME/conf/httpd.conf :
# Include mod_jk configuration file Include conf/mod-jk.conf
Under APACHE_HOME/conf, create mod-jk.conf and populate it as follows:
# Load mod_jk module # Specify the filename of the mod_jk lib LoadModule jk_module modules/mod_jk.so # Where to find workers.properties JkWorkersFile conf/workers.properties # Where to put jk logs JkLogFile logs/mod_jk.log # Set the jk log level [debug/error/info] JkLogLevel info # Select the log format JkLogStampFormat "[%a %b %d %H:%M:%S %Y]" # JkOptions indicates to send SSK KEY SIZE JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories # JkRequestLogFormat JkRequestLogFormat "%w %V %T" # Mount your applications JkMount /application/* loadbalancer # You can use external file for mount points. # It will be checked for updates each 60 seconds. # The format of the file is: /url=worker # /examples/*=loadbalancer JkMountFile conf/uriworkermap.properties # Add shared memory. # This directive is present with 1.2.10 and # later versions of mod_jk, and is needed for # for load balancing to work properly JkShmFile logs/jk.shm # Add jkstatus for managing runtime data <Location /jkstatus></Location> JkMount jkstatus Order deny,allow Deny from all Allow from 127.0.0.1 </Location
mod_jk is ready to forward requests to JBoss instances. We need now to setup the workers
Step 5: Configuring workers
Under APACHE_HOME/conf, create workers.properties and populate it as follows:
# Define list of workers that will be used # for mapping requests worker.list=loadbalancer,status # Define Node1 worker.node1.port=8009 worker.node1.host=node1.mydomain.com worker.node1.type=ajp13 worker.node1.lbfactor=1 #worker.node1.local_worker=1 (1) worker.node1.cachesize=10 # Define Node2 worker.node2.port=8009 worker.node2.host= node2.mydomain.com worker.node2.type=ajp13 worker.node2.lbfactor=1 #worker.node2.local_worker=1 (1) worker.node2.cachesize=10 # Load-balancing behaviour worker.loadbalancer.type=lb worker.loadbalancer.balanced_workers=node1, node2 worker.loadbalancer.sticky_session=1 worker.loadbalancer.local_worker_only=1 worker.list=loadbalancer # Status worker for managing load balancer worker.status.type=status
(1) local_worker should be commented out to enable load-balancing. Otherwise, only fail-over is available.
Basically, this configures mod_jk to perform weighted round-robin load balancing with sticky sessions between two servlet containers node1 and node2(aka: Tomcat) listening on port 8009.
If you specify worker.loadbalancer.sticky_session=0, each request will be load balanced between node1 and node2. But when a user opens a Session on one server, it is a good idea to always forward this user's requests to the same server. Otherwise the user's session data would need to be synchronized between both servers. This is called a "sticky session", as the client is always using the same server he reached on his first request.
To enable session stickiness, you need to set worker.loadbalancer.sticky_session to 1.
Side Note: a non-loadbalanced setup with a single node required the "worker.list=node1" entry before mod_jk would function correctly. Without this setting I would only get a 500 error and no other useful messages in log or otherwise. -Harlequin516
Side Note: I tried a non-loadbalanced setup with a single node with the "worker.list=loadbalancer" and it did work correctly for me. In fact "worker.list=node1" caused a 500 error and no other useful messages in log or otherwise. I am using apache 2.0.52 with mod_jk 1.2.6. -amii_2009
Step 6: Restart Apache
Step 7: Configure Tomcat
To complete the configuration, we also need to name each node accordingly to the names specified in workers.properties.
Edit JBOSS_HOME/server/all/deploy/jbossweb-tomcat50.sar/server.xml (replace /all with your own server name)
Locate the <Engine&133;.> element and add an attribute jvmRoute:
<Engine name="jboss.web" defaultHost="localhost" jvmRoute="node1"> . </Engine>
The jvmRoute attribute must match the name specified in workers.properties.
Finally, we need to tell Tomcat to add the jvmRoute value to its session cookies so that mod_jk can route incoming requests.
Edit JBOSS_HOME/server/all/deploy/jbossweb-tomcat50.sar/META-INF/jboss-service.xml (replace /all with your own server name)
Locate the element with a name of UseJK, and set its value to "true":
JBoss Clustering Guide: Additional details about HTTP Session replication, workers.properties and other goodies.