2012-01-26 11 views
5

Quello che sto facendo è leggermente folle, ma poiché le richieste GET hanno un limite di dimensioni molto ristretto, solr usa le richieste POST all'URL /solr/select per fare ciò che è "semanticamente" un GET.cache caching di richieste POST

Sto provando a mettere la vernice davanti a solr per fare un po 'di cache. Ho messo questo in vcl_recv funzione:

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

e vernici ora tenta di gestire che tranne che converte automaticamente un post per un GET.

Sono consapevole che tutto ciò è abbastanza ridicolo e lontano dalle migliori pratiche, ma in ogni caso, c'è un modo semplice per usare la vernice in questo modo?

risposta

3

Si potrebbe provare a cambiare il req.POST in un GET e trasformare i dati POST in GET parameters (probabilmente si dovrà usare inline-C) e fare un lookup/fetch.

Questo limite di richiesta GET dalle specifiche HTTP non è necessariamente implementato da Varnish o dal server back-end. Poiché non dipendi dalle cache intermedie e dagli agenti utente esterni al tuo controllo per gestire gli URL lunghi, puoi provarlo.

+0

non ho messo tutto insieme ancora , ma Tomcat ha parametri di configurazione per le dimensioni massime richieste HTTP e solr è soddisfatto degli URL 64kB, quindi dovrebbe funzionare. – taw

1

Ho funzionato dopo aver letto questo tutorial from.

Quello che il tutorial non dice è che c'è un bug in uno dei VMOD necessari quando si usa con Varnish 4.1, questo bug ha l'effetto che la prima richiesta POST viene passata al back-end con un corpo troncato.

Ho risolto questo problema utilizzando Varnish 5 e funziona come un incantesimo.

Se si vuole fare un tentativo ho un Dockerfile per questo:

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 
Problemi correlati