清单缓存POST请求

时间:2012-01-26 18:49:26

标签: http solr varnish

我正在做的是有点疯狂,但由于GET请求的大小限制非常严格,因此solr使用对/solr/select URL的POST请求来执行“语义上”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);
 }

和varnish现在尝试处理它,除了它自动将POST转换为GET。

我知道所有这些都是相当荒谬的,并且远非任何最佳实践,但无论如何,是否有一种简单的方法以这种方式使用清漆?

2 个答案:

答案 0 :(得分:3)

您可以尝试将req.POST更改为GET,并将POST数据转换为GET参数(您可能必须使用inline-C)并执行查找/获取。

来自HTTP规范的此GET请求限制不一定由Varnish或您的后端服务器实现。由于您不依赖于控制之外的中间缓存和用户代理来处理长网址,因此您可以尝试一下。

答案 1 :(得分:2)

我在阅读tutorial from之后就开始工作了。

教程没有说的是,当使用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