immutable: NGINX-Modul zum Setzen von unveränderlichem Caching für statische Assets
Erfordert den Pro-Plan (oder höher) des GetPageSpeed NGINX Extras Abonnements.
Installation
Sie können dieses Modul in jeder RHEL-basierten Distribution installieren, einschließlich, aber nicht beschränkt auf:
- RedHat Enterprise Linux 7, 8, 9 und 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 und Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-immutable
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-immutable
Aktivieren Sie das Modul, indem Sie Folgendes an den Anfang von /etc/nginx/nginx.conf hinzufügen:
load_module modules/ngx_http_immutable_module.so;
Dieses Dokument beschreibt nginx-module-immutable v0.0.7, veröffentlicht am 20. März 2026.
Dieses kleine NGINX-Modul kann helfen, das Caching Ihrer öffentlichen statischen Assets zu verbessern, indem es eine weit in die Zukunft liegende Ablaufzeit mit dem immutable Attribut festlegt.
Zielgruppe
Websites und Frameworks, die auf das Cache-Busting-Muster angewiesen sind:
- Statische Ressourcen enthalten Versionen/Hashes in ihren URLs, während die Ressourcen nie verändert werden
- Bei Bedarf werden die Ressourcen mit neueren Versionen aktualisiert, die neue Versionsnummern/Hashes haben, sodass ihre URLs unterschiedlich sind
Beliebte Frameworks, die Cache-Busting verwenden:
- Magento 2
- Fügen Sie hier Ihr eigenes hinzu!
Zusammenfassung
http {
server {
location /static/ {
immutable on;
}
}
}
führt zu folgendem HTTP-Header:
Cache-Control: public,max-age=31536000,stale-while-revalidate=31536000,stale-if-error=31536000,immutable
Hinweis: HTTP/1.0-Clients erhalten einen
Expires: Thu, 31 Dec 2037 23:55:55 GMTHeader anstelle vonCache-Control.
Wie es sich von expires max; unterscheidet:
- Setzt das
immutableAttribut, z.B.Cache-Control: public,max-age=31536000,immutablefür verbessertes Caching. Das sind 1 Jahr und nicht 10 Jahre, siehe warum unten. - Sendet
Expiresnur, wenn es wirklich notwendig ist, z.B. wenn ein Client Ressourcen überHTTP/1.0anfordert - Setzt das
publicAttribut, um sicherzustellen, dass die Assets von öffentlichen Caches zwischengespeichert werden können, was typischerweise gewünscht ist.
Aufgrund der fehlenden Unterstützung von immutable in Chromium-basierten Browsern,
fügen wir auch stale-while-revalidate=31536000,stale-if-error=31536000 hinzu, was hilft, die Cache-Trefferquote in Grenzfällen zu verbessern.
Die Verwendung dieser Direktiven ermöglicht das Bereitstellen von zwischengespeicherten Antworten über ihre Cache-Lebensdauer hinaus, was im Fall von unveränderlichen Ressourcen für immer ist.
Daher kann in den meisten Fällen immutable on; als bessere Alternative zu expires max; verwendet werden, um das Cache-Busting-Muster zu implementieren.
Direktiven
immutable
Syntax: immutable on | off;
Standard: immutable off;
Kontext: http, server, location
Aktiviert oder deaktiviert unveränderliche Caching-Header für den Standort.
immutable_cache_status
Syntax: immutable_cache_status on | off;
Standard: immutable_cache_status off;
Kontext: http, server, location
Aktiviert den RFC 9211 Cache-Status Header für Debugging und Beobachtbarkeit. Wenn aktiviert, enthalten Antworten:
Cache-Status: "nginx/immutable"; hit; ttl=31536000
Dieser Header hilft, das Caching-Verhalten über mehrschichtige Caching-Architekturen (NGINX -> CDN -> Browser) zu debuggen. Jede Cache-Schicht kann ihren eigenen Status anhängen und eine Kette wie folgt erstellen:
Cache-Status: "nginx/immutable"; hit; ttl=31536000, "cloudflare"; fwd=uri-miss; stored
Beispielkonfiguration:
location /static/ {
immutable on;
immutable_cache_status on;
}
immutable_types
Syntax: immutable_types mime-type ...;
Standard: (keiner - gilt für alle Typen, wenn nicht angegeben)
Kontext: http, server, location
Beschränkt die unveränderlichen Caching-Header auf Antworten mit den angegebenen MIME-Typen. Wenn nicht angegeben, gelten unveränderliche Header für alle Antworten. Dies ähnelt der Funktionsweise von gzip_types für das gzip-Modul.
Beispielkonfiguration:
location /static/ {
immutable on;
# Wenden Sie unveränderliche Header nur auf JavaScript- und CSS-Dateien an
immutable_types application/javascript text/css;
}
Warum 31536000 Sekunden (1 Jahr?)
Der RFC definiert, dass ein Jahr verwendet wird, um eine Antwort als "nie ablaufend" zu kennzeichnen:
Um eine Antwort als „nie ablaufend“ zu kennzeichnen, sendet ein Origin-Server ein Ablaufdatum, das ungefähr ein Jahr nach dem Zeitpunkt liegt, zu dem die Antwort gesendet wird. HTTP/1.1-Server DÜRFEN keine Ablaufdaten mehr als ein Jahr in der Zukunft senden.
Weitere Details in dem Artikel.
Ubuntu- und Debian-Pakete
Es ist einfach, das Modulpaket für diese Betriebssysteme zu installieren.
ngx_immutable ist Teil der APT NGINX Extras Sammlung, sodass Sie es zusammen mit beliebigen Modulen installieren können, einschließlich Brotli.
Zuerst richten Sie das Repository ein, dann:
sudo apt-get update
sudo apt-get install nginx-module-immutable
Beispiel: Magento 2 Produktionskonfiguration
Vorausgesetzt, Ihr Shop läuft im Produktionsmodus, haben Sie bereits alle Assets kompiliert. Diese Beispielkonfiguration kann optimiert werden zu:
location /static/ {
immutable on;
# Entfernen Sie die Signatur der statischen Dateien, die verwendet wird, um den Browser-Cache zu überwinden
location ~ ^/static/version {
rewrite ^/static/(version\d*/)?(.*)$ /static/$2 last;
}
location ~* \.(ico|jpg|jpeg|png|gif|svg|js|css|swf|eot|ttf|otf|woff|woff2|json)$ {
add_header X-Frame-Options "SAMEORIGIN";
}
location ~* \.(zip|gz|gzip|bz2|csv|xml)$ {
add_header Cache-Control "no-store";
add_header X-Frame-Options "SAMEORIGIN";
immutable off;
}
add_header X-Frame-Options "SAMEORIGIN";
}
Wenn es zusammen mit ngx_security_headers verwendet wird, kann es weiter vereinfacht werden:
security_headers on;
location /static/ {
immutable on;
location ~ ^/static/version {
rewrite ^/static/(version\d*/)?(.*)$ /static/$2 last;
}
location ~* \.(zip|gz|gzip|bz2|csv|xml)$ {
add_header Cache-Control "no-store";
immutable off;
}
}