Wie aktiviere ich das Caching unter Apache/Ubuntu Linux?

Wie aktiviere ich das Caching unter Apache/Ubuntu Linux?

Ich habe eine große (mehrere Megabyte) XML-Datei, die ziemlich häufig aktualisiert wird (alle 10 Minuten oder weniger) und viel Verkehr hat. Ich möchte Caching implementieren, um Bandbreite und Serverlast zu reduzieren. Wenn ich mir die Apache-Dokumente ansehe, sehe ich eine schwindelerregende Reihe von Konfigurationsoptionen, die verschiedene Kombinationen von mod_expires, mod_headers und mod_cache (und Varianten) beinhalten. Am Ende drehe ich mich im Kreis und die Ergebnisse sind nicht das, was ich erwartet habe.

Ich bearbeite die verschiedenen Konfigurationsdateien ohne Bedenken, wenn ich eine Vorstellung davon habe, was ich ändern soll. Aber im Moment tappe ich im Dunkeln und das ist nie ein angenehmes Gefühl. Wenn ich also beschreibe, was ich will, kann mich vielleicht jemand hier an die Hand nehmen und sagen: „Das ist, was Sie tun müssen.“

In regelmäßigen Abständen wird diese Datei, nennen wir sie "stuff.xml", aktualisiert und eine neue Version in das Verzeichnis kopiert. Die externe URL wäre beispielsweise:http://example.com/stuff.xml. Verstehen Sie, dieser Teil funktioniert. Immer wenn ich die Datei anfordere, erhalte ich das erwartete Ergebnis. Aber die Datei ist groß und ich möchte Bandbreite sparen, also möchte ich zuerst bedingte GET-Semantik mit dem If-Modified-Since-Header implementieren. Wie mache ich das? Ich habe mod_headers und mod_expired aktiviert und den <FilesMatching>Abschnitt in meiner httpd.conf hinzugefügt, wie in zahllosen Beispielen empfohlen, die ich online gesehen habe, aber das hat das Verhalten bei einer bedingten GET-Anforderung nicht geändert. Ich erhalte immer einen Status 200 mit dem gesamten Dokument. Also, wie zum Teufel implementiere ich das?

Dadurch werden unnötige Übertragungen vermieden. Ich möchte auch die übertragene Datenmenge begrenzen. Da es sich um XML handelt, sollte ich durch GZIP-Komprimierung 50 % oder mehr sparen. Mein nächster Schritt wäre, die Datei irgendwie zu gzippen und, wenn es nicht zu schwierig ist, im Speicher abzulegen. Dadurch werden die Datenübertragungen pro Zugriff und auch die Festplattenübertragungen reduziert. Wie implementiere ich also diese Art der Zwischenspeicherung?

Dank im Voraus.

Antwort1

Ich habe das Caching eingerichtet mitmod_expires, innerhalb der <VirtualHost>-Definition

ExpiresActive on
ExpiresByType text/xml "modified plus 5 minutes"   

Sie können die Komprimierung einrichten mitmod_deflate

SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/xml 

Antwort2

Was den Grund dafür angeht, dass If-Modified-Since nicht funktioniert, sollten Sie meiner Meinung nach die relevanten Teile Ihrer Konfiguration posten (ich gehe davon aus, dass Sie Apache neu gestartet haben). Möglicherweise möchten Sie die Protokolle auch schnell analysieren, um zu sehen, ob dieselbe IP (möglicherweise derselbe Benutzer) diese XML-Datei mehrmals erhält. Wenn es jedes Mal oder hauptsächlich neue Benutzer sind, hilft der clientseitige Cache nicht dabei, die Belastung Ihres Servers zu verringern.

Für die Komprimierung sollten Sie sich ansehenmod_deflate und/oder mod_gzip. Hierist ein älterer Vergleich im Linux Journal.

Was das Zwischenspeichern des Speichers angeht, denke ich, dass das Betriebssystem es wahrscheinlich bereits zwischenspeichert, wenn es so oft aufgerufen wird, dass es sich lohnt, es zwischenzuspeichern. Wenn Sie keine E/A-Probleme oder eine schlechte Latenz bei der Datei haben, würde ich darauf vertrauen, dass das Betriebssystem seine Arbeit erledigt.

verwandte Informationen