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

314 阅读11分钟

作者选择了COVID-19救济基金,作为Write for DOnations计划的一部分接受捐赠。

简介

Varnish是一个多功能的反向HTTP代理,它将后端服务器的响应缓存在内存中,以便在再次请求时快速提供。它使用HTTP头来决定是否缓存特定请求的响应。默认情况下,它不缓存带有cookie的响应,因为这些被认为是客户特定的请求;但是你可以在配置文件中改变这一设置。

除了作为一个缓存服务器,Varnish还可以作为一个。

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

有三个地方可以保存HTTP缓存。

  • **浏览器。**这个缓存保存在用户的浏览器上。它是针对用户的,可以用来提供内容,而不是向网站发送请求。
  • **代理。**代理是一个位于用户和服务器之间的中间服务器。它通常由ISP部署,可用于缓存将由多个用户请求的响应。
  • **反向代理。**这种代理是由网站的管理员创建的,可以用来从网络的边缘提供内容,而不是将请求发送到后端服务器。这就是你在本教程中要创建的那种缓存。

**注意:**关于HTTP缓存的更多信息,请参阅本教程中的HTTP头和缓存策略

在本教程中,你将把Varnish设置为一个缓冲的反向代理服务器。然后,你将用Varnish与非缓存配置的wrk来测试设置。

前提条件

要完成本教程,你将需要。

第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,你将为Varnish使用8080端口,为Apache使用80端口。

没有配置选项可以改变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 :指定要使用的监狱机制。Varnish的监狱是用来减少varnish进程在各种平台上的权限的。这里你要使用unix 机制和用户vcache 来限制权限。这是Ubuntu系统上varnish的默认做法。

  • -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工具比较两个服务器的响应时间。

第3步 - 使用wrk测试Varnish

wrk是一个现代HTTP基准测试工具。它是用C语言编写的,可以用来对每秒有许多请求的网络服务器进行负载测试。在这一步,你将使用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.45ms,总共有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.41ms,总共有398,346个请求,没有错误。

在这些测试中,用Apache的平均响应时间是44.45ms,有8438个错误,而Varnish实现的速度提高到14.41ms,而且也没有错误。这是因为Varnish将响应缓存在内存中,为以后的请求提供服务,而不像Apache那样,几乎每次请求资源时都需要从磁盘上读取。

总结

在本教程中,你将Varnish配置为一个静态网站的反向代理缓存服务器。你看到了如何使用基本的HTTP缓存来提高性能,你还使用wrk对Apache和Varnish服务器进行了负载测试,以比较其结果。

你已经看到,Varnish缓存服务器通过从主内存中提供内容,而不是在每次有新请求到来时从后端Apache服务器中请求内容,从而加快了静态网站的速度。关于Varnish的其他用途的更多信息,请参见官方文档