Installer et configurer mod_jk



Le module mod_jk est développé dans le cadre du projet Tomcat et est conçu pour faire communiquer un serveur Web Apache avec une instance de Tomcat, avec le protocole AJP. Il peut être aussi être utilisé pour faire communiquer Apache Web Server avec d'autres serveurs d'applications Java, comme WildFly, JBoss AS ou Glassfish.

Installation

Contrairement à mod_proxy, son concurrent, ce module n'est pas inclus dans les distributions Apache. Il doit donc être installé indépendamment.

Installer le module signifie placer le fichier mod_jk.so dans le répertoire des modules de Apache Web Server. L'emplacement de ce répertoire dépend de la distribution qu'on utilise.

cp mod_jk.so $httpd_home/modules/

Puis il faut déclarer ce module dans httpd.conf.

LoadModule jk_module modules/mod_jk.so

Windows

Le binaire pour Windows peut être téléchargé depuis le site des connecteurs Tomcat.

Linux

Le projet Tomcat ne fournit pas de binaire pour Linux. Il faut donc le compiler soi-même ou éventuellement utiliser les packages natifs.

Pour Ubuntu (testé avec la version 14.04) :

sudo apt-get install libapache2-mod-jk

Mac OS X

Il n'y a pas de distribution binaire pour Mac OS X. Il faut donc recompiler mod_jk à partir du code source.

Le script ci-dessous a été testé sous Mac OS X 10.9, avec Xcode installé préalablement, pour mod_jk 1.2.40.

sudo ln -s /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain /Applications/Xcode.app/Contents/Developer/Toolchains/OSX10.9.xctoolchain
wget http://mir2.ovh.net/ftp.apache.org/dist/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.40-src.tar.gz
tar -zxf tomcat-connectors-1.2.40-src.tar.gz
cd tomcat-connectors-1.2.40-src/native
./configure CFLAGS='-arch x86_64' APXSLDFLAGS='-arch x86_64' --with-apxs=/usr/sbin/apxs
sudo make
sudo make install

Après ça, le binaire est /usr/libexec/apache2/mod_jk.so.

Attention, ce script ne fonctionne qu'avec l'instance Apache fournie avec Mac OS. Si vous utilisez une instance d'Apache installée par homebrew, il faudra pointer sur le bon apxs :

./configure CFLAGS='-arch x86_64' APXSLDFLAGS='-arch x86_64' --with-apxs=/usr/local/sbin/apxs

Ou si vous utilisez XAMPP, le make ci-dessus ne fonctionne pas. Ce script ci-dessous fonctionne (avec XAMPP 1.8.3 / Apache 2.4) :

./configure CFLAGS='-arch x86_64' APXSLDFLAGS='-arch x86_64' --with-apxs=/Applications/XAMPP/xamppfiles/bin/apxs
cd apache-2.0/
make -f Makefile.apxs install

Attention, si vous faites compiler pour plusieurs cibles, sur la même machine, pensez à nettoyer entre chaque build :

sudo make clean

Configuration

httpd-jk.conf

Pour configurer mod_jk, on travaille dans httpd.conf ou dans un fichier (httpd-jk.conf) qui est inclus dans httpd.conf. Là aussi, l'organisation des inclusions dépend de la distribution utilisée ; certaines distributions incluent tous les fichiers d'un répertoire prédéfini (extra, mods-enabled,...) ou font des inclusions fichier par fichier.

Dans ce fichier httpd-jk.conf, on fait pointer le module sur le fichier qui configure les workers, on définit les logs et quelques autres paramètres.

   JkWorkersFile extra/workers.properties
   JkLogFile logs/mod_jk.log
   JkLogLevel info
   JkShmFile logs/mod_jk.shm
   ...

Ensuite, on associe des URLs à des workers avec des points de montage JK.

   ...
   JkMount /swmsg tomcat1
   JkMount /swmsg/* tomcat1
   ...

Enfin, on peut définir les URLs des pages d'administration.

   ...
   <Location /jk-status>
       JkMount jk-status
       Order deny,allow
       Deny from all
       Allow from 127.0.0.1
   </Location>
   <Location /jk-manager>
       JkMount jk-manager
       Order deny,allow
       Deny from all
       Allow from 127.0.0.1
   </Location>

workers.properties

Ce fichier permet de définir les workers, c'est à dire les cibles associées au module. Il y a trois types de cibles : les workers concrets (instances Tomcat, Wildfly, JBoss,...), les workers d'administration (status) et les workers virtuels (lb).

La page de suivi peut être en lecture seule ou en lecture/écriture. Il est d'ailleurs possible de définir plusieurs workers de type status, chacun aura sa propre URL de montage.

worker.jk-status.type=status
worker.jk-status.read_only=true

worker.jk-status.type=manager
worker.jk-status.read_only=false

Dans le fichier httpd-jk.conf, un point de montage utilise le worker tomcat1. Il doit donc être défini dans workers.properties, comme un worker de type ajp13, qui accède à une instance Tomcat locale ou distante.

worker.tomcat1.host=127.0.0.1
worker.tomcat1.port=8009
worker.tomcat1.type=ajp13

Enfin, en début de fichier, on fait la liste des workers qui pourront être montés :

worker.list=jk-status,jkmanager,tomcat1

Load balancing

On configure le load balancer dans le fichier workers.properties. Le balancer est là pour envoyer les requêtes entre différents workers concrets (de type ajp13).

worker.balancer.type=lb 
worker.balancer.balance_workers=instance1,instance2

worker.instance1.host=127.0.0.1 
worker.instance1.port=8009
worker.instance1.type=ajp13

worker.instance2.host=127.0.0.1
worker.instance2.port=8109
worker.instance2.type=ajp13

Ensuite, on monte le balancer sur l'URL de l'application, dans le fichier httpd-jk.conf.

JkMount /swmsg-web balancer
JkMount /swmsg-web/* balancer

Les requêtes seront alors réparties sur les deux instances.