我正在做的是有点疯狂,但由于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。
我知道所有这些都是相当荒谬的,并且远非任何最佳实践,但无论如何,是否有一种简单的方法以这种方式使用清漆?
答案 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