osx

Configuring Apache with Tomcat on OSX Leopard

Note that to start serving Java and run Java based web applications it is not essential to use Apache. Tomcat is a perfectly good http server and is even used by many in a production environment, however it is more common to separate concerns, leaving Apache to deal with the serving of static pages and Tomcat to deal with any application logic. This set up can also more easily facilitate load-balancing. Add to this the increasing popularity of using Apache’s .htaccess files to transform querystrings to more search engine readable URLs and you might find yourself with compelling reasons to get Apache and Tomcat talking.

For those interested in the debate – Do I still need Apache Httpd? is worth a read.

You will need to have Tomcat already installed – fortunately there are already various excellent tutorials on how to do this scattered around the web.

To start with, it may be worth detailing where the various parts of the pre-installed Apache system are in OSX.
(I’m running Mac OS X Version 10.5.6 – Leopard)

Web root (htdocs) :
/Library/Webserver/Documents
Configuration file :
/private/etc/apache2/http.conf
Apache Log files :
/private/var/log/apache2/
System Log file :
/private/var/log/system.log
Modules :
/usr/libexec/apache2/
Apache Binary :
/usr/sbin/apachectl
Root in a browser :
http://localhost/

You might also find it useful to log in as root unless you are happy using sudo.

It also might be an idea to show hidden files in finder, to do this type:

defaults write com.apple.Finder AppleShowAllFiles YES

at a command line and restart Finder.

To start / restart apache:

Apple menu -> System Preferences -> Sharing -> Web Sharing (tickbox)

Activating / deactivating the tickbox effectively starts and stops Apache.

Or at the command line you can type any of the following:

apachectl start
apachectl stop
apachectl restart

You can verify that Apache has started  by going to http://localhost/ in your browser and checking that the Apache default page appears.

So what do we have to do to get Apache and Tomcat talking to each other? First we need a connector. Currently there is a lot of discussion in the community over whether to use mod_jk or mod_proxy.

I’m going to start with mod_jk

Unfortunately the version available at the apache site (1.2.25) for Mac OSX is not compatible with Leopard.

If you want to create a version that is, you will need to build your own or download a pre-compiled version for Leopard – as kindly provided here – although you do this at your own risk.

Once you have downloaded/created a compatible version of mod_jk, rename the file mod_jk.so place in the modules directory and change the permissions to 755 with:

chmod mod_jk.so 755

(you will need to place sudo in front of this if you are not logged in as root).

Next, create a folder for the mod_jk log file to be written to. I created a directory : private/var/log/mod_jk

Open the http.conf (Note you may want to make a backup of this file before editing it). Locate the area in the file where the modules are loaded. (You should find may lines starting with the text LoadModule). Append your own LoadModule line :

LoadModule jk_module libexec/apache2/mod_jk.so

add to this the location of the log file:

JkLogFile /private/var/log/mod_jk/mod_jk.log

(This is assuming that your modules reside in libexec/apache2/ otherwise you will need to specify your own modules directory.)

Next it might be prudent to check that Apache is still working, so start it or restart it and point your browser at http://localhost/ If you are no longer seeing the apache page you should check /private/var/log/system.log and/or /private/var/log/apache2/error.log for clues.

Also, check that the mod_jk.log file has been created.

Now we need to define a workers.properties file and put this in /private/etc/apache2/mod_jk/

A workers.properties file is effectively a listener for Apache which tells it when to redirect requests to Tomcat. Mine looks like this:

workers.tomcat_home=/Library/tomcat/tomcat55
workers.java_home=/System/Library/Frameworks/JavaVM.framework/Versions/Current
worker.list=ajp13
worker.ajp13.port=8009
worker.ajp13.host=localhost
worker.ajp13.type=ajp13

Note that I often have different versions of Tomcat installed on my system which is why my workers.tomcat_home points at /Library/tomcat/tomcat55 but you should point at it a wherever you have installed Tomcat on your system.

Finally, tell Apache about your workers.properties file and a few other things so replace the lines you have added to httpd.conf with the following:

# mod_jk configuration
LoadModule jk_module libexec/apache2/mod_jk.so

# path to workers.properties file
JkWorkersFile /etc/apache2/mod_jk/workers.properties

# path to mod_jk log file
JkLogFile /private/var/log/mod_jk/mod_jk.log

# mod_jk log level [debug/error/info]
JkLogLevel info

# mod_jk log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "

# patterns for mounting
JkMount /servlet/* ajp13
JkMount /*.jsp ajp13

# end mod_jk configuration

Restart Apache and you should be in business!

I’ll maybe come back and tackle mod_proxy but for now I’ll point you towards Michael Scepaniak’s recent article mod_jk fail, mod_proxy success.

MarkB

Tags: , , , ,

Monday, April 6th, 2009 apache, configuration, osx 2 Comments