作者选择了 COVID-19 救援基金作为 Write for Donations计划的一部分接受捐款。
介绍
Varnish是一个多功能的反向HTTP代理,在内存中缓存后端服务器的响应,以便在再次请求时快速提供服务。它使用HTTP标头来确定是否缓存对特定请求的响应。
除了作为缓存服务器外,Varnish还可以用作:
- Web 应用程序防火墙
- DDoS 攻击防御
- 负载平衡器
- 快速修复不稳定的后端
- HTTP 路由器
可以存储 HTTP 缓存的三个位置:
- 浏览器: 此缓存存储在用户的浏览器上。 它是用户特定的,可以用来服务内容而不是向网站发送请求。
- Proxy: 代理服务器是位于用户和服务器之间的一种中间服务器。 它通常由ISP部署,可以用来缓存多个用户要求的响应。
- 反向代理: 这种类型的代理程序由网站管理员创建,可以用来从网络边缘提供内容,而不是向后端服务器发送请求。
<$>[注] 注: 有关 HTTP 缓存的更多信息,请参阅此 关于 HTTP 标题和缓存策略的教程。
在本教程中,您将将Varnish设置为缓存反向代理服务器,然后使用 wrk测试Varnish对非缓存配置的设置。
前提条件
要完成本教程,您将需要:
- 具有至少 2 GB RAM 的 1 个 Ubuntu 20.04 服务器
- 在本文中描述的 sudo 特权的非根用户 Ubuntu 20.04 初始服务器设置指南
步骤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服务器请求。