如何在 CentOS-RHEL 8 上使用 Hitch 为 Varnish Cache 启用 HTTPS
Varnish Cache缺乏对SSL/TLS和与端口443相关的其他协议的本机支持。如果您使用Varnish Cache来提升 Web 应用程序的性能,则需要安装和配置另一个称为SSL/TLS终止代理的软件,与Varnish Cache配合使用以启用HTTPS。
Hitch是一款免费的开源、基于 libev 且可扩展的 SSL/TLS 代理,专为Varnish Cache设计,目前可在 Linux、OpenBSD、FreeBSD 和 MacOSX 上运行。它通过监听端口443 ( HTTPS连接的默认端口)来终止 TLS/SSL 连接,并将未加密的流量转发到Varnish Cache,但它也应该可以与其他后端配合使用。
它支持TLS1.2和TLS1.3以及旧版TLS 1.0/1.1,支持HTTP/2的 ALPN(应用层协议协商)和NPN(下一代协议协商)、用于向后端发送客户端 IP/端口信号的 PROXY 协议、到源的 UNIX 域套接字连接、SNI(服务器名称指示),带或不带通配符证书。此外,它还非常适合需要多达15,000 个侦听套接字和500,000 个证书的大型安装。
作为我们之前两篇关于为Nginx和Apache HTTP 服务器安装Varnish Cache的文章的延续,本指南介绍如何在CentOS/RHEL 8上使用Hitch TLS Proxy为Varnish Cache启用HTTPS。
本指南假设您已经为Nginx或Apache Web 服务器安装了Varnish ,否则,请参阅:
- 如何在 CentOS/RHEL 8 上为 Nginx Web 服务器安装 Varnish Cache 6
- 如何在 CentOS/RHEL 8 上为 Apache Web 服务器安装 Varnish Cache 6
步骤 1:在 CentOS/RHEL 8 上安装 Hitch
1. EPEL(企业版 Linux 的额外软件包)存储库中提供了Hitch软件包。要安装它,首先在系统上启用EPEL,然后安装该软件包。如果您尚未安装OpenSSL软件包,请也安装它。
# dnf install epel-release # dnf install hitch openssl
2.软件包安装完成后,您必须配置Varnish Cache以使Hitch正常工作。您还需要配置Hitch以使用您的SSL/TLS证书和Varnish作为后端。Hitch 的主要配置文件位于/etc/hitch/hitch.conf,如下所述。
第 2 步:为 Hitch 配置 Varnish 缓存
3.接下来,启用Varnish使用PROXY协议支持监听附加端口(在我们这个例子中是8443 ) ,以便与Hitch进行通信。
因此打开 Varnish systemd服务文件进行编辑。
# systemctl edit --full varnish
查找ExecStart这一行并添加一个-a
值为127.0.0.1:8443,proxy的附加标志。使用值127.0.0.1:8443意味着 Varnish 将只接受内部连接(来自在同一台服务器上运行的进程,即本例中的 hitch),而不接受外部连接。
ExecStart=/usr/sbin/varnishd -a :80 -a 127.0.0.1:8443,proxy -f /etc/varnish/default.vcl -s malloc,256m
保存文件,然后重新启动 Varnish 服务以应用最新更改。
# systemctl restart varnish
步骤 3:获取 SSL/TLS 证书
4.在本节中,我们将解释如何创建在Hitch下使用的SSL/TLS证书包。在本指南中,我们将解释如何使用自签名证书、商业证书或Let's Encrypt证书的不同选项。
要创建自签名证书(您应该只在本地测试环境中使用),您可以使用OpenSSL工具。
# mkdir /etc/ssl/example.lan # cd /etc/ssl/example.lan/ # openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout example.lan.key -out example.lan.crt
然后按如下方式创建证书和密钥的捆绑包。
# cat example.crt example.key >example.pem
注意:对于生产用途,您可以从商业证书颁发机构( CA )购买证书,也可以从Let's Encrypt获取免费、自动化且完全认可的证书。然后创建一个 PEM 包。
如果您从商业CA购买了证书,则需要合并私钥、证书和 CA 包,如下所示。
# cat example.com.key example.com.crt example.com-ca-bundle.crt > /etc/ssl/example.com.pem
对于Let's Encrypt,证书、私钥和完整链将存储在/etc/letsencrypt/live/example.com/下,因此请按所示创建捆绑包。
# cat /etc/letsencrypt/live/example.com/fullchain.pem /etc/letsencrypt/live/example.com/privkey.pem >/etc/letsencrypt/live/example.com/example.com_bundle.pem
步骤 4:配置并启动 Hitch
5.接下来,将Varnish配置为Hitch的后端,并指定用于HTTPS的SSL/TLS证书文件,在Hitch主配置文件中打开它进行编辑。
# vi /etc/hitch/hitch.conf
前端部分定义了Hitch 将监听的IP 地址和端口。默认配置是监听服务器上连接的所有IPv4和IPv6接口,并在端口443上运行并处理传入的HTTPS请求,然后将其交给Varnish。
使用backend参数在Hitch配置文件中将默认后端代理端口从6086更改为8443 (用于将请求转发到Varnish 的端口) 。另外,使用pem-file参数指定证书文件,如图所示。
backend = "[127.0.0.1]:8443" #pem-dir = "/etc/pki/tls/private" pem-file = "/etc/ssl/example.lan/example.pem"
保存文件并关闭。
6.现在启动hitch服务并使其在系统启动时自动启动。请注意,--now
当与 enable 一起使用时,该开关也会启动 systemd 服务,然后检查状态以查看它是否已启动并正在运行,如下所示。
# systemctl enable --now hitch # systemctl status hitch
7.在继续测试您的网站/应用程序是否在HTTPS上运行之前,您需要在防火墙中允许HTTPS服务端口 443,以允许发往服务器上该端口的请求通过防火墙。
# firewall-cmd --zone=public --permanent --add-service=https # firewall-cmd --reload
步骤5:使用Varnish Cache-Hitch设置测试SSL / TLS终止
8.现在是时候测试Varnish Cache-Hitch设置了。打开 Web 浏览器并使用您的域或服务器的 IP 通过HTTPS进行导航。
https://www.example.com OR https://SERVER_IP/
一旦您的 Web 应用程序的索引页加载完毕,请检查HTTP标头以确认内容正在通过Varnish Cache提供。
为此,请右键单击已加载的网页,从选项列表中选择“检查”以打开开发人员工具。然后单击“网络”选项卡,重新加载页面,然后选择一个请求以查看 HTTP 标头,如以下屏幕截图中突出显示的那样。
步骤6:在Varnish Cache中将HTTP重定向到HTTPS
9.要仅在HTTPS上运行您的网站,您需要将所有HTTP流量重定向到HTTPS。 您可以通过在 Hitch 配置文件中添加以下配置来执行此操作。
# vi /etc/hitch/hitch.conf
首先,在vlc 4.0;下方添加import std ;行,然后查找vlc_recv子例程,这是Varnish Cache将客户端请求解析为其基本数据结构后立即执行的第一个 VCL 子例程。我们可以在这里修改请求标头并执行 synth 来重定向客户端请求。
将其修改成如下所示。
sub vcl_recv { if (std.port(server.ip) != 443) { set req.http.location = "https://" + req.http.host + req.url; return(synth(301)); } }
请注意,PROXY协议使Varnish能够从server.ip变量中看到Hitch 的监听端口443。因此, std.port(server.ip)这一行返回接收客户端连接的端口号。
如果端口不是HTTPS的443(通过(std.port(server.ip) != 443)检查),子例程将设置请求 HTTP 位置标头(设置 req.http.location)为安全请求(“ https:// ”+ req.http.host + req.url)只是要求 Web 浏览器加载网页的HTTPS版本(即 URL 重定向)。
Location标头将以HTTP状态代码301(永久移动)发送到vcl_synth子例程(使用return(synth(301))调用) 。
10.接下来,添加以下vcl_synth 子例程(它的众多用例之一是重定向用户),以处理上面的合成器。
sub vcl_synth { if (resp.status == 301) { set resp.http.location = req.http.location; set resp.status = 301; return (deliver); } }
它检查响应状态是否为301,则将响应中的 HTTP Location 标头设置为请求中的 HTTP Location 标头,这实际上是重定向到 HTTPS 并执行传递操作。
传递操作使用来自后端的响应构建响应,将响应存储在缓存中,然后将其发送给客户端。
保存文件并关闭。
11.再次通过重新启动服务来应用 Varnish 配置中的新更改。然后使用curl 命令行工具确认从HTTP重定向到HTTPS。
# systemctl restart varnish # curl -I http://eaxmple.com/
从浏览器来看,响应也与下面的屏幕截图所示的相同。
我们希望到目前为止一切都运行良好。如果没有,请通过下面的反馈表发表评论或提出问题。对于任何高级配置选项,请参阅Varnish Cache 文档和Hitch 文档。