目录:
在网站性能方面,Varnish是一项热门技术。 通过简单的安装和配置,可以提高任何网站的性能,仅使用小型虚拟专用服务器即可提供多达一百万个页面的服务。 ,我将向您展示四种可能的配置,无论您投放数百,数千还是数百万个页面,它们都将帮助您改善网站的响应时间。
清漆简介
Varnish-Cache是一种Web加速器,旨在缓存网站内容。 这是一个开源项目,旨在优化和加速非侵入式访问网站-无需更改代码-并允许您动手进入自己的网站。
是Varnish Cache的创建者将其称为Web加速器,因为其主要目的是改善和加快网站的前端。 Varnish通过将Web服务器提供的页面副本存储在其缓存中来实现此目的。 下次请求同一页面时,Varnish将提供副本,而不是从Web服务器请求页面,从而极大地提高了性能。
除了其性能之外,Varnish Cache的另一个关键功能是其配置语言VCL的灵活性。 通过VCL,可以编写有关应如何处理传入请求的策略。 在这样的策略中,您可以决定要提供的内容,从何处获取内容以及应如何更改请求或响应。
在下面的配置示例中,我将向您展示使用哪些VCL规则来实现某些目标,从简单的图像和静态对象缓存到在分布式环境中使用Varnish或使其充当负载平衡器。
以下所有示例均适用于Varnish3.x。 请注意,Varnish 2.x使用不同的语法和规则,因此这些示例与该版本不兼容。
以下是Varnish的主要状态,我们将在VCL配置文件中使用它们:
收录
这是接收请求时调用的第一个函数。 在这里,我们可以在检查缓存中是否存在请求之前对其进行操作。 如果无法将请求放入缓存,则也可以在此阶段中选择将请求发送到的后端服务器。
通过
当我们要将请求传递到Web服务器并缓存答案时,可以使用此功能。
管
此功能绕过Varnish并将请求发送到Web服务器。
抬头
通过查找,Varnish要求验证响应是否存在并在高速缓存中有效。
取
通过传递或未命中调用从后端恢复内容后,将调用此函数。
基础知识:缓存图像
因此,让我们看一个配置示例。 在第一个示例中,我们将仅缓存图像和静态文件(如CSS文件)。 当您不知道要提升的网站时,此配置非常有用,因此您可以确定所有用户的所有图像,CSS和JavaScript都相同。 为了区分用户,HTTP协议使用cookie,因此我们必须在这种类型的请求中将它们消除,因此对于Varnish它们都是相同的:
sub vcl_recv{
if(req.url ~ " * \.(png|gif|jpg|swf|css|js)"{
unset req.http.cookie;
unset req.http.Vary;
return(lookup);
}
# strip the cookie before the image is inserted into cache.
sub vcl_fetch {
if (req.url ~ "\.(png|gif|jpg|swf|css|js)$") {
unset beresp.http.set-cookie;
}
就是这样。 使用此VCL文件,您可以轻松地缓存静态内容。
标准:缓存图像和页面
通常,您不仅希望缓存网站的静态内容,而且还希望缓存由Web服务器生成的一些动态页面,但对于所有用户而言,或至少对于所有匿名用户而言,这些页面都是相同的用户。 在此阶段,您必须知道选择哪些页面可以缓存,哪些页面不能缓存。
一个很好的例子是Wordpress,它是最常用的内容管理系统之一。 Wordpress使用PHP动态生成网站页面,并查询MySQL数据库。 这很好,因为您只需单击几下即可轻松地从管理界面更新网站,但在使用资源方面也很昂贵。 为什么每次用户登陆首页时都运行相同的PHP脚本和MySQL查询? 我们可以使用Varnish来缓存访问量最大的页面并获得令人难以置信的结果。
以下是在Wordpress安装中可能有用的一些规则:
sub vcl_recv{
# Let's make sure we aren't compressing already compressed formats.
if (req.http.Accept-Encoding) {
if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|mp3|mp4|m4v)(\?. * |)$") {
remove req.http.Accept-Encoding;
} elsif (req.http.Accept-Encoding ~ "gzip") {
set req.http.Accept-Encoding = "gzip";
} elsif (req.http.Accept-Encoding ~ "deflate") {
set req.http.Accept-Encoding = "deflate";
} else {
remove req.http.Accept-Encoding;
}
}
if (req.url ~ "^/$") {
unset req.http.cookie;
}
# Unset all cookies if not Wordpress admin - otherwise login will fail
if (!(req.url ~ "wp-(login| admin )")) {
unset req.http.cookie;
return(lookup);
}
# If you request the special pages go directly to them
if (req.url ~ "wp-(login| admin )") {
return (pipe);
}
}
sub vcl_miss {
if (!(req.url ~ "wp-(login| admin )")) {
unset req.http.cookie;
}
if (req.url ~ "^/+.(jpeg|jpg|png|gif|ico|js|css|txt|gz|zip|lzma|bz2|tgz|tbz|html|htm)(\?.|)$") {
unset req.http.cookie;
set req.url = regsub(req.url, "\?.$", "");
}
if (req.url ~ "^/$") {
unset req.http.cookie;
}
}
sub vcl_fetch {
if (req.url ~ "^/$") {
unset beresp.http.set-cookie;
}
# Unset all cookies if not Wordpress admin - otherwise login will fail
if (!(req.url ~ "wp-(login| admin )")) {
unset beresp.http.set-cookie;
}
}
您可以看到在此示例中,我们缓存了我们网站上的所有页面,但是对于URL中具有“ wp-admin”或“ wp-login”的页面,字符串是用于登录到的“特殊”位置Wordpress作为管理员。 因此,我们想直接与Web服务器对话并绕过Varnish缓存。
自然地,如果您使用Drupal,Joomla或定制网站,则必须更改这些规则,但目标始终是相同的:要发送所有动态页面和缓存,您可以将其发送到后端。
标准++:提高服务器弹性
有时Web服务器由于负载高而变得缓慢。 清漆也可以提供帮助。 我们可以使用一些特殊的指令来告诉Varnish,如果后端掉线或响应速度太慢,请避免与后端通话。 在这些情况下,Varnish使用“宽限期”指令。
在Varnish范围内,宽限期意味着在情况需要时交付可能过期的对象。 发生这种情况是因为:
- 选定的后端控制器已关闭
- 一个不同的线程已经向后端发出了尚未完成的请求。
sub vcl_recv {
if (req.backend.healthy) {
set req.grace = 30s;
} else {
set req.grace = 1h;
}
}
sub vcl_fetch {
set beresp.grace = 1h;
}
此配置告诉Varnish如果有问题,请测试后端并提高宽限期。 上面的示例还引入了指令“ req.backend.healthy”,该指令用于检查后端。 当您有多个后端时,这非常有用,因此让我们看一个更高级的示例。
高级用途:在分布式环境中创建弹性Web服务器
这是我们的最终配置文件,其中包含到目前为止我们看到的所有选项,以及两个后端的定义以及一些针对探针的特殊指令。 这是Varnish确定Web服务器是否处于活动状态的方式。
.url
Varnish将使用此URL向后端发出请求。
。暂停
确定探针必须完成的速度。 您必须指定一个带有数字的时间单位,例如“ 0.1 s”,“ 1230 ms”或什至“ 1 h”。
。间隔
两次投票之间要等待多长时间。 您还必须在此处指定时间单位。 请注意,这不是“比率”,而是“间隔”。 最低的轮询速率是(.timeout + .interval)。
。窗口
确定后端是否正常时要考虑多少次最新民意调查。
。阈
多少次.window上次民意测验必须是好的,后端才能被宣布为正常。
现在,我们可以使用指令“ req.backend.healthy”并获得一个布尔结果,该结果告诉我们后端是否还存在。
#
# Customized VCL file for serving up a Wordpress site with multiple back-ends.
#
# Define the internal network subnet.
# These are used below to allow internal access to certain files while not
# allowing access from the public internet .
acl internal {
"10.100.0.0"/24;
}
# Define the list of our backends (web servers), they Listen on port 8080
backend web1 { .host = "10.100.0.1"; .port = "8080"; .probe = { .url = "/status.php"; .interval = 5s; .timeout = 1s; .window = 5;.threshold = 3; }}
backend web2 { .host = "10.100.0.2"; .port = "8080"; .probe = { .url = "/status.php"; .interval = 5s; .timeout = 1s; .window = 5;.threshold = 3; }}
# Define the director that determines how to distribute incoming requests.
director default_director round-robin {
{ .backend = web1; }
{ .backend = web2; }
}
# Respond to incoming requests.
sub vcl_recv {
set req.backend = default_director;
# Use anonymous, cached pages if all backends are down.
if (!req.backend.healthy) {
unset req.http.Cookie;
set req.grace = 6h;
} else {
set req.grace = 30s;
}
# Unset all cookies if not Wordpress admin - otherwise login will fail
if (!(req.url ~ "wp-(login| admin )")) {
unset req.http.cookie;
return(lookup);
}
# If you request the special pages go directly to them
if (req.url ~ "wp-(login| admin )") {
return (pipe);
}
# Always cache the following file types for all users.
if (req.url ~ "(?i)\.(png|gif|jpeg|jpg|ico|swf|css|js|html|htm)(\?+)?$") {
unset req.http.Cookie;
}
}
# Code determining what to do when serving items from the web servers.
sub vcl_fetch {
# Don't allow static files to set cookies.
if (req.url ~ "(?i)\.(png|gif|jpeg|jpg|ico|swf|css|js|html|htm)(\?+)?$") {
# beresp == Back-end response from the web server.
unset beresp.http.set-cookie;
}
# Allow items to be stale if needed.
set beresp.grace = 6h;
}
强大的工具
这些只是一些示例,可以帮助您开始使用Varnish。 该工具确实功能强大,可以帮助您在不购买更多硬件或虚拟机的情况下大大提高性能。 对于许多网站管理员来说,这是真正的好处。