Nginx - proxy_pass к другому внутреннему блоку расположения

Nginx - proxy_pass к другому внутреннему блоку расположения

Я использую 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;
    }

}

Связанный контент