Nginx - Proxy_Pass zu einem anderen internen Standortblock

Nginx - Proxy_Pass zu einem anderen internen Standortblock

Ich verwende Nginx, um einige Antworten zwischenzuspeichern. Das Backend, das diese Antworten generiert, legt einen gemeinsamen Cache-controlHeader 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-controlberü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-Controlinternalheader_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_passauf einen Standort zugreifen, sondern nur proxy_passauf einen Upstream oder eine URL (die im Grunde nicht als Upstream deklariert ist). Um Ihre Frage also formal zu beantworten, sollten proxy_passSielokaler 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 = /actualin 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_headerund 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;
    }

}

verwandte Informationen