кэширование лака POST-запросов - PullRequest
5 голосов
/ 26 января 2012

То, что я делаю, слегка безумие, но, поскольку у запросов GET очень строгий предел размера, solr использует POST-запросы к /solr/select URL, чтобы сделать то, что «семантически» GET.пытаясь нанести лак перед solr для некоторого кеширования.Я поместил это в vcl_recv функцию:

 if (!(req.request == "GET" || req.request == "HEAD" ||
     (req.request == "POST" && req.url == "/solr/select"))) {
     /* We only deal with GET and HEAD by default */
     /* Modified to support POST to /solr/select */
     return (pass);
 }

, и лак теперь пытается справиться с этим, за исключением того, что он автоматически преобразует POST в GET.Смешно и далеко от лучших практик, но в любом случае, есть ли простой способ использовать лак таким способом?

Ответы [ 2 ]

3 голосов
/ 27 января 2012

Вы можете попробовать изменить req.POST в GET и преобразовать данные POST в параметры GET (вам, вероятно, придется использовать inline-C) и выполнить поиск / выборку.

Этот запрос GETлимит из спецификации HTTP не обязательно реализуется ни Varnish, ни вашим внутренним сервером.Поскольку вы не зависите от промежуточных кэшей и пользовательских агентов вне вашего контроля для обработки длинных URL-адресов, вы можете попробовать.

2 голосов
/ 02 февраля 2018

Я начал работать после прочтения этого урока .

В учебнике не говорится о том, что при использовании Varnish 4.1 в одном из обязательных VMODS есть ошибка, эта ошибка приводит к тому, что первый запрос POST передается бэкэнду с усеченным телом.

Я решил это с помощью Varnish 5 и работает как шарм.

Если вы хотите попробовать, у меня есть Dockerfile для этого:

Dockerfile:

FROM alpine:3.7

LABEL maintainer lloiacono@*******.com

RUN apk update \
    && apk add --no-cache varnish \
    && apk add git \
    && git clone https://github.com/varnish/varnish-modules.git \
    && apk add automake && apk add varnish-dev \
    && apk add autoconf && apk add libtool \
    && apk add py-docutils && apk add make \
    && cd varnish-modules/ \
    && ./bootstrap && ./configure && make && make install

COPY start.sh /usr/local/bin/docker-app-start

RUN chmod +x /usr/local/bin/docker-app-start

CMD ["docker-app-start"]

start.sh

#!/bin/sh
set -xe

varnishd -a :80 -f /etc/varnish/default.vcl -s malloc,256m
varnishlog
...