Pixelig

Webmaster, die sicherstellen wollen, dass alle Zugriffe korrekt gezählt werden, die Datenübertragung aber gering halten wollen, können das über die Konfiguration des Servers erreichen.

vorlesen Druckansicht 3 Kommentare lesen
Lesezeit: 12 Min.
Von
  • Dr. Stefan Radtke
Inhaltsverzeichnis

In iX 8/2000 war über die professionelle Nutzung von Caching-Proxies im Internet zu lesen. Dieser Beitrag soll hingegen zeigen, wie Website-Betreiber von Internet-Proxies profitieren können und was der Webmaster dafür an der eigenen Serverkonfiguration beachten sollte. Oberstes Ziel der Bemühungen ist einerseits eine möglichst schnelle Auslieferung der Daten an die anfragenden Clients, andererseits sollen trotz Zugriffen durch Proxies die Hits auf der eigenen Site zählbar bleiben. Zwar gilt das nachfolgend Beschriebene grundsätzlich für alle Webserver, bei den Konfigurationsbeispielen handelt es sich jedoch um Direktiven für den am weitesten verbreiteten Apache.

Fast alle Internet Service Provider, Netzbetreiber und Firmen setzen in großem Umfang Caching-Proxies mit dem Ziel ein, Content schneller zum Endbenutzer (Kunden) zu bringen. Ferner entlastet das Netze und senkt Leitungskosten. Aber auch für Content Provider, die Betreiber von Websites, können die für ihn in der Regel kostenlosen Proxies nützlich sein. Erstens kommen auch ihre Daten schneller zum Kunden und zweitens können sie ihre eigenen Server und Netze entlasten.

Mögliche Vorbehalte gegen Caching-Proxies rühren oft daher, dass man durch diese Proxy-Zugriffe nicht alle Hits auf den eigenen Seiten richtig zählen zu können glaubt. Diese Bedenken sind aber in der Regel unbegründet, sofern der eigene Webserver richtig konfiguriert ist. Es geht dabei vor allem darum, allen Objekten der eigenen Webseiten die richtige Lebensdauer in Form entsprechender HTTP-Header mit auf den Weg zu geben (dies ist übrigens nicht nur wegen der Existenz von Proxies wichtig, sondern auch wegen der in jedem modernen Browser vorhandenen lokalen Caches). Dafür bedarf es lediglich ein paar Überlegungen zur Klassifizierung der Objekte hinsichtlich ihrer Lebensdauer. Bildet man außerdem die Lebensdauerklassen möglichst 1 : 1 im Dateisystem ab, hat man bei der Konfiguration ein einfaches Spiel. Aber zunächst gilt es, sich anzuschauen wie Proxies mit Dokumenten umgehen beziehungsweise wie sie deren Lebensdauer ermitteln.

Ein wichtiger Header, den der Server grundsätzlich für jedes ausgelieferte Dokument im HTTP-Header mitsenden sollte, ist der Expires-Header. Ferner kann das Verhalten von Caches auch mit dem Cache-Control-Header beeinflusst werden. Ein Beispiel für eine Antwort von einem Webserver, der diese Header mitsendet, zeigt Listing 1.

Mehr Infos

Listing 1: HTTP-Header

HTTP/1.1 200 OK
Date: Fri, 16 Jan 2001 12:42:56 GMT
Server: IBM_HTTP_Server 1.3.6.2 Apache/1.3.7-dev (Unix)
Cache-Control: max-age=3600
Expires Fri, 16 Jan 2001 13:42:56 GMT
Last-Modified: Mon, 25 Dec 2000 09:11:32 GMT
ETag: "3401f-21e-39aa215c"
Accept-Ranges: bytes
Content-Length:542
Connection: close
Content-Type: text/plain

Fügt der Webserver seiner Antwort den im Listing dargestellten Expires-Header mit, berücksichtigen Proxies dies in der Regel. Anfragen auf dieses Objekt werden solange aus dem Cache beantwortet, bis das aktuelle Datum größer ist als das im Expires-Header angegebene. In diesem Fall wird das Dokument beim Webserver erneut angefragt und zwar in der Regel mit einem HEAD-Request. Dabei fragt der Proxy den Webserver, ob sich das Dokument seit dem Datum im Last-Modified-Header geändert hat. Ist das Dokument inzwischen verändert worden, sendet der Server das neue Dokument an den Proxy. Andernfalls antwortet er mit dem Response-Code ‘304 not modified’. In diesem Fall kann der Caching Proxy das Dokument erneut an den Client senden.

Schwierig wird die Sache erst, wenn der Webserver weder einen Expires noch einen Cache-Control-Header mitsendet (siehe unten, was dafür zu tun ist, damit der Webserver diese Direktiven mitsendet). In diesem Fall muss der Cache-Server ein Verfallsdatum ‘berechnen’. Das Ergebnis dieser Berechnung basiert auf konfigurierten Parametern des Cache und dem verwendeten Algorithmus. Diese Konfiguration liegt aber nicht in Händen des Content Provider - und je nachdem wie konservativ sie ist, können im ungünstigen Fall auch veraltete Dokumente ausgeliefert werden. Nebenstehende Abbildung zeigt, wie ein Proxy die Aktualität und Gültigkeit eines Objekts untersucht. Die für die Untersuchung notwendigen Parameter sind in der Tabelle beschrieben.

Aktualitätsparameter
Parameter Beschreibung
Expires Zeitpunkt, zu dem die Gültigkeit des Objekts beim Server erneut angefragt oder revalidiert werden muss - sollte der Webserver senden
Max-Age Angabe in Sekunden - sollte der Webserver im Cache-Control Header senden
Last-Modified Zeitpunkt, zu dem das Dokument zuletzt modifiziert wurde - sendet in der Regel immer der Webserver
Timestamp Zeitpunkt, zu dem das Objekt vom Server in den Cache geladen wurde
Check-Time Aktuelle Zeit
Age Check-Time-Zeitstempel
CacheMax Maximale Lebensdauer eines Objektes (Cache-Konfiguration)
CacheMin Minimale Lebensdauer eines Objektes (Cache-Konfiguration), in der Regel 0
Lm-Factor Last-Modified-Faktor (Cache-Konfiguration) - in der Regel zwischen 0 und 1
Exp-Time Berechnete Expiry-Zeit

Durch mehrere Wenn-Dann-Abfragen prüft der Proxy die Aktualität eines Objekts.

In der Abbildung ist zu erkennen, dass der Proxy zweifelsfrei die Aktualität eines Dokuments feststellen kann, wenn entweder Expires oder Cache-Control-Header (zum Beispiel mit Max-Age-Feld) vorhanden sind. Ist beides nicht der Fall, prüft der Proxy, ob die konfigurierte maximale Lebensdauer für diesen Objekttyp überschritten ist. Ist auch dies nicht der Fall, wird der Last-Modified-Header herangezogen. Mit dessen Hilfe sowie dem fest konfiguriertem Last-Modified-Factor (Lm-Factor) wird eine Expiry-Zeit ermittelt. Dem Algorithmus liegt der Gedanke zugrunde, dass ein vor kurzem verändertes Dokument vermutlich bald wieder geändert wird, ein älteres Dokument wahrscheinlich nicht.

Ein Beispiel (Rechnung mit ganzen Tagen zur besseren Verständlichkeit): angenommen, der Lm-Factor beträgt 0,5 (Proxy-Konfiguration). Das aktuelle Datum (Check-Time) ist der 30. Januar, das Last-Modified-Datum der 10. Januar. Dann ergibt sich

Exp-Time = Lm-Faktor * (Check-Time - Last-Modified)
= 0,5 * (30. Januar - 10.Januar) = 10 Tage

Somit ‘verfällt’ das Dokument am 20. Januar (10 Tage nach dem Last-Modified-Datum). Wäre dies hingegen der 28. Januar, dann wäre Exp-Time = 0,5 (30. Januar - 28. Januar) = 1 Tag. Das heißt das Dokument wäre einen Tag nach dem Last-Modified-Datum nicht mehr aktuell.

Der Algorithmus für die Berechnung der Aktualität eines Objekts mag je nach Proxy variieren und ist natürlich nie ganz korrekt. Damit es nicht dazu kommt, sollten also stets Expires und Cache-Control Header versendet werden (dann greift nämlich der in [[bild_url3] Abbildung 2] dargestellte grüne Pfad, die Berechnung beziehungsweise Abschätzung einer Gültigkeitsdauer im grau hinterlegten Bereich kann vermieden werden).

Damit der Apache Expires-Header in seine Antworten einfügt, sind folgende Dinge notwendig:

  • Einbindung des Moduls mod_expires. Dies kann bei der Erstinstallation geschehen, indem das Modul in den Server einkompiliert wird. Aber auch das (nachträgliche) dynamische Laden des Moduls ist möglich. Die entsprechende Anweisung zum Laden des dynamischen Moduls erfolgt in der Konfigurationsdatei httpd.conf:
    LoadModule expires_module libexec/mod_expires.c
  • Ebenfalls in der httpd.conf ist die Direktive ExpiresActive On zu setzen.
  • Jetzt kann mittels verschiedener Direktiven die Lebensdauer für verschiedene Objekttypen (HTML, JPG, ZIP et cetera) festgelegt werden. Ebenso ist die Angabe einer Lebensdauer möglich, die für Dateien in bestimmten Verzeichnissen gelten.

Ein Beispiel soll zeigen, welche Direktiven man zur Steuerung der jeweiligen ‘Lebensdauer’ verwenden kann. Angenommen sei die Webseite eines Nachrichtendienstes. Die Regeln für die Lebensdauer von Dokumenten könnten hier wie folgt lauten.

  • Alle HTML-Dokumente sind grundsätzlich nur einen Tag gültig; danach müssen Cache-Server vor Auslieferung revalidieren.
  • Die Top-News der Seite können sich permanent ändern (gleicher Dateiname, aber anderer Inhalt). Die Lebensdauer der Top-News-Objekte ist deshalb auf fünf Minuten beschränkt.
  • Für Inhalte der Download-Seite beträgt die Lebensdauer einen Monat.
  • Der Inhalt von Bilddateien (JPEG, GIF et cetera) ändert sich in der Regel nicht; der Cache darf sie drei Monate ohne Revalidierung ausliefern.
  • Die Zählung aller Zugriffe auf die Webseiten soll genau sein, das heißt jede Seite muss ein Element enthalten, das der Proxy (und Browser-Cache) nicht zwischenspeichern darf. Hierzu dienen Bilder mit der Größe eines Pixels.
  • Für alle nicht weiter spezifizierten Objekte gilt eine Lebensdauer von zwei Tagen.

Am einfachsten ist es, wenn man das Regelwerk - das sicherlich zusammen mit den Redakteuren erstellt wird - zumindest teilweise im Dateisystem abbilden kann. Für die Newssite hieße das, dass die Daten in einem Dateisystem mit folgenden Verzeichnissen abzulegen wären:

/documents
/documents/topnews
/documents/downloads
/documents/images
/documents/counters

Dann würden die Direktiven in der httpd.conf aussehen wie Listing 2.

Mehr Infos

Listing 2: Verzeichnis-Direktiven

# Aktivierung von Expires-Headern
ExpiresActive On

# Regel 6: Alle nicht spezifierten Objekte
# veralten nach 2 Tagen
ExpiresDefault "access 2 days"

# Regel 1: HTML Dateien dürfen nur
# einen Tag alt werden
ExpiresByType text/html "access 1 day"

# Regel 2: Topnews müssen bereits nach
# 5 Minuten revalidiert werden
<Directory /documents/topnews/*>
ExpiresDefault "access 5 minutes"
</Directory>

# Regel 3: Alle Ojekte der Download Area
# koennen einen Monat ohne
# Revalidierung ausgeliefert werden
<Directory /documents/download/*>
ExpiresDefault "access 1 month"
</Directory>

# Regel 4: Alle Bilder sind 3 Monate gueltig
# ohne Revalidierung
<Directory /documents/images/*>
ExpiresDefault "access 3 months"
</Directory>

# Regel 5: Ojekte, die zur Zugriffszählung
# verwendet werden, veralten sofort
<Directory /documents/counters/*>
ExpiresDefault now
</Directory>

Die Direktiven, die in einem Directory-Kontext stehen, überschreiben in der Regel solche, die mit ExpiresByType angegeben wurden. Man sollte also die Regeln so generell wie möglich machen und Ausnahmen dann im Directory-Kontext formulieren.

Das Wort access vor der Zahl für die Lebensdauer bedeutet, das die angegebene Lebensdauer ab dem Zeitpunkt des letzten Zugriffs (auf den Webserver) gerechnet wird. Alternativ kann man auch modified schreiben, in diesem Fall gilt die Lebensdauer ab dem Zeitpunkt der Erstellung beziehungsweise der letzten Modifizierung des Dokuments. Die Zeitangaben können übrigens auch in Sekunden erfolgen; access und modified lassen sich durch A und M abkürzen. Die Direktive für Regel 2 aus dem Beispiel könnte also auch wie folgt lauten:

# Regel 2: 
<Directory /documents/topnews/*>
ExpiresDefault "A300"
</Directory>

Neben den hier dargestellten Direktiven, die sich auf Objekttypen oder alle Objekte in einem bestimmten Verzeichnis beziehen, kann die DirectoryMatch-Direktive auch reguläre Ausdrücke angeben, beispielsweise

<DirectoryMatch "/documents/*/(archive|old)/*">
...
...
</DirectoryMatch>

Eine vollständige Aufstellung der möglichen Direktiven des Moduls mod_expires findet man in Eilebrechts Buch [3], die Idee sollte hier deutlich geworden sein. Bleibt anzumerken, dass die Direktiven auch in .htaccess-Dateien stehen dürfen, sofern der Apache so konfiguriert ist, dass er diese Dateien liest. Die Direktiven gelten dann jeweils für das Verzeichnis, in dem sich die Datei .htaccess befindet. Dadurch lassen sich die Zuständigkeiten vom Webmaster delegieren. Das Öffnen und Lesen dieser Datei durch den http-Daemon geht aber auf Kosten der Performance, weshalb diese Funktion nur gezielt eingesetzt werden sollte.

Redakteure und Autoren haben ferner die Möglichkeit, in ihren HTML-Seiten die Werte des max-age-Feldes im Cache-Contol-Header zu manipulieren. Dies geschieht mit Hilfe von Meta-Tags der Form:

<META http-equiv="Cache-Control" content="proxy-revalidate">

Der Proxy wird in diesem Beispiel angehalten, bei jeder Anfrage des entsprechenden Dokumentes dessen Gültigkeit beim Content Server zu revalidieren. Oft wird fälschlicherweise angenommen, das der Proxy diese Direktive direkt aus dem HTML-Dokument liest. Das ist aber nicht der Fall, denn wenn der Proxy jede Datei parsen sollte, würde dies auf Kosten der Performance gehen. Die Direktiven in Meta-Tags werden lediglich vom Clients (Browser) gelesen. Proxies orientieren sich wie gesagt am HTTP-Header, den der Webserver generiert. Der dem obigen META-Tag entsprechende HTTP-Header hat die Form:

Cache-Control: proxy-revalidate 

Meta-Tags stellen also lediglich eine Entscheidungshilfe für Browser-Caches dar. Deshalb sollten auf jeden Fall die oben beschriebenen Direktiven im HTTP-Header vorgezogen werden, diese berücksichtigen sowohl Proxies als auch Browser.

Eine Cache-konforme Konfiguration des eigenen Webservers kann das Cache-Verhalten von Proxies und Clients steuern. Sendet der eigene Webserver die richtigen Direktiven mit, berücksichtigen Proxies und Clients die Vorgaben hinsichtlich der Lebensdauer der Dokumente. Weist man den für die Zählung relevanten Objekten die Lebensdauer 0 zu, sind alle Zugriffe auf der eigenen Seite zählbar. (In der Praxis wird dafür oft ein Bild mit der Größe eines Pixels verwendet.) Für die meisten Objekte beziehungsweise Dokumente lässt sich eine längere Lebensdauer festlegen. Durch die aus dem Proxy- und Browser-Cache beantworteten Zugriffe wird die Last auf dem eigenen Webserver sowie der Verkehr im eigenen Netz reduziert und der User erhält in der Regel schnellere Antworten.

Neben der Cache-konformen Konfiguration des Webservers existieren weitere Möglichkeiten, die Auslieferungsgeschwindigkeit der Dokumente zu erhöhen. Eine Möglichkeit zur Performance-Steigerung ergibt sich durch die Nutzung des Fast Response Cache Accelerators im Apache (FRCA). Durch eine Kernelerweiterung können auszuliefernde Dokumente in privaten Hauptspeichersegmenten des Webservers zwischengespeichert und dadurch ohne Kontext-Switch noch schneller ausgeliefert werden. Über diese Möglichkeit berichten wir in einer der nächsten Ausgaben.

Dr. Stefan Radtke
arbeitet als Consulting IT-Spezialist bei IBM und ist für die technische Beratung und Realisierung von Lösungen für Internet Service Provider zuständig.

[1] Stefan Radtke; Schneller durchs World Wide Web, Professioneller Einsatz von Caching Proxy Servern, iX 8/2000, S. 90

[2] Roy T. Fielding, Jim Gettys, Jeffrey C. Mogul, Henrik Frystyk Nielsen, Tim Berners-Lee; RFC 2068; Hypertext Transfer Protokoll - HTTP V.1.1, Januar 1997

[3] Lars Eilebrecht; Apache Web-Server, 3. überarbeitete Auflage; Bonn (MITP-Verlag) 2000

[4] Ari Luotonen; Web Proxy Servers, Upper Saddle River, NJ (Prentice Hall) 1998

[5] Mark Nottingham; Caching Tutorial for Web Authors and Webmasters; http://www.stars.com/ (Registrierung nötig), Juni 1999

Mehr Infos

iX-TRACT

  • Wer seinen Webserver richtig konfiguriert, bekommt auch alle Zugriffe korrekt gezählt.
  • Durch die Einbindung von mod_expires in den Apache-Server lässt sich für HTML- und Bilddateien oder ganze Verzeichnisse die ‘Lebensdauer’ festlegen.
  • Objekte mit einer Lebensdauer größer 0 können Proxies und Browser zwischenspeichern. Das enlastet den Webserver. Eine Lebensdauer von 0 für eingebundene Kleinstdateien sichert das korrekte Zählen aller Webseiten.

(hb)