Mein Team verwendet nginx mitZwischenspeicherDas Problem ist, dass die Anwendung im Upstream einige Header sendet, die wir überschreiben möchtenim zwischengespeicherten Objekt. Man kann die im zwischengespeicherten Objekt gespeicherten Header sehen, wenn man im Cache nach dem Schlüssel (oder einem Teil des Schlüssels) sucht. Zum Beispiel
cd /var/cache/nginx/test
grep -inr part_of_key *
Binary file 6/29/7bcd0cd0aadfd536cdd7183cd8b77296 matches
man kann dann tun
strings 6/29/7bcd0cd0aadfd536cdd7183cd8b77296
# content with keys, cached headers and so on
Die Nginx-Konfiguration ist (vereinfacht)
# part of server1
location / {
proxy_pass http://upstream;
proxy_cache zone1;
}
Jetzt kenne ich die Direktive proxy_hide_header
und habe versucht, die Header im zwischengespeicherten Objekt zu entfernen (und zu ersetzen), aber es funktioniert nicht. Es fühlt sich an, als wäre der Prozess der folgende:
- Der Upstream sendet die Antwort
- nginx liest die Antwort
- Die Antwort wird in einer Datei im Cache gespeichert
- Es werden Operationen an der Antwort durchgeführt, wie z. B. das Entfernen von Headern, um die Antwort an den Client zu senden
Daher scheint es keine Möglichkeit zu geben, die Header der Antwort zu beeinflussen, bevor diese im Cache gespeichert werden.
Ein Workaround, den ich entwickeln könnte, besteht darin, einfach einen anderen Nginx-Server dazwischen zu setzen, sodass dieser die Header ändern kann, die dann im Cache gespeichert werden server1
.
Beispiel
# part of server1
location /
proxy_pass http://upstream-modify-headers;
proxy_set_header Host modify.headers;
proxy_cache zone1;
}
# the upstream
upstream upstream-modify-headers {
server 127.0.0.1:80;
}
#the host that modifies the headers
server {
listen *:80;
server_name modify.headers;
add_header "cache-control" "public, max-age=10, must-revalidate";
...
location / {
proxy_pass http://upstream;
proxy_hide_header cache-control; #one example header that should be modified in the cache
}
...
allow 127.0.0.1; #only locally available
}
Dies funktioniert, erfordert aber einen zusätzlichen Nginx-Host.Ist es stattdessen möglich, die Header im zwischengespeicherten Objekt innerhalb desselben Nginx-Servers zu überschreiben, ohne einen weiteren im Upstream hinzuzufügen?
Antwort1
Scheint, als ob Sie nach einer Richtlinie suchen proxy_hide_header
.
Antwort2
Als Workaround können Sie versuchen, den Headern einen Zeitstempel hinzuzufügen. Sie fügen ihn hinzu und können dann unterscheiden, welche Header aus dem Cache stammen und welche neu sind (durch Vergleich im Zugriffsprotokoll mit anderen Zeitstempeln).