2012-01-26 80 views
5

我正在做的事情是輕度瘋狂的,但由於GET請求具有非常嚴格的大小限制,solr使用POST請求到/solr/select URL做「什麼」語義上的GET。POST請求的清漆緩存

我想把清漆放在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。

我知道這一切都相當荒謬,遠離任何最佳實踐,但無論如何,有沒有一種簡單的方法來使用這種清漆?

回答

3

您可以嘗試將req.POST更改爲GET,並將POST數據轉換爲GET參數(您可能必須使用內聯C)並執行查找/獲取。

HTTP規範中的GET請求限制不一定由Varnish或您的後端服務器實現。由於您不依賴於您的控制之外的中間緩存和用戶代理來處理長時間的URL,因此您可以嘗試一下。

+0

我沒有把它放在一起還,但Tomcat具有最大HTTP請求大小的配置參數,solr對64kB URL很滿意,所以它應該可以工作。 – taw

1

我讀到這個tutorial from後得到它的工作。

本教程沒有提及的是,當使用Varnish 4.1時,其中一個所需的VMODS中存在一個錯誤,這個錯誤會導致第一個POST請求被傳遞給後端並被截斷的正文。

我通過使用Varnish 5解決了這個問題,並像魅力一樣工作。

如果你想試試看我有一個Dockerfile此:

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