通过 Hitch 实现 Varnish-Cache 的 HTTP/2 支持
本文最后更新于 2000 天前,其中的信息可能已经有所发展或是发生改变。

前言

时至 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://bbs.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 :80 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,512m -a '[::1]:6086,PROXY'

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

例如:

DAEMON_OPTS="-a :80 \
             -T localhost:6082 \
             -f /etc/varnish/default.vcl \
             -S /etc/varnish/secret \
             -s malloc,512m \
             -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

评论

  1. 7年前
    2017-5-02 12:09:09

    可惜看不懂

  2. 7年前
    2017-6-28 22:26:33

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

    • 妙正灰
      博主
      撒加
      7年前
      2017-6-28 22:40:31

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

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

      • 妙正灰
        7年前
        2017-6-30 14:49:08

        不知博主是否方便发下完整的配置呢?就是hitch varnish5 以及后端nginx的主要配置?

      • 妙正灰
        7年前
        2017-6-30 14:55:27

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

        • 妙正灰
          博主
          撒加
          7年前
          2017-6-30 20:56:11

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

      • 妙正灰
        7年前
        2017-6-30 22:15:44

        博主方便把主要部分配置分享下吗?

        • 妙正灰
          博主
          撒加
          7年前
          2017-7-01 10:54:04

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

  3. 5年前
    2018-10-27 16:50:18

    刚刚设置好了hitch,提示一下上面的两处错误:

    /lib/systemd/system/varnish.service
    [code]
    ExecStart=/usr/sbin/varnishd -a :80 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,512m -a '[::1]:6086,PROXY'
    [/code]

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

    [/code]

    • 妙正灰
      博主
      DY
      5年前
      2018-10-27 22:23:24

      已经纠正,多谢提醒

本文评论已关闭
上一篇
下一篇