Nginx - 別の内部ロケーションブロックへの proxy_pass

Nginx - 別の内部ロケーションブロックへの proxy_pass

私は Nginx を使用していくつかの応答をキャッシュしています。これらの応答を生成するバックエンドは、Cache-controlすべての応答に共通のヘッダーを設定します。ただし、一部の応答は他の応答よりも長い期間キャッシュする必要があります。つまり、ディレクティブcache-controlによって考慮される前にヘッダーを変更する必要がありますproxy_pass

私は を使用しており、ディレクティブを使用してロケーション ブロックのヘッダーngx_lua_moduleを変更したいと考えています。意図する構成は次のようになります。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
    }
}

しかし、 を介してこの内部リダイレクトを実現する方法がわかりませんでしたproxy_pass。これを機能させるための洞察があればいただければ幸いです。

答え1

proxy_pass場所を指定することはできません 。proxy_passアップストリームまたはURL(基本的には宣言されていないアップストリーム)のみを指定できます。したがって、質問に正式に答えるとproxy_passローカルホストHost ヘッダーを現在の に設定しますserver_nameが、これにより状況が複雑になりすぎる可能性があります。

その代わりlocation / {}-必要のない を削除して、location = /actualに名前を変更するだけでよいようですlocation / {}

また、lua はまったく必要ありません。プロキシされた Web から取得するヘッダーを削除しproxy_hide_header、 で独自のヘッダーを追加するだけですadd_header

答え2

一般的に、別のロケーションブロックに制御を渡すには、内部リダイレクトを使用する必要があります(リライト)、 ないproxy_pass

location / {
    rewrite ^.*$ /actual;
}

アップストリームヘッダーを変更するには、プロキシセットヘッダー:

location /actual {
    proxy_set_header Cache-Control '<your value>';
}

ダウンストリームヘッダーを変更するには、ヘッダーをもっと見る追加のモジュールを使用したカスタム Nginx ビルドが必要ですが、あなたのケースでは非常に強力です:

location /actual {
    more_set_headers 'Cache-Control: <your value>';
}

質問のタイトルを考慮すると、クライアントのトラフィックを処理するためにサーバーを切り替えるなどのハードコアなこともできます。このような些細なタスクにはお勧めしませんが、まれに役立つ場合があります。

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;
    }

}

関連情報