2012-01-26 22 views
5

Lo que estoy haciendo es ligeramente insano, pero como las solicitudes GET tienen un límite de tamaño muy estricto, solr usa solicitudes POST a /solr/select URL para hacer lo que "semánticamente" es un GET.caché de barniz de solicitudes POST

Estoy tratando de poner barniz en frente de solr para hacer un poco de almacenamiento en caché. Pongo esto en función de 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); 
} 

y barniz ahora trata de manejar eso, excepto que convierte automáticamente un POST a un GET.

Soy consciente de que todo eso es bastante ridículo y está lejos de ser una buena práctica, pero en cualquier caso, ¿existe una manera fácil de usar el barniz de esta manera?

Respuesta

3

Podría intentar cambiar el req.POST en un GET, y transformar los datos POST a los parámetros GET (probablemente tendría que usar inline-C) y hacer una búsqueda/recuperación.

Este límite de solicitud GET de la especificación HTTP no necesariamente se implementa con Varnish o con su servidor de fondo. Como no depende de cachés intermedios y Agentes de usuario fuera de su control para manejar URL largas, puede intentarlo.

+0

no he puesto todo junto sin embargo, , pero Tomcat tiene un parámetro de configuración para el tamaño máximo de solicitud HTTP, y solr está contento con las URL de 64kB, por lo que debería funcionar. – taw

1

Lo tengo trabajando después de leer este tutorial from.

Lo que el tutorial no dice es que hay un error en uno de los VMODS requeridos cuando se usa con Varnish 4.1, este error tiene el efecto de que la primera solicitud POST se pasa al backend con un cuerpo truncado.

Lo resolví con el uso de Varnish 5 y funciona como un amuleto.

Si quieres darle una oportunidad Tengo un Dockerfile para esto:

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 
Cuestiones relacionadas