
私は Nginx を使用していくつかの応答をキャッシュしています。これらの応答を生成するバックエンドは、Cache-control
すべての応答に共通のヘッダーを設定します。ただし、一部の応答は他の応答よりも長い期間キャッシュする必要があります。つまり、ディレクティブcache-control
によって考慮される前にヘッダーを変更する必要がありますproxy_pass
。
私は を使用しており、ディレクティブを使用してロケーション ブロックのヘッダーngx_lua_module
を変更したいと考えています。意図する構成は次のようになります。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
}
}
しかし、 を介してこの内部リダイレクトを実現する方法がわかりませんでした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;
}
}