Überblick
Die meisten Websites haben große Mengen an Inhalten, die nach der Veröffentlichung unverändert bleiben oder nur selten geändert werden. Und jedes Mal, wenn sie vom Webserver angefordert werden, ob geändert oder nicht, werden sie erneut verarbeitet und an den Client übertragen, was unnötig wertvolle Systemressourcen und Netzwerkbandbreite verbraucht. Je populärer Ihre Website oder Anwendung wird, desto mehr Anforderungen werden an Ihren Server gestellt, um Inhalte zu verarbeiten, die zwar dynamisch generiert werden, aber statisch sind.
Dies ist keine effiziente Nutzung der Ressourcen und wird Sie letztendlich viel Geld kosten, da Sie mehr Hardware installieren müssen, um mit der Last Schritt zu halten. An dieser Stelle kommt das Caching ins Spiel. Wir wollen keine CPU-Zyklen oder Arbeitsspeicher für die Verarbeitung von Inhalten verschwenden, auf die bereits zugegriffen wurde und die sich innerhalb eines bestimmten Zeitraums wahrscheinlich nicht ändern werden. Stattdessen werden wir vorverarbeitete Inhalte bereitstellen, die vorübergehend auf dem Server oder im Cache des Webbrowsers gespeichert sind. Erst wenn der Inhalt geändert wurde oder eine bestimmte Zeit verstrichen ist, wird der angeforderte Inhalt erneut verarbeitet.
Konfigurieren Sie die Zwischenspeicherung im Apache
Apache wird mit drei Modulen für die Zwischenspeicherung von Inhalten ausgeliefert, von denen eines die Zwischenspeicherung aktiviert und die beiden anderen bestimmen, wo der Zwischenspeicher liegt – auf der Festplatte oder im Speicher. Die Entscheidung, welches Modul für den Cache-Speicher verwendet wird, hängt von den verfügbaren Hardwareressourcen und den Leistungsanforderungen ab.
Die Bereitstellung auf der Festplatte ist langsam, aber weniger kostspielig. Die Bereitstellung aus dem Speicher ist schnell, aber teuer – sowohl in Bezug auf die Kosten als auch auf den Ressourcenverbrauch. Sie können jedoch die Leistung des Festplatten-Caches steigern, indem Sie ihn auf SSDFLASH-Speicher statt auf herkömmliche rotierende Festplatten legen.
- Stellen Sie sicher, dass das cache_module von Apache geladen wird, indem Sie überprüfen, ob die folgende Zeile in der Serverkonfigurationsdatei von Apache vorhanden ist, und zwar unkommentiert.
LoadModule cache_module modules/mod_cache.so
- Für das Festplatten-Caching müssen Sie sicherstellen, dass das disk_cache_module von Apache geladen wird. Suchen Sie nach der folgenden Zeile, unkommentiert.
LoadModule disk_cache_module modules/mod_disk_cache.so
- Fügen Sie die folgenden Zeilen entweder in die Apache-Serverkonfigurationsdatei (für globale Anwendungen) oder in eine VirtualHost-Direktive (für lokale Anwendungen) ein.
CacheEnable disk /CacheRoot /webapps/cache/app1CacheDefaultExpire 3600CacheDisable /wp-admin
CacheEnable disk / Deaktivieren Sie die Zwischenspeicherung auf Festplatte für das relative Verzeichnis „/“.
Cacheroot Setzen Sie das Cache-Speicherverzeichnis, in dem alle gecachten Inhalte gespeichert werden.
CacheDefaultExpire Setzen Sie das standardmäßige Ablaufdatum relativ zum ursprünglichen Anfragedatum in Sekunden.
CacheDisable Deaktiviert das Caching für relative Pfade, die der Option folgen. Sensible Bereiche und solche, die nicht zwischengespeichert werden sollen, sollten hier hinzugefügt werden.
Setting Content Expiration
Die Zwischenspeicherung erfordert ein Verfallsdatum, damit sie funktioniert. Ohne ein Verfallsdatum für Ihren Inhalt kann der Cache nicht feststellen, ob er veraltet ist oder nicht.
Verwenden Sie Apache’s Mod_Expires
Dieses Modul ermöglicht es Ihnen, Verfallsdaten für Ihren Inhalt zu definieren, als Ganzes oder individuell basierend auf dem Typ oder der passenden Zeichenkette.
- Stellen Sie sicher, dass das Modul in Apache geladen wird. Öffnen Sie die Serverkonfigurationsdatei (httpd.conf in CentOS) und suchen Sie nach dieser Zeile. Heben Sie die Kommentierung auf, falls sie mit einem ‚#‘ auskommentiert ist.
LoadModule expires_module modules/mod_expires.so
- Fügen Sie die folgenden Zeilen entweder in die Apache-Serverkonfiguration, eine virtuelle Hostkonfiguration, eine Verzeichnisrichtlinie oder .htaccess, je nachdem, wo Sie Ihre Caching-Richtlinie festlegen möchten.
<IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 day"</IfModule></pre>
ExpiresActive On Schaltet mod expires ein.
ExpiresDefault Setzen Sie das Standardablaufdatum für alle Inhalte. Zugriff plus 1 Tag setzt die Ablaufzeit auf die Zugriffszeit des Inhalts + 1 Tag, was bedeutet, dass er für 24 Stunden zwischengespeichert wird.
- Wenn Sie bestimmten Inhaltstypen unterschiedliche Ablaufwerte zuweisen möchten, können Sie die Option ExpiresByType zusätzlich zur Option ExpiresDefault oder ohne diese verwenden. Hier einige Beispiele:
<IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 day" ExpiresByType image/jpg "access plus 5 days" ExpiresByType image/jpeg "access plus 5 days" ExpiresByType image/gif "access plus 5 days" ExpiresByType image/png "access plus 5 days" ExpiresByType text/css "access plus 1 month" ExpiresByType application/pdf "access plus 1 month" ExpiresByType text/x-javascript "access plus 1 month" ExpiresByType application/x-shockwave-flash "access plus 1 month" ExpiresByType image/x-icon "access plus 1 year"</IfModule>
Verwendung von HTTP-Headern in der Webanwendung
Ablauf- und Änderungsdaten können von der Webanwendung mithilfe von HTTP-Header-Parametern definiert werden. Dies gibt den Entwicklern oder der Anwendung die Kontrolle über die Aktualität der Inhalte. Wie Sie dies tun, hängt von Ihrer Anwendung ab.
- HTML
Verwenden Sie den Meta-Tag und definieren Sie das Alter des Inhalts. Im folgenden Beispiel setzen Sie den Cache auf privat (nur für den anfragenden Client) und das maximale Alter auf 1 Stunde (3600 Sekunden).<meta http-equiv="Cache-control" content="private,max-age:3600">
- PHP
Verwenden Sie die Funktion Header(), um das Alter des Inhalts im Header des Dokuments festzulegen.header("Cache-Control: private, max-age=3600");
Zwischenspeichern von nicht ablaufenden Inhalten
Manchmal müssen Sie Inhalte zwischenspeichern, für die kein Verfallsdatum festgelegt ist. Wie bereits erwähnt, sind Verfallsdaten eine Voraussetzung dafür, dass der Caching-Mechanismus standardmäßig funktioniert. Wir können den Apache jedoch anweisen, ein Standard-Verfallsdatum an Inhalte anzuhängen, für die kein Verfallsdatum definiert ist, und diese in den Cache zu stellen. Die Option CacheIgnoreNoLastMod ermöglicht dies.
- Fügen Sie die Option CacheIgnoreNoLastMod mit dem Wert On an dem Ort ein, an dem Sie das Caching aktiviert haben – in der Serverkonfigurationsdatei des Apache oder einer Konfigurationsdatei für virtuelle Hosts.
CacheEnable disk /CacheRoot /webapps/cache/app1CacheDefaultExpire 3600CacheDisable /wp-adminCacheIgnoreNoLastMod On
Verhindern, dass Browser Inhalte zwischenspeichern
Das Problem mit den oben genannten Caching-Konfigurationen ist, dass die Inhalte Ihrer Anwendung an zwei Orten zwischengespeichert werden: auf dem Client und auf dem Server. Wenn Sie Ihre Inhalte aktualisieren und möchten, dass der Benutzer sie sofort sieht, kann er das möglicherweise nicht, wenn die lokal zwischengespeicherte Version noch nicht abgelaufen ist. Sie können die Verfallszeit zwar verkürzen, aber dann verfehlen Sie möglicherweise den Zweck des Caching vollständig.
Übernehmen Sie stattdessen die volle Kontrolle über das Caching, indem Sie es nur auf dem Server aktivieren. Erzwingen Sie, dass der Webbrowser bei jeder Anfrage den Inhalt vom Server abruft, aber z.B. vorverarbeitete Java- oder PHP-Inhalte ausliefert, solange der Inhalt nicht verändert wurde. Dadurch wird sichergestellt, dass der Benutzer immer die aktuellste Version sieht, ohne unnötig CPU-Zyklen oder RAM für die erneute Verarbeitung zu verschwenden.
- Fügen Sie die Option CacheIgnoreCacheControl an dem Ort, an dem die Zwischenspeicherung aktiviert ist – in der Serverkonfigurationsdatei von Apache oder in der Konfiguration eines virtuellen Hosts – mit dem Wert On hinzu. Dies veranlasst den Apache, Aktualisierungsanfragen des Browsers zu ignorieren. Alle Inhalte werden, wenn möglich, aus dem Cache des Servers geliefert, bis dieser abgelaufen ist.
CacheEnable disk /CacheRoot /webapps/cache/app1CacheDefaultExpire 3600CacheDisable /wp-adminCacheIgnoreNoLastMod OnCacheIgnoreCacheControl On
- Speichern Sie Ihre Änderungen.
- Starten Sie den Apache neu, um Ihre Änderungen zu übernehmen.
WordPress und andere Anwendungs-Frameworks
Frameworks, wie das von WordPress und ähnliche wie CodeIgniter, leiten alle Inhalte durch die Index.php. Je nachdem, wie Sie Ihre mod_rewrite-Regeln geschrieben haben, werden Ihre zwischengespeicherten Inhalte nicht korrekt angezeigt. Es kann vorkommen, dass die Inhalte einer angeforderten Seite, Kategorie usw. anstelle der tatsächlich angeforderten Inhalte angezeigt werden.
Um dies zu verhindern, müssen wir sicherstellen, dass der Cache des Apache die an das Ende der index.php angehängten Parameter berücksichtigt, wenn Inhalte gecached und abgerufen werden. Ändern Sie die Rewrite-Regel für index.php, wie im folgenden Beispiel gezeigt.
# WordPress Permalink rewritesRewriteBase /RewriteRule ^index.php$ – RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ /index.php/