通过 Hitch 实现 Varnish-Cache 的 HTTP/2 支持

前言

时至 2017年5月 Varnish-Cache 对 HTTPS和h2 的支持都是不可生产的,不过好消息是预计在 2017年秋季推出可以在生产环节运行 HTTPS和h2 的 Varnish-Cache 6。

不过在正式推出之前,我们可以通过 Nginx 再多一次代理来实现 h2 支持。但是如果我后端是 Apache Httpd,不想再安装一个 Nginx,那么这次我就介绍一个另一个代理工具 —— Hitch 来实现 h2。

介绍

Hitch 是 Varnish-Cache 的开发公司 Varnish Software 开发的基于 libev 的高性能 SSL/TLS 开源代理软件。

主要特性:

  • 支持 NPN 或 ALPN 扩展实现 HTTP/2
  • 支持 TLS 1.0, TLS 1.1 和 TLS 1.2
  • SNI, 支持泛域名证书和非泛域名证书
  • 自动 OCSP stapling 支持
  • 支持PROXY协议将客户端IP /端口信号发送给后端
  • 大规模安全支持,高达 15000 个侦听套接字和 50 万证书
  • 支持平滑重新加载证书和监听端点

    教程

    目前只有 Debian (8)Jessie-Backports 是支持 Hitch1.4 和 OpenSSL 1.0.2 的长期支持的发行版,其他发行版要么 Hitch 太旧不支持 h2 特性,要么 OpenSSL 太旧不支持 ALPN 协议实现 h2,要么就不是 LTS 版本。

所以教程以 Debian 8 为例。SSL 证书通过 ACMETool 安装 Let’s Encrypt 证书。

升级系统

一、在 /etc/apt/source.list 中根据原来的镜像源添加jessie-backports,如果已经存在就不用添加了:

deb http://mirrors.digitalocean.com/debian jessie-backports main

二、 升级软件

apt-get update
apt-get -t jessie-backports upgrade -y

三、安装 OpenSSL 1.0.2

apt-get -t jessie-backports install openssl -y

安装 Varnish-Cache

Varnish-Cache 的安装请查看:

https://www.mf8.biz/varnish-wordpress-make-fast-1/

设置 验证端口

创建 /etc/varnish/acmetool.vcl 文件


backend acmetool {
   .host = "127.0.0.1";
   .port = "402";
}

sub vcl_recv {

    if (req.url ~ "^/.well-known/acme-challenge/") {
        set req.backend_hint = acmetool;
return(pass);
    }
}

/etc/varnish/default.vcl 末尾加入

include "/etc/varnish/acmetool.vcl";

添加代理端口

修改 /lib/systemd/system/varnish.serviceExecStart 末端加入 -a '[::1]:6086,PROXY'

例如:

ExecStart=/usr/sbin/varnishd -a :6081 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m -a '[::1]:6086,PROXY'

修改 /etc/default/varnishDAEMON_OPTS= 中添加 -a '[::1]:6086,PROXY'

例如:

DAEMON_OPTS="-a :6081 \
             -T localhost:6082 \
             -f /etc/varnish/default.vcl \
             -S /etc/varnish/secret \
             -s malloc,256m" \
             -a '[::1]:6086,PROXY'

输入以下命令重启 Varnish-Cache

systemctl daemon-reload
service varnish restart

Acmetool

一、安装 Acmetool,同样需要通过 Jessie-Backports:

apt-get -t jessie-backports install acmetool

二、设置 Acmetool

acmetool quickstart

选择

1) Let's Encrypt (Live) - I want live certificates

···

2) PROXY - I'll proxy challenge requests to an HTTP server

···

然后就是输入邮箱和一路 y 了

三、生成 dhparams 文件

openssl dhparam -out /var/lib/acme/conf/dhparams 2048

四、申请证书

acmetool want mf8.biz www.mf8.biz

将我的域名替换成你的就行。

设置 Hitch

修改 /etc/hitch/hitch.conf 文件

frontend = "[*]:443"
ciphers  = "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"

backend        = "[::1]:6086"
write-proxy-v2 = on
alpn-protos = "h2,http/1.1"
tls-protos = TLSv1.1 TLSv1.2

pem-file = "/var/lib/acme/live/www.mf8.biz/haproxy"

将最后一行中 www.mf8.biz 替换成你的就行。

重启 hitch 就大功告成了!

service hitch start

8 条评论

发表评论

  • 这是找到的一篇很不错的文章。看完后有几个问题,还请作者指教。
    1、架构是hitch—-varnish 5—-nginx?
    2、hitch中启用了alpn,那是否你的varnish 5是开启了http/2的?
    3、后端使用的nginx是否启用了http/2呢?还是从varnish到nginx走的是http 1.1

    • 1.是这样的架构,的确有点小烦
      2.write-proxy-v2 = on 是声明开启 h2,varnish 5本身还不支持 https,依然也不支持htpp/2
      3.仅 Hitch 这一层开了 HTTPS

      HTTPS 只在443端口开启,所有非443端口的反代都不需要https

      • 另外,我目前的配置让hitch启用alpn,varnish5启用proxy_protocol协议,并且在varnish的backend里增加.proxy_header=1,让nginx开启http2,这样是完全可以让网站支持h2的,但是此时varnish并不会做任何缓存操作,从对你的网页分析,感觉X-Cache和x-store这两个头部都是nginx响应的,并不是varnish响应的吧

        • Varnish的缓存规则需要使用varnish设置

        • 我记得我有单独写过一篇varnish的教程