Nginx. Header im zwischengespeicherten Objekt überschreiben, ist das möglich?

Nginx. Header im zwischengespeicherten Objekt überschreiben, ist das möglich?

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_headerund 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:

  1. Der Upstream sendet die Antwort
  2. nginx liest die Antwort
  3. Die Antwort wird in einer Datei im Cache gespeichert
  4. 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).

verwandte Informationen