2012-01-26 19 views
5

Co robię jest lekko szalona, ​​ale ponieważ żądania GET mają bardzo ścisły limit rozmiaru, solr używa żądania POST do adresu /solr/select URL, aby zrobić to, co jest "semantycznie" GET.Pamięć podręczna buforowania zapytań POST

Próbuję umieścić lakier przed Solr, aby zrobić buforowanie. Ja to w vcl_recv funkcji:

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); 
} 

i lakierów teraz próbuje poradzić z wyjątkiem automatycznie konwertuje posta GET.

Jestem świadomy, że wszystko to jest dość niedorzeczne i dalekie od najlepszych praktyk, ale czy w ogóle istnieje łatwy sposób użycia lakieru w ten sposób?

Odpowiedz

3

Możesz spróbować zmienić parametr req.POST na GET i przekształcić dane POST na parametry GET (prawdopodobnie będziesz musiał użyć inline-C) i wykonać wyszukiwanie/pobieranie.

Ten limit żądania GET ze specyfikacji HTTP niekoniecznie jest implementowany przez Varnish lub serwer back-end. Ponieważ nie zależy to od pośrednich pamięci podręcznych i agentów użytkownika poza kontrolą obsługi długich adresów URL, można spróbować.

+0

nie mam umieścić to wszystko razem jeszcze , ale Tomcat ma parametr konfiguracyjny dla maksymalnego rozmiaru żądania HTTP, a Solr jest zadowolony z adresów URL 64kB, więc powinien działać. – taw

1

Mam to działa po przeczytaniu tego tutorial from.

Samouczek nie mówi, że w jednym z wymaganych VMODS występuje błąd podczas korzystania z Varnish 4.1, ten błąd powoduje, że pierwsze żądanie POST jest przekazywane do backendu z obciętym ciałem.

Rozwiązałem to za pomocą lakieru 5 i działa jak urok.

Jeśli chcesz spróbować Mam Dockerfile na to:

Dockerfile:

FROM alpine:3.7 

LABEL maintainer [email protected]*******.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 
Powiązane problemy