Teil 2 - Grails in Produktion – mit Apache, Tomcat und MySQL
Im zweiten Teil meiner Blog-Serie (hier geht es zu Teil 1 bzw. Teil 3) möchte ich auf die Konfiguration des Apache Moduls mod_jk innerhalb des Apache Web-Servers eingehen. Hierzu muss die Datei httpd.conf angepasst und eine Datei worker.properties erstellt (die Konfiguration der Ports beschreibe ich dann im Tomcat-Teil meiner Blog-Serie) werden. Des Weiteren werden ich noch kurz die JKStatus Konsole vorstellen.
Einstellungen in der Datei httpd.conf:
Im Listing unten sieht man die Standard-Einstellungen, diese können und sollten dann in jedem Projekt modifiziert bzw. erweitert werden. Folgendes ist anzumerken :
- Bis Zeile 9 - stehen die globalen Einstellungen, wie Lokation des Logfiles, der worker.properties, etc.
- Ab Zeile 43 - stehen dann die Einstellungen innerhalb des Virtual-Host Abschnitts. In einer Produktions-Umgebung sollte man dann noch entscheiden, ob die JKStatus-Konsole benutzt werden soll (Zeile 50).
LoadModule jk_module /usr/lib/apache2/modules/mod_jk.so
LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
JkWorkersFile /etc/apache2/worker.properties
# Where to put jk logs
JkLogFile /var/log/apache2/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel info
# Select the log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
<virtualhost>
ServerAdmin webmaster@localhost
DocumentRoot /var/www
<directory>
Options FollowSymLinks
AllowOverride None
</directory>
<directory var="" www="">
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</directory>
ErrorLog /var/log/apache2/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/access.log combined
Alias /doc/ "/usr/share/doc/"
<directory doc="" share="" usr="">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</directory>
# JkOptions indicate to send SSL KEY SIZE,
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"
# Send all MyWebApp requests to Tomcat
JkMount /MyWebApp/* loadbalancer
# Send JKStatus Console
JkMount /jkstatus/ status
RewriteEngine On
RewriteRule ^/$ /MyWebApp/ [PT,L]
</virtualhost>
Einstellungen in der Datei worker.properties (/etc/apache2):
Diese finden sich im Listing unten. Diese worker.properties führt ein Load-Balancing der Http-Requests auf 4 Tomcat-Server durch (mit einem Apache-WS davor). Sollen die 4 Tomcats die Requests von 2 Apache-WS-Servern erhalten, so bräuchte man 2 worker.properties. Ich würde dann jedoch weiterhin die Namen der Server global durchnummerieren, sprich svr1..svr4 und nicht svr1/svr2 für den ersten Apache-WS und erneut svr1/svr2 für den zweiten Apache-WS, da der Servername an die JSESSIONID angehängt wird und man somit einfacher herausfinden kann, an welchen Server der HttpRequest ging, um dann beispielsweise schneller das zugehörige Logfile zu finden. Zeile 29 ist noch erwähnenswert: Das Modul mod_jk geht standardmäßig von max. 3 Servern aus, auf die die Last verteilt werden soll. Aus diesem Grund ist hier der Wert auf 4 angepasst worden.
worker.list=svr1,svr2,svr3,svr4,loadbalancer,status
worker.svr1.type=ajp13
worker.svr1.host=xx.xx.xx.xx
worker.svr1.port=9008
worker.svr1.lbfactor=1
worker.svr1.socket_keepalive=1
worker.svr1.socket_timeout=300
worker.svr2.type=ajp13
worker.svr2.host=xx.xx.xx.xx
worker.svr2.port=9009
worker.svr2.lbfactor=1
worker.svr2.socket_keepalive=1
worker.svr2.socket_timeout=300
worker.svr3.type=ajp13
worker.svr3.host=xx.xx.xx.xx
worker.svr3.port=9008
worker.svr3.lbfactor=1
worker.svr3.socket_keepalive=1
worker.svr3.socket_timeout=300
worker.svr4.type=ajp13
worker.svr4.host=xx.xx.xx.xx
worker.svr4.port=9009
worker.svr4.lbfactor=1
worker.svr4.socket_keepalive=1
worker.svr4.socket_timeout=300
worker.loadbalancer.type=lb
worker.loadbalancer.sticky_session=1
# Adjust to the number of workers (4 in our case)
worker.retries=4
worker.loadbalancer.balance_workers=svr1,svr2,svr3,svr4
worker.status.type=status
JKStatus-Konsole:
Diese ist im Bild zu sehen. Meines Erachtens ist diese Konsole während der Lasttests ein sehr nützliches Hilfsmittel. In Produktion sollte dann jedoch eher Nagios benutzt werden. Man sieht in der Konsole beispielsweise sehr schön, ob sich die Last gleichmäßig auf alle Tomcat-Server verteilt. Auch bekommt man sehr schnell mit, wenn ein Tomcat Probleme hat. Hierbei sind folgende Angaben (rote Umrandung im Bild rechts) von besonderem Interesse:
- Busy (Current number of busy connections)
- Max (Maximum number of busy connections).
Bei hohen Werten hat der Tomcat Probleme, meistens hängen dann Tomcat-Threads, beispielsweise verursacht durch eine überlastete Datenbank.