
Ich verwende Nginx, um einige Antworten zwischenzuspeichern. Das Backend, das diese Antworten generiert, legt einen gemeinsamen Cache-control
Header für alle Antworten fest. Allerdings muss ich einige der Antworten länger zwischenspeichern als andere. Das heißt, ich muss den Header ändern, bevor er von der Direktive cache-control
berücksichtigt wird .proxy_pass
Ich verwende die und möchte den Header im Standortblock mithilfe der Direktive ngx_lua_module
ändern . Die beabsichtigte Konfiguration sieht wie folgt aus:Cache-Control
internal
header_filter_by_lua_block
location / {
proxy_pass /actual;
proxy_cache something;
}
location = /actual {
internal;
proxy_pass https://backend;
proxy_cache off;
header_filter_by_lua_block {
-- modify cache-control header based on request/response parameters
}
}
Ich konnte jedoch keine Möglichkeit finden, diese interne Umleitung über zu erreichen proxy_pass
. Ich wäre für alle Erkenntnisse dankbar, die Sie haben, um dies zu ermöglichen.
Antwort1
Sie können nicht proxy_pass
auf einen Standort zugreifen, sondern nur proxy_pass
auf einen Upstream oder eine URL (die im Grunde nicht als Upstream deklariert ist). Um Ihre Frage also formal zu beantworten, sollten proxy_pass
Sielokaler Hostmit dem aktuellen Host-Header eingestellt server_name
; aber das würde die Sache wahrscheinlich unnötig verkomplizieren.
Stattdessen- es sieht so aus, als müssten Sie nur das entfernen, location / {}
was Sie nicht benötigen, und es dann location = /actual
in umbenennen location / {}
.
Ich würde auch sagen, dass Sie Lua überhaupt nicht brauchen – entfernen Sie einfach den Header, den Sie vom geproxieten Web erhalten, proxy_hide_header
und fügen Sie Ihren eigenen hinzu add_header
.
Antwort2
Um die Kontrolle an einen anderen Standortblock zu übergeben, sollten Sie grundsätzlich interne Weiterleitungen verwenden (umschreiben), nicht proxy_pass
:
location / {
rewrite ^.*$ /actual;
}
Um Upstream-Header zu ändern, können Sie verwendenProxy_Header festlegen:
location /actual {
proxy_set_header Cache-Control '<your value>';
}
Um Downstream-Header zu ändern, können Sie verwendenmehr_set_headers. Es erfordert einen benutzerdefinierten Nginx-Build mit zusätzlichen Modulen, ist in Ihrem Fall aber wirklich leistungsstark:
location /actual {
more_set_headers 'Cache-Control: <your value>';
}
Unter Berücksichtigung des Titels der Frage können Sie auch Hardcore-Aufgaben wie das Wechseln von Servern zur Abwicklung des Client-Datenverkehrs durchführen. Ich würde es für solche trivialen Aufgaben NICHT empfehlen, aber in seltenen Fällen könnte es helfen:
http {
upstream internal_http_routing {
server unix:var/internal.sock;
}
server {
# Internal interface
listen unix:var/internal.sock;
location / {
return 200;
}
}
server {
# Client-facing interface
listen 443 ssl;
location / {
proxy_pass http://internal_http_routing;
}
}
}
tcp {
upstream internal_tcp_routing {
server unix:var/internal.sock;
}
server {
# Client-facing interface
listen 8443 ssl;
proxy_pass internal_tcp_routing;
}
}