Die folgende Anleitung bezieht sich auf eine XAMPP-Installation 1.7.2 unter Windows, sollte in weiten Teilen aber auch für andere Betriebssysteme gelten. Die verwendete Grails-Version ist 1.3.5. Ausserdem gehe ich davon aus, dass man direkten Zugriff zum Server hat und nicht über ein Web-Interface arbeitet. Hier die notwendigen Schritte, um eine Grails-Applikation auf einem XAMPP-Server unter Tomcat zu publizieren:
Voraussetzungen
- lauffähige Grails-Applikation
- XAMPP-Server inklusive Servlet-Container Tomcat installiert und konfiguriert
Spezielle Ports
Mein erster Stolperstein ist immer, dass Oracle XE unter Port 8080 läuft. Tomcat beansprucht ebenfalls diesen Port und Grails beim Testen gleich noch mal. Da Oracle eindeutig am schwierigsten umzukonfigurieren ist und ausserdem bei mir schon am längsten auf diesem Port läuft, bedeutet dies, Tomcat unter einem anderen Port laufen zu lassen.
Für Tomcat sucht man die Datei ..\xampp\xampp\tomcat\conf\server.xml. Der zu ändernde Text steht ungefähr in der Mitte und bezieht sich auf den Connector für das Http11AprProtocol. Es muss lediglich die Port-Nr geändert werden. Um Tomcat auf 8081 zu betreiben, ändert man das folgendermassen:
<Connector port="8081" protocol="org.apache.coyote.http11.Http11AprProtocol" connectionTimeout="20000" redirectPort="8443" />
Memory
Wenn wir gerade dabei sind, Tomcat zu konfigurieren, dann können wir gleich noch am Memory herumschrauben, dass für Java-Applikationen vorgesehen ist. Dies macht man in der Batch-Datei ..\xampp\xampp\tomcat\bin\setenv.bat mit folgender Zeile:
SET "JAVA_OPTS=-Xms256m -Xmx512m"
Damit teilt man Java für die anfängliche Grösse des Heap 256 MB und für die maximale 512 MB zu.
Nach der Konfiguration stoppt und startet man den Tomcat in der Management-Konsole des XAMPP-Servers neu. Mit
http://localhost:8081
testet man im Browser, ob Tomcat wirklich läuft. Die Grails-Applikation wird somit auch unter diesem Port laufen.
WAR-Datei
Als nächstes muss man für seine Grails-Applikation ein WAR-File erzeugen. Dazu öffnet man die Kommandozeile, wechselts in Root-Verzeichnis der Applikation und setzt den Befehl „grails war“ ab. Nach kurzer Zeit ist im Unterverzeichnis \target eine Datei mit der Endung .war zu finden (in älteren Grails-Versionen im Root). Die Standardeinstellung nimmt dabei automatisch die Produktions-Umgebung. Man muss also vorher dafür sorgen, dass diese in der Datei ..\grails-app\conf\DataSource.groovy richtig konfiguriert ist.
Der abgesetzte Befehl hat die unschöne Eigenschaft, den Dateinamen noch mit der Versions-Nr zu versehen. Damit diese Nummer später im Pfad der Applikation nicht erscheint, entfernt man am besten diesen Teil aus dem Dateinamen. Aus gTunes-0.1.war wird somit gTunes.war.
WAR-Datei auf Tomcat publizieren
Nun öffnet man Tomcat im Browser (siehe oben) und klickt auf den Link „Tomcat Manager“. Tomcat verlangt als erstes ein Passwort. Dieses findet man in der Datei ..\xampp\xampp\tomcat\conf\tomcat-users.xml. Anschiessend sucht man die Rubrik „WAR file to deploy“, klickt auf die Schaltfläche „Durchsuchen“, gibt die soeben erzeugte WAR-Datei an und schliesst mit Deploy ab. Nach kurzer Zeit erscheint in der Liste „Applications“ ein neuer Eintrag mit dem Titel der Grails-Applikation, z.B. gTunes. Sie sollte bereits laufen, so dass ein Klick auf den in der Liste vorhandenen Link zur Startseite der Applikation führt.
ProxyPass in Apache
Nun haben wir zwar eine lauffähige Applikation auf Tomcat, aber sie kann nur aufgerufen werden, indem man den Port in der URL angibt. Gewünscht ist eigentlich, dass die Grails-Applikation über den Apache ohne Angabe eines Ports erreichbar ist, z.B. über http://www.meinedomain.ch/gTunes oder lokal mit http://localhost/gTunes. Dies ist möglich, wenn man den Apache für ein ProxyPass einrichtet. Dazu öffnet man ..\xampp\xampp\apache\conf\httpd.conf mit einem Texteditor. Als erstes muss man die Module für ProxyPass freischalten, indem man das Kommentar-Zeichen # am Anfang folgender Zeilen entfernt:
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_connect_module modules/mod_proxy_connect.so LoadModule proxy_http_module modules/mod_proxy_http.so
Dann fügt man noch die folgenden Zeilen ein:
<IfModule mod_proxy.c> ProxyRequests Off ProxyPreserveHost On ProxyTimeout 300 ProxyPass /gTunes/ http://localhost:8081/gTunes/ ProxyPassReverse /gTunes/ http://localhost:8081/gTunes/ <Proxy *> Order deny,allow Allow from all </Proxy> </IfModule>
Wichtig ist, dass das Unterverzeichnis, d.h. gTunes mit dem Namen der Datei übereinstimmt. Sonst lässt sich zwar die Startseite aufrufen, aber die Links innerhalb der Applikation funktionieren nicht. Nun startet man den Apache neu, damit die Änderungen übernommen werden. Lässt sich http://localhost/gTunes nun im Browser aufrufen und funktionieren die Links in der Applikation, dann ist unser Deployment erfolgreich beendet.