Назад | Перейти на главную страницу

Сервер кэширования HTTP, поддерживающий POST

Я размещаю службу REST, которая отправляет соответствующие заголовки управления кешем. Я использую Varnish в качестве кэширующего сервера перед своим веб-сервером. Однако ограничение varnish заключается в том, что он не поддерживает кеширование HTTP POST и HTTP PUT. Есть ли альтернативный кэширующий сервер, который сможет кэшировать эти запросы?

Я понимаю, что кэширование POST немного сложно, потому что вы не можете просто кэшировать на основе URL-адреса в качестве ключа, как для GET; ему действительно нужно проверить тело запроса. В случае multipart/form-data запросы, вероятно, должно быть ограничение на размер тела запроса для его кэширования (чтобы большие загрузки файлов и т. д. не кэшировались). Тем не менее я действительно хочу иметь возможность кэшировать короткие HTTP POST или, по крайней мере, application/x-www-form-urlencoded ед.

Вы отметили свой вопрос , но, видимо, вы не знаете proxy_cache_methods и proxy_cache_key директивы что должно позволить вам также проксировать ответы POST при условии, что ваш сервер использует заголовки управления кешем для ответов POST.

Идея заключалась бы в том, чтобы включить POST с помощью proxy_cache_methods и найдите подходящую строку для proxy_cache_key. Значение по умолчанию $scheme$proxy_host$request_uri; не будет работать так хорошо, как вы подозреваете, но вы можете выбрать из большого списка Переменные Nginx чтобы получить то, что соответствует вашим потребностям.

Основная идея кэширования - предоставить одинаковые ответы на один и тот же запрос, не запрашивая серверную систему. Проблема с запросами POST заключается в том, что вам нужно проверить тело, чтобы решить, когда два запроса совпадают. Лучшее решение - перейти с POST на GET.

Если это не применимо, вы можете попробовать Прокси-модуль Nginx со следующей настройкой (см. необходимое ограничение на размер тела):

location @apache_backend {
    ...
    proxy_cache_methods   POST;
    proxy_cache_key       "$uri|$request_body";
    client_max_body_size  1k;
}