如何在 CentOS-RHEL 8 上使用 Hitch 为 Varnish 缓存启用 HTTPS
Varnish Cache 缺乏对 SSL/TLS 以及与端口 443 关联的其他协议的本机支持。如果您使用 Varnish Cache 来提高 Web 应用程序的性能,则需要安装和配置另一款名为 SSL/TLS 终止代理的软件,以便与 >Varnish 缓存以启用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,支持ALPN( >应用层协议协商)和HTTP/2的NPN(下一个协议协商),这是一种向客户端发出信号的代理协议到后端的 IP/端口、到源的 UNIX 域套接字连接、SNI(服务器名称指示),带或不带通配符证书。此外,它非常适合需要多达 15,000 侦听套接字和 500,000 证书的大型安装。
作为我们之前两篇关于为 Nginx 和 Apache HTTP 服务器安装 Varnish Cache 的文章的延续,本指南展示了如何启用 HTTPS< 用于在 CentOS/RHEL 8 上使用 Hitch TLS 代理 的 Varnish 缓存。
本指南假设您已经为 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. Hitch 软件包在EPEL(Extra Packages for Enterprise Linux)存储库中提供。要安装它,首先在您的系统上启用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将只接受内部连接(来自在同一服务器上运行的进程,即本例中的挂接),而不接受外部连接。
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/tecmint.lan
cd /etc/ssl/tecmint.lan/
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tecmint.lan.key -out tecmint.lan.crt
然后创建证书和密钥的捆绑包,如下所示。
cat tecmint.crt tecmint.key >tecmint.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 步:配置并启动挂钩
5. 接下来,将 Varnish 配置为 Hitch 的后端,并指定要用于的 SSL/TLS 证书文件HTTPS,在Hitch主配置文件中,打开它进行编辑。
vi /etc/hitch/hitch.conf
前端部分定义了 Hitch 将侦听的 IP 地址和端口。默认配置是侦听服务器上连接的所有 IPv4 和 IPv6 接口,并在端口 443 上运行并处理传入的 HTTPS< 请求,将它们交给 Varnish。
将默认后端代理端口从6086更改为8443(用于将请求转发到Varnish的端口) Hitch 配置文件,使用 backend 参数。另外,使用 pem-file 参数指定证书文件,如下所示。
backend = "[127.0.0.1]:8443"
#pem-dir = "/etc/pki/tls/private"
pem-file = "/etc/ssl/tecmint.lan/tecmint.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 设置了。打开网络浏览器并使用您的域或服务器的 IP 通过 HTTPS 进行导航。
https://www.example.com
OR
https://SERVER_IP/
加载 Web 应用程序的索引页后,检查 HTTP 标头以确认内容是通过 Varnish Cache 提供的。
为此,请右键单击加载的网页,从选项列表中选择检查以打开开发人员工具。然后单击网络选项卡,重新加载页面,然后选择一个请求以查看 HTTP 标头,如以下屏幕截图中突出显示的那样。
步骤 6:在 Varnish 缓存中将 HTTP 重定向到 HTTPS
9. 要仅在 HTTPS 上运行您的网站,您需要将所有 HTTP 流量重定向到 HTTPS。您可以通过在 Hitch 配置文件中添加以下配置来完成此操作。
vi /etc/hitch/hitch.conf
首先,在vlc 4.0;下面添加行import std;,然后查找vlc_recv子例程,这是立即执行的第一个VCL子例程Varnish Cache 将客户端请求解析为其基本数据结构后。我们可以在这里修改请求标头并执行合成器来重定向客户端请求。
将其修改为如下所示。
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 Location 标头 (set req.http.location) 设置为安全请求 (“https://” + req.http.host< + req.url) 只是要求网络浏览器加载 HTTPS 版本的网页(即 URL 重定向)。
Location 标头将发送到 vcl_synth 子例程(使用 return(synth(301)) 调用),HTTP 状态代码为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 文档。