网站搜索

如何在 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 上运行。它通过侦听端口 443HTTPS 连接的默认端口)来终止 TLS/SSL 连接,并将未加密的流量转发到 Varnish Cache,但是,它也应该与其他后端一起工作。

它支持TLS1.2TLS1.3以及旧版TLS 1.0/1.1,支持ALPN >应用层协议协商)和HTTP/2NPN下一个协议协商),这是一种向客户端发出信号的代理协议到后端的 IP/端口、到源的 UNIX 域套接字连接、SNI服务器名称指示),带或不带通配符证书。此外,它非常适合需要多达 15,000 侦听套接字和 500,000 证书的大型安装。

作为我们之前两篇关于为 NginxApache HTTP 服务器安装 Varnish Cache 的文章的延续,本指南展示了如何启用 HTTPS< 用于在 CentOS/RHEL 8 上使用 Hitch TLS 代理Varnish 缓存

本指南假设您已经为 NginxApache 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 软件包在EPELExtra 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 地址和端口。默认配置是侦听服务器上连接的所有 IPv4IPv6 接口,并在端口 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命令行工具确认从HTTPHTTPS的重定向。

systemctl restart varnish
curl -I http://eaxmple.com/

从浏览器来看,响应也与下面的屏幕截图所示相同。

我们希望到目前为止一切都进展顺利。如果没有,请通过下面的反馈表发表评论或提出问题。对于任何高级配置选项,请参阅 Varnish Cache 文档和 Hitch 文档。