如何在 Ubuntu 20.04 上使用 Varnish 缓存服务器加速静态网页

作者选择了 COVID-19 救援基金作为 Write for Donations计划的一部分接受捐款。

介绍

Varnish是一个多功能的反向HTTP代理,在内存中缓存后端服务器的响应,以便在再次请求时快速提供服务。它使用HTTP标头来确定是否缓存对特定请求的响应。

除了作为缓存服务器外,Varnish还可以用作:

  • Web 应用程序防火墙
  • DDoS 攻击防御
  • 负载平衡器
  • 快速修复不稳定的后端
  • HTTP 路由器

可以存储 HTTP 缓存的三个位置:

  • 浏览器: 此缓存存储在用户的浏览器上。 它是用户特定的,可以用来服务内容而不是向网站发送请求。
  • Proxy: 代理服务器是位于用户和服务器之间的一种中间服务器。 它通常由ISP部署,可以用来缓存多个用户要求的响应。
  • 反向代理: 这种类型的代理程序由网站管理员创建,可以用来从网络边缘提供内容,而不是向后端服务器发送请求。

<$>[注] 注: 有关 HTTP 缓存的更多信息,请参阅此 关于 HTTP 标题和缓存策略的教程

在本教程中,您将将Varnish设置为缓存反向代理服务器,然后使用 wrk测试Varnish对非缓存配置的设置。

前提条件

要完成本教程,您将需要:

步骤1:安装Varnish和Apache

首先更新「apt-get」,然後使用以下命令安裝 Apache:

1sudo apt-get update
2sudo apt-get install apache2 -y

您将看到输出表示正在安装Apache。

完成 Apache 安装过程后,请使用以下命令安装 Varnish:

1sudo apt-get install varnish -y

你会看到输出表示Varnish正在安装。

接下來,請確定兩個套件都安裝正確。 首先,使用此命令來檢查 Apache 的狀態:

1sudo systemctl status apache2

结果将看起来像这样:

 1[secondary_label Output]
 2root@ubuntu-s-1vcpu-2gb-fra1-01:~# sudo systemctl status apache2
 3 apache2.service - The Apache HTTP Server
 4     Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
 5     Active: active (running) since Wed 2021-08-04 18:58:39 UTC; 4min 10s ago
 6       Docs: https://httpd.apache.org/docs/2.4/
 7   Main PID: 2279 (apache2)
 8      Tasks: 55 (limit: 2344)
 9     Memory: 5.0M
10     CGroup: /system.slice/apache2.service
11             ├─2279 /usr/sbin/apache2 -k start
12             ├─2281 /usr/sbin/apache2 -k start
13             └─2282 /usr/sbin/apache2 -k start
14
15Aug 04 18:58:39 ubuntu-s-1vcpu-2gb-fra1-01 systemd[1]: Starting The Apache HTTP Server...
16Aug 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>
17Aug 04 18:58:39 ubuntu-s-1vcpu-2gb-fra1-01 systemd[1]: Started The Apache HTTP Server.

Q键退出状态命令。

接下来,用这个命令检查Varnish的状态:

1sudo systemctl status varnish

结果将看起来像这样:

 1[secondary_label Output]
 2root@ubuntu-s-1vcpu-2gb-fra1-01:~# sudo systemctl status varnish
 3 varnish.service - Varnish HTTP accelerator
 4     Loaded: loaded (/lib/systemd/system/varnish.service; enabled; vendor preset: enabled)
 5     Active: active (running) since Wed 2021-08-04 18:59:09 UTC; 4min 41s ago
 6       Docs: https://www.varnish-cache.org/docs/6.1/
 7             man:varnishd
 8   Main PID: 3423 (varnishd)
 9      Tasks: 217 (limit: 2344)
10     Memory: 10.7M
11     CGroup: /system.slice/varnish.service
12             ├─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
13             └─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
14
15Aug 04 18:59:09 ubuntu-s-1vcpu-2gb-fra1-01 systemd[1]: Started Varnish HTTP accelerator.
16Aug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Debug: Version: varnish-6.2.1 revision 9f8588e4ab785244e06c3446fe09bf9db5dd8753
17Aug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Version: varnish-6.2.1 revision 9f8588e4ab785244e06c3446fe09bf9db5dd8753
18Aug 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
19Aug 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
20Aug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Debug: Child (3447) Started
21Aug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Child (3447) Started
22Aug 04 18:59:10 ubuntu-s-1vcpu-2gb-fra1-01 varnishd[3423]: Info: Child (3447) said Child starts
23Aug 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上收听并连接到本地Web服务器在端口8080上。

首先,您将Varnish的倾听端口更改为8080。通常,您希望倾听端口为80,但由于您在同一服务器上运行Apache和Varnish,您将使用Varnish的端口8080和Apache的端口80。

您将创建一个名为 customexec.conf 的文件,在一个名为 varnish.service.d 的新目录中,在 /etc/systemd/system/` 中,将更改默认端口。

使用mkdir命令创建新目录:

1sudo mkdir /etc/systemd/system/varnish.service.d

使用您最喜欢的文本编辑器创建一个名为 customexec.conf 的新文件:

1sudo nano /etc/systemd/system/varnish.service.d/customexec.conf

在「customexec.conf」中,添加以下内容:

1[secondary_label /etc/systemd/system/varnish.service.d/customexec.conf file]
2[Service]
3ExecStart=
4ExecStart=/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 配置的服务部分,首先删除ExecStart选项的旧值,然后为其分配一个新值。

新的值指定了用于运行 Varnish 的二进制文件,使用以下选项:

  • 联合国 -j':指定使用监禁机制。 瓦尼什监狱被用来减少瓦尼什过程的许可量,而不是各种平台专用方法. 在此您使用 unix 机制和用户 vcache` 来限制权限 。 Ubuntu 系统中的漆色默认值 。
  • "-F":表示服务器应在前地运行,因为"系统化"期望主进程持续运行,以便能跟踪,而不是叉出新的进程而死. *-a': 此旗帜用于指定接受客户端连接的IP地址和端口. 此情况下的IP是空的,这意味着服务器会接受所有IP. 港口设为 " 8080 " 。 *-T': 此旗帜指定了管理界面的IP地址和端口,在此情况下是"localhost"和"6082". *`-f': 此旗帜指定 Varnish 配置的默认 VCL 文件 。 您将在此教程的稍后编辑此文件, 以配置 Varnish 连接到 Apache 服务器 。
  • `-S': 此旗帜指定一个共享的秘密文件,用于授权访问管理界面. " /etc/varnish/secret " 值是对Ubuntu上的Varnish的默认值。 您不会在此教程中使用密件 。
  • s': 此旗帜显示对象的位置和存储方式 。 malloc,256m'是消失的默认值。 它是指使用"malloc"系统调用和最大尺寸为256兆字节来将各种Varnish对象存储于内存. 其他可能的值有: " 默认 " ,在 " malloc " 不可用时使用 " umem " ,或 " file " ,将对象存储在磁盘上的文件中。 (英语)

保存并关闭 customexec.conf 文件,然后执行此命令,从磁盘上重新加载 systemd 服务文件:

1sudo systemctl daemon-reload

然后重新启动 Varnish 以便更改生效。

1sudo systemctl restart varnish

要确保Varnish现在在端口 8080上倾听,请使用netstat命令在服务器上显示所有倾听的TCP接口。

1sudo netstat -ltnp | grep 8080

你会看到这样的输出:

1[secondary_label Output]
2tcp 0 0 0.0.0.0:8080 0.0.0.0:*               LISTEN 18689/varnishd
3tcp6 0 0 :::8080                 :::*                    LISTEN 18689/varnishd

现在Varnish正在运行并聆听端口 8080,您需要编辑位于 /etc/varnish/default.vcl 的默认配置文件:

1sudo nano /etc/varnish/default.vcl

导航到后端默认块,然后将.port更改为80,如下所示:

1[secondary_label default.vcl file]
2
3# Default backend definition. Set this to point to your content server.
4backend default {
5    .host = "127.0.0.1";
6    .port = "80";
7}

保存并关闭 default.vcl 文件,然后使用此命令重新启动 Varnish:

1sudo systemctl restart varnish

如果一切顺利,就不会有任何输出。在你的浏览器中打开http://your_server_ip:8080,你会看到使用Varnish打开的Apache静态网站。

你现在有Apache和Varnish在同一个Droplet上一起运行,Apache听到端口80和Varnish到端口8080.接下来,你将使用Wrk工具比较两个服务器的响应时间。

步骤 3 – 使用Wrk测试Varnish

wrk是一个现代的HTTP基准测试工具. 它是用C写的,可以用来加载每秒多个请求的测试网页服务器。

首先,您需要通过从源头构建Wrk来安装Wrk,开始安装一些C和Git构建工具,这些工具是从源头构建Wrk所需的:

1sudo apt-get install build-essential libssl-dev git unzip -y

然后将 wrk 的 git 存储库克隆到 wrk 目录中:

1git clone https://github.com/wg/wrk.git wrk

更改到新目录:

1cd wrk

Make命令构建可执行的 wrk:

1make

将 wrk 复制到 /usr/local/bin 目录,以便您可以在目录结构中的任何地方访问它:

1sudo cp wrk /usr/local/bin

现在你已经安装了 wrk,使用它来测试Apache的响应能力,使用这个命令:

1wrk -t2 -c1000 -d30s --latency http://server_ip/

此命令使用以下参数:

●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

等待 30 秒,直到测试完成,你会看到类似于此的输出:

 1[secondary_label output]
 2Running 30s test @ http://68.183.115.151/
 3  2 threads and 1000 connections
 4  Thread Stats Avg Stdev Max   +/- Stdev
 5    Latency 44.45ms 104.50ms 1.74s 91.20%
 6    Req/Sec 8.29k 1.07k 12.40k 71.00%
 7  Latency Distribution
 8     50%   11.59ms
 9     75%   22.73ms
10     90%  116.16ms
11     99%  494.90ms
12  494677 requests in 30.04s, 5.15GB read
13  Socket errors: connect 0, read 8369, write 0, timeout 69
14Requests/sec:  16465.85
15Transfer/sec:    175.45MB

在这个测试中,平均延迟为 44.45ms,共有 494.677 个总请求, 8,369 个读错误和 69 个时空错误。

现在,使用此命令再次对 Varnish 服务器执行相同的测试:

1wrk -t2 -c1000 -d30s --latency http://server_ip:8080/

等待 30 秒,直到测试完成,你会看到类似于此的输出:

 1[secondary_label output]
 2Running 30s test @ http://68.183.115.151:8080/
 3  2 threads and 1000 connections
 4  Thread Stats Avg Stdev Max   +/- Stdev
 5    Latency 14.41ms 13.70ms 602.49ms 90.05%
 6    Req/Sec 6.67k 401.10 8.74k 83.33%
 7  Latency Distribution
 8     50%   13.03ms
 9     75%   17.69ms
10     90%   24.72ms
11     99%   58.22ms
12  398346 requests in 30.06s, 4.18GB read
13  Socket errors: connect 0, read 19, write 0, timeout 0
14Requests/sec:  13253.60
15Transfer/sec:    142.48MB

您看到的输出可能会有所不同,但Varnish的延迟时间会比Apache更低,在这种情况下,平均延迟时间为14.41ms,共有398,346个请求,没有错误。

在这些测试中,在Apache中,平均响应时间为4445ms,有8438个错误,而Varnish实现了速度增加到1441ms,并且也没有错误,这是因为Varnish在内存中缓存了响应,并为后续请求提供服务,与Apache不同,它需要从磁盘读取几乎每当资源被请求时。

结论

在本教程中,您将Varnish配置为静态网站的反向代理缓存服务器,您看到如何使用基本的HTTP缓存来提高性能,并使用Wrk运行Apache和Varnish服务器的负载测试来比较结果。

您已经看到Varnish缓存服务器通过从主内存提供内容来加速您的静态网站,而不是每次收到新请求时向后端Apache服务器请求。

Published At
Categories with 技术
Tagged with
comments powered by Disqus