Expire Header mit mod_expire im Apache 2

Wozu Expire Header?

Oft kommt es vor, das man Daten über einen Webserver ausliefert, welche lange Zeit konsistent bleiben, Logos, bestimmte Grafiken etc. Wenn man solche Bestandteile auf seiner Webseite hat, sollte man diese mit einem Expire Header versehen. Der Expire Header bewirkt dabei, das die statischen Bestandteile der Seite bei (den meisten) Nutzern nur einmal heruntergeladen werden und bis zum Ende der Expiration im Cache des Browser gehalten werden. Besucht der Anwender innerhalb der Expiration Zeit die Webseite nochmals, werden die statischen Bestandteile aus dem lokalem Cache des Benutzers geladen und müssen somit nicht erneut heruntergeladen werden. Dies bietet zwei Vorteile, zum einen spart man damit Bandbreite und Datenvolumen zum anderen ist die Ausgabe aus dem Cache, des Browsers, in der Regel deutlich schneller als das Herunterladen des Contents. Bei der Verbreitung von Breitbandanschlüßen (zu mindestens in Europa) kommt dem Argument des schnelleren Seitenaufbaus oft mehr Bedeutung zu als der genutzten Bandbreite, wobei dies natürlich auch stark vom jeweiligen Angebot abhängt.

Hin und wieder hat man den Bedarf Expire Header von bestimmten Dateitypen zu setzen, entweder weil die dahinterliegende Applikation dies nicht richtig kann, oder weil statischer Content direkt über den Apache ausgeliefert werden soll. Hierzu kann man das Modul mod_expire des Apache’s verwenden.

Hier ein Beispiel:

#set expire header for the static directorys to 7 days
<Directory /img/>
ExpiresActive On
ExpiresDefault „access plus 7 days“
</Directory>

In diesem Beispiel wird ein Expire Header für von 7 Tagen (bei wirklich statischem Content zu kurz) auf das Verzeichnis /img gesetzt.

Sobald das Modul aktiv ist und erfolgreich Arbeitet, kann man sich z.B. mit Firebug anschauen ob die Änderungen erfolgreich waren:
Date Wed, 20 Jan 2010 07:22:58 GMT
Server Apache
Last-Modified Wed, 08 Oct 2008 08:36:30 GMT
Etag "eb039a-33-458b9d013df80"
Accept-Ranges bytes
Content-Length 51
Cache-Control max-age=604800
Expires Wed, 27 Jan 2010 07:22:58 GMT
Content-Type image/gif

Hier sieht man nun sehr schön wie im Header die entsprechenden Expire Informationen gesetzt werden.

Hierzu gehören sowohl das Feld „Last-Modified“, „Cache-Control“ und natürlich „Expires“.

ModAJP tips+tricks

Ich Arbeite recht viel mit der Kombination aus Tomcat und Apache. Dazu benötigt man das das modajp (Ich weiß man kanns auch mit mod proxy machen). Hier mal ein paar Infos die ich mit der Zeit gelernt hab.

Basiskonfiguration

Theoretisch funktioniert der Kram recht easy, und zwar indem man mod_proxy und mod_proxy_balancer einschaltet und folgendes in die httpd.conf einträgt:

ProxyRequests Off

Das verhindert erstmal, das wir offener Proxy spielen, ganz, ganz, ganz, ganz … wichtig. Und nun brauchen wir noch den AJP Connect:

ProxyPass / ajp://127.0.0.1:8009/

Und fertig sind wir, wir haben jetzt einen AJP Connector auf das Loopbackinterface und Port 8009 konfiguriert. Dazu muss natürlich, in der server.xml des Tomcats, folgendes eingetragen sein:

<Connector port=“8009″ protocol=“AJP/1.3″ redirectPort=“8443″ />

Genau, ein AJP Connector.

Also funktioniert das ganze jetzt schon mal. Meiner Erfahrung nach, läuft es aber so einfach, gerade in Hochlastzeiten nicht zufriedenstellend. Deswegen ….

A bisl Tuning

Wir haben eben den ajp connector im Apache gemacht, diesem kann man wenn man mag noch ein paar hilfreiche Optionen mit auf den Weg geben. Getestet mit ein paar Milliarden zugriffen bisher ist folgendes:

ProxyPass / ajp://127.0.0.1:8009/ smax=5 max=20 ttl=10 retry=0 disablereuse=On

Das macht meiner Erfahrung nach die ganze Nummer erheblich stabiler.

Den Connector des Tomcats kann man dazu natürlich auch noch ein bischen anpassen, siehe dazu die Optionen des HTTP Connectors.