Varnish 4 基本认证

Varnish 4 Basic authentication

我必须缓存多个后端服务器,我从 Nginx 切换到 Varnish,最后发现 2 个服务器需要 运行 HTTP 基本身份验证。 我尝试了这个 link http://blog.tenya.me/blog/2011/12/14/varnish-http-authentication 但它对我不起作用(他们 运行 Varnish 3) 有没有简单的方法在 Varnish 4 中配置基本身份验证?

您可以使用 VMOD basicauth

安装清漆 VMOD

首先你需要安装它。从 the Git repo for basicauth 下载源代码。提取到您的主目录中,例如~/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)

下载源

制作清漆

您必须"make"下载的源

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

请注意,您不必安装源代码,因此不要"make-install",因为这可能会扰乱您当前的安装。

构建并安装 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

配置 Varnish 以使用 VMOD

它使用 .htpasswd 文件进行身份验证,而不是将密码直接存储在 VCL 中。

确保将“/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";
    }
}

对于在 Debian Jessie 上遵循这些步骤的任何人 - 从源代码构建 Varnish 时,您可能会遇到几个问题。

  1. automake 需要在 configure.ac 第 18 行中指定的子目录选项

    AM_INIT_AUTOMAKE([1.11 foreign color-tests parallel-tests subdir-options])
    
  2. bin/varnishadm 和 bin/varnishhist 中的 Makefile 需要将变量 $(top_srcdir) 替换为 ../../ 由于变量中的错误automake 中的扩展(参见 https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=402727

    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

这就是我在 Docker 容器 https://github.com/blmr/varnish-basic-auth-docker

中使用 Varnish 4.1 进行基本身份验证 VMOD 的方式

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) 获取 Varnish 源码并编译

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";
  }
}

这也有效:

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);
  }
}

来源:http://blog.tenya.me/blog/2011/12/14/varnish-http-authentication/#comment-2882579903