如何在Ubuntu20.04上使用Varnish缓存服务器加速静态网页
作者选择了 COVID-19 Relief Fund 作为 Write for DOnations 计划的一部分来接受捐赠。
介绍
Varnish 是一个多功能的反向 HTTP 代理,它将来自后端服务器的响应缓存在内存中,以便在再次请求时快速提供服务。 它使用 HTTP 标头来确定是否缓存对特定请求的响应。 默认情况下,它不会缓存带有 cookie 的响应,因为这些被认为是客户端特定的请求; 但是您可以在配置文件中更改此设置。
除了充当缓存服务器之外,Varnish 还可以用作:
- 网络应用防火墙
- DDoS攻击防御者
- 负载均衡器
- 快速修复不稳定的后端
- HTTP 路由器
可以保存 HTTP 缓存的三个位置:
- Browser: 这个缓存保存在用户的浏览器上。 它是特定于用户的,可用于提供内容而不是向网站发送请求。
- 代理: 代理是位于用户和服务器之间的中间服务器。 它通常由 ISP 部署,可用于缓存将由多个用户请求的响应。
- 反向代理: 这种代理由网站管理员创建,可用于从网络边缘提供内容,而不是向后端服务器发送请求。 这是您将在本教程中创建的缓存类型。
注意:有关HTTP缓存的更多信息,请参阅此关于HTTP标头和缓存策略的教程。
在本教程中,您将设置 Varnish 作为缓存反向代理服务器。 然后,您将使用 wrk 针对非缓存配置测试使用 Varnish 的设置。
先决条件
要完成本教程,您需要:
- 一台具有至少 2 GB RAM 的 Ubuntu 20.04 服务器
- 具有 sudo 权限的非 root 用户,如本 Ubuntu 20.04 初始服务器设置指南 中所述
第 1 步 — 安装 Varnish 和 Apache
首先,您将安装 Apache 和 Varnish。 首先更新 apt-get
,然后使用以下命令安装 Apache:
sudo apt-get update sudo apt-get install apache2 -y
您将看到指示正在安装 Apache 的输出。
Apache 安装过程完成后,使用以下命令安装 Varnish:
sudo apt-get install varnish -y
您将看到指示正在安装 Varnish 的输出。
接下来,确保两个软件包都安装正确。 首先,使用此命令检查 Apache 的状态:
sudo systemctl status apache2
输出将类似于以下内容:
Outputroot@ubuntu-s-1vcpu-2gb-fra1-01:~# sudo systemctl status apache2 ● apache2.service - The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2021-08-04 18:58:39 UTC; 4min 10s ago Docs: https://httpd.apache.org/docs/2.4/ Main PID: 2279 (apache2) Tasks: 55 (limit: 2344) Memory: 5.0M CGroup: /system.slice/apache2.service ├─2279 /usr/sbin/apache2 -k start ├─2281 /usr/sbin/apache2 -k start └─2282 /usr/sbin/apache2 -k start Aug 04 18:58:39 ubuntu-s-1vcpu-2gb-fra1-01 systemd[1]: Starting The Apache HTTP Server... Aug 04 18:58:39 ubuntu-s-1vcpu-2gb-fra1-01 apachectl[2278]: AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' di> Aug 04 18:58:39 ubuntu-s-1vcpu-2gb-fra1-01 systemd[1]: Started The Apache HTTP Server.
按Q
键退出status
命令。
接下来,使用以下命令检查 Varnish 的状态:
sudo systemctl status varnish
输出将类似于以下内容:
Outputroot@ubuntu-s-1vcpu-2gb-fra1-01:~# sudo systemctl status varnish ● varnish.service - Varnish HTTP accelerator Loaded: loaded (/lib/systemd/system/varnish.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2021-08-04 18:59:09 UTC; 4min 41s ago Docs: https://www.varnish-cache.org/docs/6.1/ man:varnishd Main PID: 3423 (varnishd) Tasks: 217 (limit: 2344) Memory: 10.7M CGroup: /system.slice/varnish.service ├─3423 /usr/sbin/varnishd -j unix,user=vcache -F -a :6081 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m └─3447 /usr/sbin/varnishd -j unix,user=vcache -F -a :6081 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m Aug 04 18:59:09 ubuntu-s-1vcpu-2gb-fra1-01 systemd[1]: Started Varnish HTTP accelerator. Aug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Debug: Version: varnish-6.2.1 revision 9f8588e4ab785244e06c3446fe09bf9db5dd8753 Aug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Version: varnish-6.2.1 revision 9f8588e4ab785244e06c3446fe09bf9db5dd8753 Aug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Debug: Platform: Linux,5.4.0-73-generic,x86_64,-junix,-smalloc,-sdefault,-hcritbit Aug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Platform: Linux,5.4.0-73-generic,x86_64,-junix,-smalloc,-sdefault,-hcritbit Aug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Debug: Child (3447) Started Aug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Child (3447) Started Aug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Info: Child (3447) said Child starts Aug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Child (3447) said Child starts
如果您没有看到这两个服务都启动并运行,请等待几分钟,直到它们完全加载,并保持它们都运行。
现在您已经安装了 Apache2 Varnish,您将为 Varnish 提供一些服务,在本例中为 Apache 的静态网页。
第 2 步 — 配置 Varnish 以服务于 Apache 的静态网页
在上一步中,您安装了 Varnish,接下来您需要对其进行配置。 默认情况下,Varnish 侦听端口 6081 并连接到端口 8080 上的本地 Web 服务器。 您将更改它以从 Apache 服务器为 Apache 静态站点提供服务。
首先,您将 Varnish 的侦听端口更改为 8080。 通常您希望监听端口为 80,但由于您在同一台服务器上运行 Apache 和 Varnish,您将使用端口 8080 用于 Varnish,而端口 80 用于 Apache。
没有配置选项可以更改 Varnish 的侦听端口,因此您将使用命令行来完成。 您将在 /etc/systemd/system/
中名为 varnish.service.d
的新目录中创建一个名为 customexec.conf
的文件,该目录将更改默认端口。
使用 mkdir
命令创建新目录:
sudo mkdir /etc/systemd/system/varnish.service.d
使用您喜欢的文本编辑器创建一个名为 customexec.conf
的新文件:
sudo nano /etc/systemd/system/varnish.service.d/customexec.conf
在customexec.conf
中,添加如下内容:
/etc/systemd/system/varnish.service.d/customexec.conf file[Service] ExecStart= ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :8080 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m
在此文件中,您将更改 Varnish 配置的 Service
部分。 首先删除 ExecStart
选项的旧值,然后为它分配一个新值。
新值使用以下选项指定用于运行 Varnish 的二进制文件:
-j
:指定要使用的监禁机制。 清漆监狱用于减少清漆进程在各种特定于平台的方法上的权限。 在这里,您使用unix
机制和用户vcache
来限制权限。 这是 Ubuntu 系统上清漆的默认设置。-F
:表示服务器应该在前台运行,因为systemd
期望主进程继续运行以便它可以跟踪它,而不是分叉一个新进程而死。-a
:此标志用于指定接受客户端连接的 IP 地址和端口。 本例中的 IP 为空,这意味着服务器将接受所有 IP。 端口设置为8080
。-T
:此标志指定管理接口的IP地址和端口,在本例中为localhost
和端口6082
。-f
:此标志指定 Varnish 配置的默认 VCL 文件。 您将在本教程后面编辑此文件以配置 Varnish 以连接到 Apache 服务器。-S
:此标志指定一个共享机密文件,用于授权访问管理界面。/etc/varnish/secret
值是 Ubuntu 上 Varnish 的默认值。 您将不会在本教程中使用机密文件。-s
:此标志指示存储对象的位置和方式。 值malloc,256m
是 Vanish 的默认值。 这意味着使用malloc
系统调用将各种 Varnish 对象存储在内存中,最大大小为 256 兆字节。 其他可能的值是default
,当malloc
不可用时使用umem
,或file
,将对象存储在磁盘上的文件中。
保存并关闭 customexec.conf
文件。 然后执行此命令从磁盘重新加载 systemd
服务文件:
sudo systemctl daemon-reload
然后重新启动 Varnish 以使更改生效。
sudo systemctl restart varnish
您不会看到最后两个命令的任何输出。 要确保 Varnish 现在正在侦听端口 8080,请使用 netstat
命令显示服务器上所有正在侦听的 TCP 套接字。
sudo netstat -ltnp | grep 8080
您将看到如下所示的输出:
Outputtcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 18689/varnishd tcp6 0 0 :::8080 :::* LISTEN 18689/varnishd
现在 Varnish 正在运行并监听 8080 端口,您需要编辑位于 /etc/varnish/default.vcl
的默认配置文件:
sudo nano /etc/varnish/default.vcl
导航到 backend default
块,然后将 .port
更改为 80
,如下所示:
default.vcl file # Default backend definition. Set this to point to your content server. backend default { .host = "127.0.0.1"; .port = "80"; }
保存并关闭 default.vcl
文件,然后使用以下命令重新启动 Varnish:
sudo systemctl restart varnish
如果一切正常,则不会有任何输出。 在浏览器中打开 http://your_server_ip:8080
,您将看到使用 Varnish 打开的 Apache 静态站点。
现在,Apache 和 Varnish 在同一个 Droplet 上一起运行,Apache 监听端口 80,Varnish 监听端口 8080。 接下来,您将使用 wrk 工具比较两台服务器的响应时间。
第三步——使用 wrk 测试 Varnish
wrk 是一个现代的 HTTP 基准测试工具。 它是用 C 语言编写的,可用于加载每秒许多请求的测试 Web 服务器。 在这一步中,您将使用 wrk 针对 Apache 和 Varnish 运行测试,然后比较结果。
首先,您需要通过从源代码构建 wrk 来安装它。 首先为 C 和 git 安装一些构建工具,这是从源代码构建 wrk 所必需的:
sudo apt-get install build-essential libssl-dev git unzip -y
然后将 wrk 的 git 存储库克隆到 wrk
目录中:
git clone https://github.com/wg/wrk.git wrk
切换到那个新目录:
cd wrk
使用 make
命令构建 wrk 可执行文件:
make
将 wrk 复制到 /usr/local/bin
目录,以便您可以从目录结构中的任何位置访问它:
sudo cp wrk /usr/local/bin
现在您已经安装了 wrk,使用它来测试 Apache 的响应能力,使用以下命令:
wrk -t2 -c1000 -d30s --latency http://server_ip/
此命令使用以下参数:
-t2
:这意味着运行两个线程。-c1000
:保持 1000 个 HTTP 连接打开。-d30s
:运行测试 30 秒。--latency
:打印延迟统计。
等待 30 秒,直到测试完成,您将看到类似以下的输出:
outputRunning 30s test @ http://68.183.115.151/ 2 threads and 1000 connections Thread Stats Avg Stdev Max +/- Stdev Latency 44.45ms 104.50ms 1.74s 91.20% Req/Sec 8.29k 1.07k 12.40k 71.00% Latency Distribution 50% 11.59ms 75% 22.73ms 90% 116.16ms 99% 494.90ms 494677 requests in 30.04s, 5.15GB read Socket errors: connect 0, read 8369, write 0, timeout 69 Requests/sec: 16465.85 Transfer/sec: 175.45MB
在本次测试中,平均延迟为 44.45 毫秒,总共有 494,677 个请求,8,369 个读取错误和 69 个超时错误。 确切的数字会因您的安装而异。
现在使用以下命令再次为 Varnish 服务器运行相同的测试:
wrk -t2 -c1000 -d30s --latency http://server_ip:8080/
等待 30 秒,直到测试完成,您将看到类似以下的输出:
outputRunning 30s test @ http://68.183.115.151:8080/ 2 threads and 1000 connections Thread Stats Avg Stdev Max +/- Stdev Latency 14.41ms 13.70ms 602.49ms 90.05% Req/Sec 6.67k 401.10 8.74k 83.33% Latency Distribution 50% 13.03ms 75% 17.69ms 90% 24.72ms 99% 58.22ms 398346 requests in 30.06s, 4.18GB read Socket errors: connect 0, read 19, write 0, timeout 0 Requests/sec: 13253.60 Transfer/sec: 142.48MB
您看到的输出可能会有所不同,但 Varnish 的延迟将低于 Apache。 在这种情况下,平均延迟为 14.41 毫秒,总共有 398,346 个请求,并且没有错误。
在这些测试中,使用 Apache 的平均响应时间为 44.45 毫秒,有 8,438 个错误,而 Varnish 将速度提高到 14.41 毫秒,并且也没有错误。 这是因为 Varnish 将响应缓存在内存中并为以后的请求提供服务,这与 Apache 不同,Apache 几乎每次请求资源时都需要从磁盘读取。
结论
在本教程中,您将 Varnish 配置为静态网站的反向代理缓存服务器。 您了解了如何使用基本 HTTP 缓存来提高性能,并使用 wrk 对 Apache 和 Varnish 服务器运行负载测试以比较结果。
您已经看到 Varnish 缓存服务器通过从主内存提供内容而不是在每次新请求到达时都从后端 Apache 服务器请求它来加速您的静态站点。 关于 Varnish 其他用途的更多信息,请参见【X58X】官方文档【X84X】。