dynamic-etag: NGINX-Modul zum Hinzufügen von ETag zu dynamischem Inhalt
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-dynamic-etag
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-dynamic-etag
Aktivieren Sie das Modul, indem Sie Folgendes an den Anfang von /etc/nginx/nginx.conf hinzufügen:
load_module modules/ngx_http_dynamic_etag_module.so;
Dieses Dokument beschreibt nginx-module-dynamic-etag v0.2.3 veröffentlicht am 18. September 2025.
Dieses NGINX-Modul verleiht Ihrem dynamischen Inhalt einen automatischen ETag Header. Es ermöglicht Client-Browsern, bedingte GET-Anfragen an dynamische Seiten zu stellen. Und spart somit Bandbreite und sorgt für eine bessere Leistung!
Zuerst die Warnhinweise!
Dieses Modul ist ein echtes Hack: Es ruft einen Header-Filter aus einem Body-Filter auf usw.
Der ursprüngliche Autor hat es aufgegeben, nachdem er gesagt hat:
Es hat nie wirklich funktioniert.
Ich habe es größtenteils umgeschrieben, um bestehende offensichtliche Fehler zu beheben, aber der Schlüsselteil mit den Buffern, den ich selbst als alt kenne, wird wahrscheinlich nie verstanden werden, bleibt unberührt.
Um zuverlässig zu sein, muss das Modul die gesamte Antwort lesen und einen Hash davon erstellen. Das Lesen der gesamten Antwort widerspricht dem leichten Design von NGINX. Ich bin mir nicht sicher, ob der Buffer-Teil auf die gesamte Antwort wartet.
Das gesagt, die Tests, die ich hinzugefügt habe, zeigen, dass das Ganze funktioniert!
Beachten Sie, dass bei HEAD-Anfragen kein ETag zurückgegeben wird, da wir keine Daten haben, mit denen wir arbeiten können, da NGINX zu Recht den Body für diese Anfrage-Methode verwirft.
Betrachten Sie dies als ein Feature oder einen Bug :-) Wenn wir dies entfernen, würden alle HEAD-Anfragen denselben ETag (Hash auf Leere) haben, was definitiv schlechter wäre.
Stellen Sie daher sicher, dass Sie Header wie folgt überprüfen:
curl -IL -X GET https://www.example.com/
Und nicht so:
curl -IL https://www.example.com/
Eine weitere erwähnenswerte Sache ist, dass es wenig bis keinen Sinn macht, dynamische ETag auf einer Seite anzuwenden, die sich bei jedem Neuladen ändert. Zum Beispiel habe ich festgestellt, dass ich den dynamischen ETag nicht mit Vorteilen verwendet habe, wegen <?= antispambot(get_option('admin_email')) ?> in der header.php meines WordPress-Themes, da in dieser Funktion:
die Auswahl zufällig ist und sich jedes Mal ändert, wenn die Funktion aufgerufen wird
Um schnell zu überprüfen, ob sich Ihre Seite beim Neuladen ändert, verwenden Sie:
diff <(curl http://www.example.com) <(curl http://www.example.com)
Jetzt, wo wir mit dem "jetzt wissen Sie" Kram fertig sind, können Sie versuchen, diese Sachen auszuprobieren :)
Synopsis
http {
server {
location ~ \.php$ {
dynamic_etag on;
fastcgi_pass ...;
}
}
}
Konfigurationsdirektiven
dynamic_etag
- syntax:
dynamic_etag on|off|$var - default:
off - context:
http,server,location
Aktiviert oder deaktiviert die automatische Anwendung von ETag.
dynamic_etag_types
- syntax:
dynamic_etag_types <mime_type> [..] - default:
text/html - context:
http,server,location
Aktiviert die automatische Anwendung von ETag für die angegebenen MIME-Typen zusätzlich zu text/html. Der spezielle Wert * entspricht jedem MIME-Typ. Antworten mit dem MIME-Typ text/html sind immer enthalten.
dynamic_etag_strength
- syntax:
dynamic_etag_strength strong|weak|$var - default:
strong - context:
http,server,location
Steuert, ob generierte ETags stark oder schwach sind. Schwache ETags sind nützlich für dynamische Inhalte, bei denen semantische Gleichheit berücksichtigt werden sollte, auch wenn die Bytes unterschiedlich sind (z. B. Zeitstempel, randomisierte Attribute). Bei Verwendung von $var auf die Werte strong oder weak abbilden.
Hinweis: Diese Direktiven sind im if-Kontext nicht gültig. Verwenden Sie bevorzugt $var mit map, um bedingtes Verhalten zu erreichen.
Beispiel mit map:
map $arg_w $etag_strength {
default strong;
1 weak;
}
location /example {
dynamic_etag on;
dynamic_etag_types text/html;
dynamic_etag_strength $etag_strength;
proxy_pass http://backend;
}
Tipps
Sie können die map-Direktive verwenden, um dynamische ETag basierend auf URLs bedingt zu aktivieren, z. B.:
map $request_uri $dyn_etag {
default "off";
/foo "on";
/bar "on";
}
server {
...
location / {
dynamic_etag $dyn_etag;
fastcgi_pass ...
}
}
README des ursprünglichen Autors
Versuch, ETag / If-None-Match bei proxied Inhalten zu behandeln.
Ich plane, dies zu verwenden, um einen Varnish-Server mit viel ESI zu betreiben.
Es funktioniert irgendwie, aber... seien Sie sich bewusst, dass dies mein erster Versuch ist, ein NGINX-Plugin zu entwickeln, und mit Headern umzugehen, nachdem der Body gelesen wurde, war nicht genau im How-To.
Jeder Kommentar und/oder Verbesserung und/oder Fork ist willkommen.
Danke an http://github.com/kkung/nginx-static-etags/ für... Inspiration.
GitHub
Sie finden zusätzliche Konfigurationstipps und Dokumentation für dieses Modul im GitHub-Repository für nginx-module-dynamic-etag.