Katterige Java: Tomcat

 
16 januari 2008

Tot op heden is er nog niks met Java gedaan, maar dat gaat nu veranderen. Om te beginnen moeten we zorgen voor een JDK:

  • apt-get install sun-java5-jdk.

Tenminste, als je op een x86 of compatible systeem aan het werk bent. Op m’n Mac Mini was het wat meer werk:

  • apt-get install java-package libstdc++5
  • download de Linux versie van IBM’s JDK versie 5 voor 32-bit PowerPC
  • hernoem deze naar ibm-java2-sdk-50-linux-ppc.tgz
  • login als gewone gebruiker en voer het commande make-jpkg ibm-java2-sdk-50-linux-ppc.tgz uit
  • installeer als root de resulterende .deb met dpkg -i ibm-j2sdk1.5_1.5.0_powerpc.deb

Let op dat de meegeleverde versies in Debian Etch van de open source Java implementaties (gij/gcj, kaffe, sablevm) niet voldoende ver ontwikkeld zijn om gebruikt te worden. Dat zal met de verdere ontwikkeling van OpenJDK/IcedTea verbeteren. Als je aptitude of synaptic gebruikt in plaats van apt-get kan het zijn dat je nu een van deze open source versies als standaard implementatie gebruikt. Pas dit aan met behulp van het script update-java-alternatives.

De JDK was een opmaat voor een ander, erg populair stuk software van de Apache Foundation: Tomcat. Installeer deze met apt-get install tomcat5.5 tomcat5.5-admin ant-optional jsvc.

Er zit in de Debian versie van Tomcat helaas een bugje, die de manager applicatie van Tomcat niet laat werken. Om dat te verhelpen moet het volgende worden toegevoegd aan /etc/tomcat5.5/policy.d/50user.policy

grant codeBase “file:/usr/share/struts1.2/struts.jar” {
permission java.security.AllPermission;
};

Hoewel deze aanpassing al is gemaakt in de versie van Tomcat in Ubuntu (in ieder geval in versie 7.10, mogelijk ook eerdere al) zijn er andere problemen met die versie die ik niet kon verhelpen in latere fases van de installatie. Wil je toch Ubuntu blijven gebruiken, dan raad ik aan om een installatie buiten het package management systeem om te doen.

De standaard installatie van Tomcat op Debian is terug te vinden via http://:8180 en de manager applicatie op http://:8180/manager/html. De eerste toont een geheel witte pagina (niet de gebruikelijke introductie pagina zoals de versie die bij Apache gedownload kan worden) en de tweede toont een pop-up die vraagt om een username en wachtwoord.

Voor we dit gaan oplossen is het wel wat prettiger als alle acties op de server via dezelfde ingang kunnen verlopen. Daarvoor kan mod-jk ingezet worden. Hiermee kan verkeer naar de Apache webserver doorgesluisd worden naar een achterliggende servlet container. Installeren gaat met apt-get install libapache2-mod-jk.

Pas als eerste de configuratie aan in /etc/libapache2-mod-jk/workers.properties. Zet daarin de verwijzingen naar tomcat_home en java_home goed. Dit is afhankelijk van je installatie, maar standaard pakketten in Debian zijn meestal te vinden in /usr/share.

Maak ook een status worker aan door de worker.list uit te breiden (worker.list=status,ajp13_worker) en de regel worker.status.type=status toe te voegen.

Maak naast de workers.properties nog een uriworkermap.properties aan en zet daar de volgende regel in: /manager/*=ajp13_worker. Daarmee is in ieder geval de manager applicatie straks beschikbaar.

Nu wordt het tijd om Apache te vertellen wat er met die nieuwe mod moet gebeuren. Maak daarvoor de file /etc/apache2/mods-available/jk.conf aan met de volgende inhoud:

JkWorkersFile “/etc/libapache2-mod-jk/workers.properties
JkLogFile “/var/log/apache2/mod-jk.log
JkLogLevel info
JkLogStampFormat “[%a %b %d %H:%M:%S %Y]”
JkRequestLogFormat “%w %V %T”
JkOptions +ForwardKeySize +ForwardURICompatUnparsed -ForwardDirectories
JkShmFile “/var/run/jk.shm”

Edit vervolgens default-ssl en voeg daar aan VirtualHost het volgende toe:

JkMountFile “/etc/libapache2-mod-jk/uriworkermap.properties”

<Location /jkstatus >
JkMount status
Order deny,allow
Deny from all
Allow from 127.0.0.1
# optionally allow from additional ip addresses as needed

</Location>

Doe nog een a2dismod jk en vervolgens een a2enmod jk om de configuratie goed in te stellen en herstart vervolgens Apache. Om te testen of bovenstaande goed werkt, kun je naar http:///jkstatus surfen. Daar moet je een overzicht te zien krijgen van de verschillende workers, minus de status worker.

Wat we nog niet werkend hebben is de authenticatie in Tomcat. Standaard staat deze ingesteld op een lijst met gebruikers en rollen in een xml bestand. Dat kan als volgt omgezet worden naar een configuratie die gebruik maakt van de database die we eerder ook al voor Apache hebben opgezet. Begin met het aanpassen van /etc/tomcat5.5/server.xml en voeg daar aan de GlobalNamingResources het volgende toe:

<Resource name=”jdbc/wwwauth” auth=”Container”
type=”javax.sql.DataSource”
driverClassName=”org.postgresql.Driver”
url=”jdbc:postgresql:wwwauth”
username=”apache2” password=”secretpwd”
maxActive=”20” maxIdle=”10” minWait=”-1” />

Zoek daarna naar de UserDataBaseRealm en vervang deze door het volgende:

<Realm className=”org.apache.catalina.realm.DataSourceRealm”
dataSourceName=”jdbc/wwwauth”
digest=”MD5”
userTable=”users” userNameCol=”username”
userCredCol=”password”
userRoleTable=”groups” roleNameCol=”groupname” />

In plaats van een DataSourceRealm zou ook een JDBCRealm gebruikt kunnen worden, alleen kreeg ik die met dezelfde database connectie niet aan de praat. Bovenstaande was daarna in 5 minuten gerealiseerd.

Voordat nu tomcat opnieuw opgestart kan worden, moet er nog wel een JDBC-driver geinstalleerd worden. Die van PostgreSQL is dat met apt-get install libpg-java. Link of kopieer de jar in /usr/share/java naar /usr/share/tomcat5.5/common/lib en tomcat kan herstart worden.

Zorg er nog wel voor dat er in de database een gebruiker staat die in de groep manager zit, anders kun je nog niet inloggen in de manager applicatie.

Als Tomcat alleen nog via Apache benaderd mag worden is het handig om de Connector in server.xml, die de toegang via poort 8180 regelt, uit te schakelen.

Nieuwe applicaties die via de manager deployed worden, moeten nog wel toegevoegd worden aan uriworkermap.properties. Deze file wordt elke 60 seconden opnieuw ingelezen om wijzigingen te verwerken, dus Apache of Tomcat hoeven niet opnieuw opgestart worden. Voor elke applicatie moet het volgende worden toegevoegd:

/app = worker
/app/* = worker


Werken met ?
Kijk dan bij onze mogelijkheden voor starters en/of ervaren IT'ers.


Categorieën: Development

Tags: , , , , , ,