软件 清漆:准备加粗线!

清漆:准备加粗线!

目录:

Anonim

在网站性能方面,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范围内,宽限期意味着在情况需要时交付可能过期的对象。 发生这种情况是因为:

  • 选定的后端控制器已关闭
  • 一个不同的线程已经向后端发出了尚未完成的请求。
两种情况在VCL中的处理方式相同:

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。 该工具确实功能强大,可以帮助您在不购买更多硬件或虚拟机的情况下大大提高性能。 对于许多网站管理员来说,这是真正的好处。

清漆:准备加粗线!