
Я использую 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
к upstream или URL (который по сути является необъявленным upstream). Так что, отвечая на ваш вопрос формально, вы proxy_pass
должнылокальный хостс заголовком Host, установленным на текущий server_name
; но это, вероятно, слишком все усложнит.
Вместо- похоже, все, что вам нужно сделать, это избавиться от location / {}
ненужного, а затем переименовать location = /actual
в location / {}
.
Я бы также сказал, что вам вообще не нужен lua — просто удалите заголовок, который вы получаете от проксируемого веба, proxy_hide_header
и добавьте свой собственный с помощью add_header
.
решение2
В общем случае, чтобы передать управление другому блоку местоположения, следует использовать внутренние перенаправления (переписать), нет proxy_pass
:
location / {
rewrite ^.*$ /actual;
}
Для изменения заголовков восходящего потока вы можете использоватьproxy_set_header:
location /actual {
proxy_set_header Cache-Control '<your value>';
}
Для изменения заголовков нижестоящего потока можно использоватьmore_set_headers. Для этого требуется специальная сборка 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;
}
}