varnish 4.0 官方文档翻译16-Backend servers/M/B/D/H

Backend servers

varnish有"后端"或者"源"服务器的概念。backend server提供给varnish加速的内容。

第一步设置是告诉varnish从哪儿找到backend server。使用你喜欢的编辑器打开varnishd引入的VCL文件。

VCL文件的开头有一小段有点像这样:

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

去掉注释后

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

这样一段配置在varnish中定义了一个后端,被叫做default。(和c的函数定义有点相似),当varnish需要从后端获得内容时,它将连接127.0.0.1的8080端口。

varnish可以定义多个后端,也可以将几个后端放在一个后端集群里面已达到负载均衡的目的。

Multiple backends

某些情况下你可能需要让varnish缓存多个后端的内容。你可能想让varnish映射所有的url在单个后端上,或者是多个后端。这里有些参数可以满足这样的需求。

现在我们需要在PHP站点中引入java应用。java应用的链接都是以/java/开头的。 处理java应用的服务器监听在8000端口上。默认的default.vcl文件这样的:

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

增加一个后端:

backend java {
    .host = "127.0.0.1";
    .port = "8000";
}

现在需要告诉varnish将不同的url发送到不同的后端server。在vcl_recv中:

sub vcl_recv {
    if (req.url ~ "^/java/") {
        set req.backend_hint = java;
    } else {
        set req.backend_hint = default;
    }
}

真的很简单。停下来思考下。正如你所看到的,你可以定义如何根据真实的任意数据来选择后端。你想发送手机设备的请求到不同的后端?没有问题。 可以满足你的需求。

if (req.http.User-Agent ~ "(?i)MIDP|WAP|UP.Browser|Smartphone|Obigo|Mobile|AU.Browser|wxd.Mms|WxdB.Browser|CLDC|UP.Link|KM.Browser|UCWEB|SEMC\-Browser|Mini|Symbian|Palm|Nokia|Panasonic|MOT|SonyEricsson|NEC|Alcatel|Ericsson|BENQ|BenQ|Amoisonic|Amoi|Capitel|PHILIPS|SAMSUNG|Lenovo|Mitsu|Motorola|SHARP|WAPPER|LG|EG900|CECT|Compal|kejian|Bird|BIRD|G900/V1.0|Arima|CTL|TDG|Daxian|DAXIAN|DBTEL|Eastcom|EASTCOM|PANTECH|Dopod|Haier|HAIER|KONKA|KEJIAN|LENOVO|Soutec|SOUTEC|SAGEM|SEC|SED|EMOL|INNO55|ZTE|iPhone|Android|Windows CE|Wget|Java|Opera") {
    set req.backend_hint = mobile;
}

Backends and virtual hosts in Varnish

varnish完全支持虚拟主机。他们从来没有明确宣布这点是因为varnish以非常规的方式来实现这个功能。在vcl_recv我们设置处理HTTP请求的路由。如果你想让路由基于基本的虚拟主机做点什么,你只需要检查req.http.host便可。

sub vcl_recv {
    if (req.http.host ~ "foo.com") {
        set req.backend_hint = foo;
    } elsif (req.http.host ~ "bar.com") {
        set req.backend_hint = bar;
    }
}

~符号后面的理解为正则表达式。这里可以匹配 "foo.com", "www.foo.com", "zoop.foo.com.cn" 还有其他包含foo.com的域名。该实例是有意写作如此,如果你明确了你的域名,你需要使用==来替代~符号。

sub vcl_recv {
    if (req.http.host == "foo.com" || req.http.host == "www.foo.com") {
        set req.backend_hint = foo;
    }
}

Directors

你也可以将几个后端组成一组后端。这个组被叫做Directors。可以提高性能和弹性(增加一台app,或者停用一台app等等)。

你可以定义几个后端,然后将他们组织在一个Directors。这些操作需要你载入VMOD(varnish module),然后在vcl_init中调用这个VMOD。

import directors;    # load the directors

backend server1 {
    .host = "192.168.0.10";
}
backend server2 {
    .host = "192.168.0.10";
}

sub vcl_init {
    new bar = directors.round_robin();
    bar.add_backend(server1);
    bar.add_backend(server2);
}

sub vcl_recv {
    # send all traffic to the bar director:
    set req.backend_hint = bar.backend();
}

该调度器是round-robin调度器。这意味着Directors将以轮询的算法来分发请求。还有一个random分配请求的director,你猜对了,随机的方式。

但是如果其中的某个server宕机了呢?varnish能将所有的请求分发到健康的server么?当然! Health Checks就是干这事的!

Health checks

现在我们给一个调度器设置两个后端和健康检测。先定义后端:

backend server1 {
    .host = "server1.example.com";
    .probe = {
        .url = "/";
        .timeout = 1s;
        .interval = 5s;
        .window = 5;
        .threshold = 3;
    }
}

backend server2 {
    .host = "server2.example.com";
    .probe = {
        .url = "/";
        .timeout = 1s;
        .interval = 5s;
        .window = 5;
        .threshold = 3;
    }
}

.probe是新的参数。在上面的例子中varnish将每5s检测后端,超时设为1s。每个检测将会发送get /的请求。如果5个检测中大于3个是成功,varnish就认为后端是健康的,反之,后端就有问题了。

更多.probe的信息可以在varnish中查看Probes章节

我们现在定义director

import directors;

sub vcl_init {
    new vdir = directors.round_robin();
    vdir.add_backend(server1);
    vdir.add_backend(server2);
}

你使用vir director作为处理请求的后端,就像你使用一个简单的后端那样。Varnish不会将请求发送到标记为不健康的后端上。

如果所有的后端都宕机了,varnish也可以返回给用户过期了的内容。查看Misbehaving servers获得更多如何开启这个功能的信息。

请注意,varnish将保持健康运行的探针对所有加载VCLs。Varnish将探针合并成似乎完全一体的-因此如果你有很多载入的VCL,不要修改probe的配置,卸载VCL将禁用probes。更多信息请查看ref:reference-vcl-director.

时间: 2024-11-09 00:10:50

varnish 4.0 官方文档翻译16-Backend servers/M/B/D/H的相关文章

varnish 4.0 官方文档翻译-简要教程

varnish 4.0简要教程 这部分教程包含了varnish基本原理.囊括了什么是varnish.它怎样工作,同时也包含了开始使用和运行varnish.这部分过后你可能想继续了解用户向导(varnish用户引导). 如果你正在web上读这些呢 注意每页左边的Next topic和Previous topic The fundamentals of web proxy caching with Varnish使用varnish作为web代理缓存的原理 Supported platforms 支持

varnish 4.0 官方文档翻译12-VCL

VCL - Varnish Configuration Language 本节包含了怎样通过varnish配置语言vcl来通知varnish如何处理http请求. varnish是高度结构化的系统.大多数其他的系统使用配置指令,在那里你基本上打开和关闭大量的开关.而我们选择使用领域特定语言,被叫做VCL,来完成之前的功能. 每个进入的请求流通过varnish,同时你可以支配如何通过VCL代码来处理请求.你可以让某些后端直接处理请求,你可以改变请求和响应,或者让varnish拥有各种各样动作依赖于

varnish 4.0 官方文档翻译17-Misbehaving servers

Misbehaving servers varnish有个关键特性,为misbehaving(行为不端,诡异的)web服务器或者应用服务器提供保护的能力. Grace mode 当几个客户端请求同一个页面的时候,varnish只发送一个请求到后端服务器,然后让其他几个请求挂起并等待返回结果:获得结果后,其它请求再复制后端的结果发送给客户端.有些产品中需要调用其他来将请求合并,而varnish自动做这些. 但如果同时有数以千计的请求,那么这个等待队列将变得庞大,这将导致2类潜在问题: 惊群问题(t

varnish 4.0 官方文档翻译21-Reporting and statistics

Reporting and statistics 本部分包括如何查看Varnish正在做什么,从每个http请求流的详细记录到汇总统计计数器. Logging in Varnish Statistics varnishtop varnishhist varnishstat Logging in Varnish Varnish中一个很棒的特点是工作日志的记录方式.varnish不记录日志到日志文件,而是调用VSL记录到共享内存片段,VSL-varnish共享日志.当这个片段被写完后,varnish

varnish 4.0 官方文档翻译20-Device detection

Device detection 设备检测基于请求中的User-agent找出哪种内容返回给客户端. 使用Device detection情况的一个例子,发送给小屏幕的手机客户端或者复杂的网络环境,减少发送文件的数量,或者提供给不能解码的客户端一个video解码器. 有些使用这种方案的典型场景: 重写url 使用不同的后端给客户端 改变后端请求为了让后端发送裁剪的内容 可能为了便于理解,下文中假定req.http.X-UA-Device头表示当前前客户端,同时每种客户端是唯一的. 简单的像这样设

varnish 4.0 官方文档翻译19-VCL Examples

VCL Examples Manipulating request headers in VCL 在VCL中操作请求的header. 当我们想移除发送到web服务器/images目录的所有对象的cookie可以这样: sub vcl_recv {     if (req.url ~ "^/images") {     unset req.http.cookie;     } } 这样当请求被后端处理时在http的header中将不再有cookie信息.有用的是使用if语句.在匹配的UR

varnish 4.0 官方文档翻译22-Varnish Website Performan

Varnish and Website Performance 本节集中解决如何调优varnish server,同时如何使用varnish优化你的web站点. 一共有三小节.第一小节你应该想到varnish的各种工具和功能,下一小节如何从cache中清除已经缓存的内容.清除内容是一项基本功能,因为它允许给缓存的对象增加 TTL.TTL越大varnish保持在缓存中的时间越久,这意味着varnish处理更多的请求,只将少部分的请求传递到相对较慢的后端. 最后一小节,处理web内容的压缩.当从后端

varnish 4.0 官方文档翻译7-用户手册-重要命令行参数

重要的命令行参数 当启动varnish时有两个重要的参数你必须设置: 一个是处理http请求的tcp监听端口,另一个是处理真实请求的后端server 如果你使用操作系统自带的包管理工具安装的varnish,你将在下面的文件找到启动参数: Debian, Ubuntu: /etc/default/varnish Red Hat, Centos: /etc/sysconfig/varnish FreeBSD: /etc/rc.conf (See also: /usr/local/etc/rc.d/v

varnish 4.0 官方文档翻译7-用户手册-安全第一

Security first 安全第一 如果你仅仅抓专注于运行varnish,或者所有人都是这个观点,那么就可以跳过该节了.我们保护你的方方面面当http请求来的时候. 如果你的web基础设施是外包的,管理是分开的,那么你就需要考虑安全了. Varnish在4个权威的等级提供安全,大致关系到怎样让命令生效和在哪儿生效. the command line arguments, the CLI interface, VCL programs, and HTTP requests. Command l