首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Varnish Cache入门

Varnish Cache入门

作者头像
大脸猫爱吃鱼
发布2018-08-31 15:10:14
1.4K0
发布2018-08-31 15:10:14
举报

  您的服务器是否需要处理大量流量?缓存是最大化Linode输出的最佳方法之一。但究竟什么是缓存呢?

  缓存的想法是,您的服务器不应该每次访问时都重新生成相同的动态内容。通过在Web服务前放置Varnish等缓存代理来加速对HTTP请求的响应并减少服务器工作负载,从而节省您的Linode资源。

  Varnish的工作原理是在请求进入后端之前处理请求,无论您的后端是Apache,nginx还是任何其他Web服务器。如果有一个未缓存的请求,Varnish会将该请求转发到您的后端,然后缓存其输出。然后,您可以将这些缓存的请求存储在内存中,这样会比从磁盘中检索并将它们传送给客户端更快。

  此外,Varnish缓存可用作高可用性环境的一部分,可确保高流量负载或服务器故障期间的正常运行。

  如果您的Web服务器是nginx并且您打算使用Varnish缓存来提供WordPress,请访问Linode的使用指南:在Debian 8上通过SSL和HTTP使用Varnish&nginx提供WordPress服务

准备工作

  1. 熟悉我们的入门指南并完成设置Linode主机名和时区的步骤。
  2. 完成 保护您的服务器指南的各个部分,创建标准用户帐户,加强SSH访问并删除不必要的网络服务。
  3. 安装和配置一个Web服务器如Apache或nginx等。
  4. 更新您的系统:
sudo apt update && sudo apt upgrade

注意本指南是为非root用户编写的。需要提升权限的命令带有前缀sudo。如果您不熟悉该sudo命令,请参阅 用户和组指南。

安装和配置Varnish缓存

  1. 使用包管理器安装Varnish:

sudo apt install varnish

  2. 要避免将来的更新覆盖您的配置,请为默认值创建一个副本:

cd /etc/varnish sudo cp default.vcl user.vcl

  3. 在更改配置时停止Varnish服务:

sudo systemctl stop varnish

使用Systemd配置Varnish后端

  通过Varnish配置语言(VCL)配置Varnish。一旦系统加载配置文件,Varnish就会将VCL代码转换并编译成与Varnish进程一起运行的C程序。

  Debian(8及更新版本)和Ubuntu(15.04及更新版本)的最新版本需要通过systemd进行Varnish配置。

  1. 打开varnish.service文件,在ExecStart行设置端口,配置文件和内存分配。在以下示例中,这些值是:-a :80/etc/varnish/user.vclmalloc,1G

文件

/lib/systemd/system/varnish.serviceundefined

1

ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :80 -T localhost:6082 -f /etc/varnish/user.vcl -S /etc/varnish/secret -s malloc,1G

  2. 上面的配置分配了最多1GB的内存来存储其缓存项。如果您需要调整此分配大小,请编辑-s malloc,1G中的数字。例如,要分配2GB的内存:

-s malloc,2G

  3. 重新加载系统:

sudo systemctl daemon-reload

修改自定义Varnish配置VCL

  现在您已经将Varnish启动脚本指向了user.vcl,您需要配置该文件以提供Varnish从Web服务器获取的内容。编辑/etc/varnish/user.vclbackend default {部分,告诉Varnish在哪里获取服务器(后端)内容。以下示例使用端口 8080,Web服务器设置如下:

文件

/etc/varnish/user.vcl

1 2 3 4

backend default { .host = "127.0.0.1"; .port = "8080"; }

配置缓存生存时间(TTL)

  默认情况下,Varnish会将请求缓存两分钟。要调整此时间,请打开VCL文件重写vcl_backend_response子程序,并更新后端声明:

文件

/etc/varnish/user.vcl

1 2 3

sub vcl_backend_response { set beresp.ttl = 5m; }

  从后端获取请求后将调用此子程序。在这个例子中,我们将对象上的TTL变量设置为五分钟(5m)。其值可以是秒(120s),分钟(2m)或小时(2h)。您理想的TTL可能会有所不同,具体取决于您网站内容的更新频率以及您需要处理的流量。

以Varnish Live为例:配置Web流量以提供内容缓存服务

  现在您已经配置了Varnish,本节通过交换Web服务器提供的和Varnish侦听的端口使其成为您的Web服务器。如下图所示,所有网络流量将由Varnish缓存提供,并每两分钟或按上面配置的间隔刷新一次:

  要允许Varnish与您的Web服务器通信,您需要修改站点的虚拟主机文件中的一些设置。

  1. 如果您使用的是nginx,请跳过此步骤。如果您正在使用Apache,请更改Apache侦听的端口。编辑/etc/apache2/ports.conf和任何虚拟主机。打开ports.conf,修改Listen 80中的80到另一个端口。此例中使用8080端口:

Listen 8080

  2. 修改虚拟主机文件或服务器信息以侦听端口8080:Apache:

文件

/etc/apache2/sites-available/example.com.conf

1

<VirtualHost *:8080>

Nginx

文件

/etc/nginx/sites-available/example.com

1 2

listen 8080; listen :::8080;

  3. 检查您的/etc/varnish/user.vcl文件并确保将backend default设置为使用端口8080:

backend default {
     .host = "127.0.0.1";
     .port = "8080";
}

  4. 重新加载Web服务器的配置:

sudo systemctl reload apache2
sudo systemctl restart nginx

  5. 启动Varnish:

sudo systemctl start varnish

  一旦启动,Varnish将为站点访问者提供服务,并且根据您的配置,尽可能从缓存中获取内容。

高级Varnish配置

  VCL允许扩展控制请求缓存的方式,您需要进行一些修改。本节将介绍几种常见的VCL配置。

  这些修改在您的user.vcl文件中进行。

从Varnish Cache中排除内容

  您可能希望从Varnish缓存中排除网站的特定部分,尤其是非公开或管理部分。要做到这一点,你需要访问Varnish的请求对象获取请求的信息,并有条件地告诉Varnish向后端传递请求而不缓存它。

  您需要覆盖VCL文件中的vcl_recv子程序,该子程序在每次Varnish收到请求时运行,添加如下条件:

文件

/etc/varnish/user.vcl

1 2 3 4 5 6 7 8

sub vcl_recv { if (req.http.host == "example.com" && req.url ~ "^/admin") { return (pass); } }

  此示例检查您不想缓存的两个条件。第一个是任何对于example.com的请求,第二个是以/admin开头的任何URI请求。如果这两个条件都是真的,Varnish将不会缓存请求。

取消Cookie

  如前所述,如果Varnish检测到您的网站正在设置Cookie,则会假定您的网站需要与这些Cookie进行交互并相应地显示动态内容,因此,Varnish不会缓存这些网页。您可以通过在Varnish的 req.http对象上取消Cookie设置来覆盖此行为。

  在vcl_recv部分的底部添加行:

文件

/etc/varnish/user.vcl

1

unset req.http.Cookie;

  您可能会发现特定cookie对于显示内容或者确定您的用户是否已登录很重要。在这种情况下,您可能不希望显示缓存内容,而只是想将用户直接发送到后端。

  对于这种情况,您将检查req.http.Cookie中名为“logged_in”的cookie,如果找到,则该请求将被传递到后端而不进行缓存。到目前为止,这是我们完整的vcl_recv子程序:

文件

/etc/varnish/user.vcl

1 2 3 4 5 6 7 8 9 10 11

sub vcl_recv { if ((req.http.host ~ "example.com" && req.url ~ "^/admin") || req.http.Cookie == "logged_in") { return (pass); } unset req.http.Cookie; }

缓存POST,还是不缓存POST?

  您可能不希望缓存POST(https://en.wikipedia.org/wiki/POST_(HTTP%29)请求,因为它们可能需要与后端交互以收集动态数据或设置用户会话。在上面的示例中,您选择如果用户已登录,则不缓存请求。本节确保用户可以在开始登录时即不缓存。一种简单的方法是一起跳过POST请求。

  要完成此操作,请将以下条件添加到vcl_recv中现有的return (pass)块中:

文件

/etc/varnish/user.vcl

1 2 3 4 5 6 7

if ((req.http.host == "example.com" && req.url ~ "^/admin") || req.http.Cookie == "logged_in" || req.method == "POST") { return (pass); }

使用Varnish Cache实现具有后端轮询的高可用性

  Varnish可以使用称为后端轮询的内置工具来检查后端服务器,并在后端无法访问时继续提供缓存内容。如果Varnish检测到停机,它将在您在user.vcl中配置的宽限时间内继续为您提供缓存内容。

  要设置轮询,请在/etc/varnish/user.vcl中将probe节添加到后端声明中:

文件

/etc/varnish/user.vcl

1 2 3 4 5 6 7 8 9 10 11

backend default { .host = '127.0.0.1'; .port = '8080'; .probe = { .url = "/"; .timeout = 40ms; .interval = 1s; .window = 10; .threshold = 8; } }

  这些只是基本设置,您可以根据您的网站调整它们。此示例指示Varnish 每秒轮询或测试与http://127.0.0.1:8080/的连接,如果在最近10次轮询中至少8次响应时间不到40ms,则认为后端是健康的。

  如果后端未通过测试,则认为它是不健康的,并且根据其宽限时间设置从缓存中获取对象。要设置宽限时间,请在vcl_backend_response以下行中包含以下内容:

文件

/etc/varnish/user.vcl

1

set beresp.grace = 1h;

   “1h”允许后端停机一小时而不会对网站用户造成任何影响。如果您正在提供静态内容,则宽限时间可以更长,以确保正常运行。

从另一个Linode提供Varnish缓存服务(可选)

  为了增加可用性,请考虑从单独的Linode提供Varnish缓存。在这种情况下,Varnish安装步骤应在与Web服务器相同的数据中心中独立的Linode上执行。安装后,将Varnish后端.host值配置为指向Web服务器Linode的专用IP地址。请注意,您的站点的DNS记录应指向Varnish Linode,因为这是客户端连接的位置。

  是的!如果一切顺利,您网站的访问者现在可以从内存中获取Varnish缓存的内容,从而显着提高您网站的速度。

使用varnishlog测试Varnish

  现在所有流量都配置为到达Varnish缓存,启动varnishlog查看Varnish活动。请注意,这是一个实时的持续日志,除非发生活动,否则不会显示任何信息。启动Varnishlog后,使用浏览器查看应缓存的页面并查看活动日志:

sudo varnishlog

  完成后用CTRL + C停止varnishlog

防火墙规则

  使用防火墙时,Varnish需要稍微修改您在设置Web服务器时可能使用的规则。

  如果Varnish运行在与Web服务器相同的Linode上,请确保允许端口80上的传入连接。此外,您还需要允许端口8080上来自localhost的连接,因为这是Varnish与Web服务器通信的方式。

  如果Varnish和您的Web服务器在独立的Linode上运行,您将需要接受Varnish Linode上端口80以及Web服务器上端口8080的传入流量,。

  这两个只是最小的规则修改。强烈建议您根据运行的其他服务对每个服务使用单独的防火墙规则。如果您不确定如何设置防火墙,请查看我们的iptablesUFW指南。

更多信息

  有关此主题的其他信息,您可能需要参考以下资源。虽然提供这些是希望它们有用,但请注意,我们无法保证外部托管材料的准确性或及时性。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 准备工作
  • 安装和配置Varnish缓存
    • 使用Systemd配置Varnish后端
      • 修改自定义Varnish配置VCL
        • 配置缓存生存时间(TTL)
        • 以Varnish Live为例:配置Web流量以提供内容缓存服务
        • 高级Varnish配置
          • 从Varnish Cache中排除内容
            • 取消Cookie
              • 缓存POST,还是不缓存POST?
                • 使用Varnish Cache实现具有后端轮询的高可用性
                  • 从另一个Linode提供Varnish缓存服务(可选)
              • 使用varnishlog测试Varnish
              • 防火墙规则
              • 更多信息
              相关产品与服务
              轻量应用服务器
              轻量应用服务器(TencentCloud Lighthouse)是新一代开箱即用、面向轻量应用场景的云服务器产品,助力中小企业和开发者便捷高效的在云端构建网站、Web应用、小程序/小游戏、游戏服、电商应用、云盘/图床和开发测试环境,相比普通云服务器更加简单易用且更贴近应用,以套餐形式整体售卖云资源并提供高带宽流量包,将热门开源软件打包实现一键构建应用,提供极简上云体验。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档