我必须缓存多个后端服务器,我从Nginx切换到Varnish,最后发现2个服务器需要运行HTTP基本身份验证。 我试试这个链接http://blog.tenya.me/blog/2011/12/14/varnish-http-authentication它对我不起作用(他们运行了Varnish 3) 有没有一种简单的方法在Varnish 4中配置基本身份验证?
答案 0 :(得分:7)
您可以使用VMOD basicauth
首先你需要安装它。从the Git repo for basicauth下载源代码。提取到您的homedir,例如〜/ VMOD-的BasicAuth /
您还需要使用Varnish源来构建VMOD。
在Debian / Ubuntu类型
apt-get source varnish
这会将来源复制到您的密码。
然后执行此操作以安装它。请注意,您需要根据您的设置和清漆版本
更改路径cd ~/vmod-basicauth
./configure VARNISHSRC=$HOME/varnish-4.0.2
make
sudo make install
sudo make check
<强>更新强> 似乎已经从Ubuntu和Debian软件包中删除了源代码(很可能是偶然的)。
直接从Git (v4.0.2)
下载来源制作清漆
你必须&#34;制作&#34;下载的来源
cd ~
wget https://github.com/varnish/Varnish-Cache/archive/varnish-4.0.2.zip
unzip varnish-4.0.2.zip
cd Varnish-Cache-varnish-4.0.2
sudo ./autogen.sh
sudo ./configure --prefix=/usr
sudo make
请注意,您不必安装源代码,因此不要&#34; make-install&#34; ,因为这可能会破坏您当前的安装。< / p>
构建&amp;安装VMOD
cd ~
./configure VARNISHSRC=$HOME/Varnish-Cache-varnish-4.0.2
make
sudo make install
sudo make check
如果无法自动检测VMOD安装目录,则可能还需要指定它。如果./configure失败,请尝试此
./configure VARNISHSRC=$HOME/Varnish-Cache-varnish-4.0.2 VMODDIR=/usr/lib/varnish/vmods/
某些构建依赖项
我经常需要很多不同的构建依赖项,因此我经常在设置新的Varnish服务器时安装它们。
sudo apt-get install git-core zlib1g-dev automake build-essential libtool libssl-dev libreadline-dev libyaml-dev libsqlite3-dev ncurses-dev sqlite3 libxml2-dev libxslt1-dev libpcre3-dev libcurl4-openssl-dev python-docutils python-software-properties libvarnishapi-dev
它使用.htpasswd文件进行身份验证,而不是将密码直接存储在VCL中。
确保更改&#34; /var/www/.htpasswd"到你的htpasswd文件的路径。
#default.vcl
import basicauth;
sub vcl_recv {
if (!basicauth.match("/var/www/.htpasswd", req.http.Authorization)) {
return(synth(401, "Authentication required"));
}
}
#Prompt the user for a password
sub vcl_synth {
if (resp.status == 401) {
set resp.http.WWW-Authenticate = "Basic";
}
}
答案 1 :(得分:4)
这也有效:
sub vcl_recv {
if (! req.http.Authorization ~ "Basic Zm9vOmJhcg==") {
return(synth(401, "Authentication required"));
}
unset req.http.Authorization
}
sub vcl_synth {
if (resp.status == 401) {
set resp.status = 401;
set resp.http.WWW-Authenticate = "Basic";
return(deliver);
}
}
src:http://blog.tenya.me/blog/2011/12/14/varnish-http-authentication/#comment-2882579903
答案 2 :(得分:2)
对于在Debian Jessie上执行这些步骤的任何人 - 从源代码构建Varnish时可能会遇到一些问题。
该automake需要在configure.ac第18行中指定的subdir-options
AM_INIT_AUTOMAKE([1.11 foreign color-tests parallel-tests subdir-options])
bin / varnishadm和bin / varnishhist中的Makefile要求变量$(top_srcdir)替换为../../,因为automake中的变量扩展存在错误(请参阅https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=402727)< / p>
varnishadm_SOURCES = \
varnishadm.c \
../../lib/libvarnish/vas.c \
../../lib/libvarnish/vsa.c \
../../lib/libvarnish/vtcp.c \
../../lib/libvarnish/vss.c
修复这些内容,然后您可以按照上面jacob-rastad的答案中的说明进行操作。
我在这里做了一些进一步的说明:http://www.blue-bag.com/blog/compiling-varnish-modules
答案 3 :(得分:2)
这就是我在Docker容器中使用Varnish 4.1进行基本身份验证VMOD的方法https://github.com/blmr/varnish-basic-auth-docker
1)安装依赖项
apt-get install -y apt-transport-https \
&& apt-get install -y git-core zlib1g-dev automake build-essential libtool libssl-dev \
libreadline-dev libyaml-dev libsqlite3-dev ncurses-dev sqlite3 libxml2-dev libxslt1-dev \
libpcre3-dev libcurl4-openssl-dev python-docutils python-software-properties libvarnishapi-dev
2)添加清漆回购
curl https://repo.varnish-cache.org/GPG-key.txt | apt-key add -
printf "deb https://repo.varnish-cache.org/ubuntu/ trusty varnish-4.1 \ndeb-src https://repo.varnish-cache.org/ubuntu/ trusty varnish-4.1" >> /etc/apt/sources.list.d/varnish-cache.list && apt-get update
3)安装Varnish 4.1
apt-get install -qy varnish
4)获取清漆源并进行编译
apt-get source varnish && rm *.diff.gz *.dsc *.tar.gz \
&& mv varnish* varnish-source && cd varnish-source && ./autogen.sh && ./configure --prefix=/usr/sbin && make
5)获取Varnish basic auth VMOD并进行编译
git clone http://git.gnu.org.ua/cgit/vmod-basicauth.git && cd vmod-basicauth \
&& git clone http://git.gnu.org.ua/repo/acvmod.git && ./bootstrap \
&& ./configure VARNISHSRC=/varnish-source VMODDIR=/usr/lib/varnish/vmods/ && make && make install && make check
6)更新default.vcl
sub vcl_recv {
if (!basicauth.match("/etc/varnish/htpasswd", req.http.Authorization)) {
return(synth(401, "Authentication required"));
}
}
sub vcl_synth {
if (resp.status == 401) {
set resp.http.WWW-Authenticate = "Basic";
}
}