[英]varnish caching of POST requests
我正在做的事情有点疯狂,但是由于GET请求具有非常严格的大小限制,因此solr使用POST请求对/solr/select
URL进行“语义上”的操作。
我试图将清漆放在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。
我知道所有这些都是很荒谬的,与最佳实践相去甚远,但是无论如何,有没有一种简单的方法可以使用这种清漆?
教程没有说的是,与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
您可以尝试将req.POST更改为GET,然后将POST数据转换为GET参数(您可能必须使用inline-C)并执行查找/获取。
HTTP规范中的GET请求限制不一定由Varnish或您的后端服务器实现。 由于您不依赖控件之外的中间缓存和User-Agent处理长网址,因此可以尝试一下。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.