GlassFish an Apache2 binden

Zwar ist GlassFish ein eigenständiger Webserver, der auch auf Port 80 lauschen kann, dennoch macht es durchaus Sinn, ihn einem Apache-Webserver zuzuordnen.
Zum Einen sind die Sicherheitsfeatures des Apache ausgereift und werden kontinuierlich gepflegt, und zwar unabhängig jedweder Herstellerfirma, die im Fall des GlassFish da Sun Microsystems wäre. Zum Anderen kann der Apache somit alle Aufgaben übernehmen, die kein Java benötigen und die Funktionen des GlassFish beschränken sich wirklich nur auf Java. Das kann sicherheitspolitisch ganz nützlich sein, vor allem aber bei eventuellen Fehlereingrenzungen.

Wie Apache2 mit GlassFish gekoppelt wird, soll hier gezeigt werden.

Voraussetzungen

Zunächst wird vorausgesetzt, dass tomcat-ajp.jar, commons-logging.jar und commons-modeler.jar unter /opt/glassfish/lib/ installiert sind. Dann wird ein aktuelles mod_jk benötigt, das hier erhältlich ist. Ein Blick nach

ll /usr/lib/apache2/modules/

lohnt sich, wenn sich nämlich dort mod_jk.so aus dem Debian-Paket 'libapache2-mod-jk' befindet. Dann sollte man auch diesen Connector verwenden. Dazu existieren die zwei Dateien

/etc/apache2/mods-available/jk.conf
/etc/apache2/mods-available/jk.load

die wie folgt verlinkt sein sollten

/etc/apache2/mods-enabled/jk.conf -> ../mods-available/jk.conf
/etc/apache2/mods-enabled/jk.load -> ../mods-available/jk.load

Wenn das nicht der Fall ist, dann erreicht man die Verlinkung mit

a2enmod jk_module

Installation

Zunächst bereiten wir den Apache2 auf, indem eine worker.properties-Datei für den mod_jk-Connector in /etc/apache2/ angelegt wird.

workers.properties

# Glassfish and Java configuration
workers.tomcat_home=/opt/glassfish
workers.java_home=/usr/lib/jvm/java-6-sun/
ps=/
worker.list=mainworker
# Definition for local worker using AJP 1.3
worker.mainworker.type=ajp13
worker.mainworker.host=localhost
worker.mainworker.port=8009
worker.mainworker.lbfactor=50
worker.mainworker.cachesize=20
worker.mainworker.cache_timeout=600
worker.mainworker.socket_keepalive=1
worker.mainworker.socket_timeout=300

 Die Dateien httpd.conf und jk.conf modifizieren wir so.

/etc/apache2/httpd.conf

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

# JkOptions indicate to send SSL KEY SIZE,
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories

# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T %U %q"

# Send all jsp requests to GlassFish
JkMount /*.jsp mainworker

# Send all /TestWeb/ requests to GlassFish
#JkMount /TestWeb/* mainworker

/etc/apache2/mods-available/jk.conf

<IfModule mod_jk.c>
JkWorkersFile /etc/apache2/workers.properties
JkLogFile /var/log/apache2/mod_jk.log
JkLogLevel debug
</IfModule>

Zusätzlich muss JkMount in der Datei

/etc/apache2/sites-available/default

<VirtualHost _default_:80>
      ServerName www.example.com
      ServerAdmin johnq@example.com

      JkMount /* mainworker

      ErrorLog /var/log/apache2/error.log
      LogLevel warn
      CustomLog /var/log/apache2/access.log combined
</VirtualHost>

bekannt gemacht werden.

Anschließend sollte der Apache2 neugestartet werden

/etc/init.d/apache2 restart

Läuft alles ohne Fehlermeldungen, kann man "JkLogLevel debug" getrost auf "JkLogLevel error" setzen und den Apache2 reloaden.

GlassFish-Integration

Jetzt kann zwar Apache2 den GlassFish ansprechen, allerdings weiß GlassFish noch nichts davon. Das wird hier eingerichtet.

Unter '/opt/glassfish/domains/domain1/config' existiert die Datei 'domain.xml', der der Eintrag

<jvm-options>-Dcom.sun.enterprise.web.connector.enableJK=8009</jvm-options>

hinzugefügt wird. Besser erreicht man das allerdings mit dem Befehl

/opt/glassfish-v2.1-b60e/bin/asadmin create-jvm-options -Dcom.sun.enterprise.web.connector.enableJK=8009

In beiden Fällen wird ein Neustart des GlassFish notwendig, um die Konfiguration neu zu laden.

/opt/glassfish/bin/asadmin stop-domain domain1 && /opt/glassfish/bin/asadmin start-domain domain1

GlassFish testen

Ob alles wie gewünscht von Apache2 an den GlassFish weitergeleitet wird, kann mit einer kleinen JSP-Datei testen, die in '/opt/glassfish/domains/domain1/docroot' abgelegt wird. Hier liegt zwar bereits eine index.html, die Startdatei des GlassFish, aber es schadet nicht, mit test.jsp eine Testdatei anzulegen:

<HTML>
<BODY>
<%
    // This is a scriptlet.  Notice that the "date"
    // variable we declare here is available in the
    // embedded expression later on.
    System.out.println( "Evaluating date now" );
    java.util.Date date = new java.util.Date();
%>
Hello!  The time is now <%= date %></BR>
</BODY>
</HTML>

Der Seitenaufruf 'http://my.domain.de/test.jsp' mit einem Browser liefert dann eine Ausgabe in der Art

"Hello! The time is now Fri Dec 25 12:44:52 CET 2009"

Damit leitet der Apache2 alle Anfrage nach jsp an GlassFish wie gewollt weiter.