热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Varnish服务器的配置文件详细解析

主机配置backendwww{.hostwww.example.com;.porthttp;.connect_timeout1s;连接时间.first_byte_timeout5s;连接上后等待接受第一个字节的时间.between_bytes_timeout2s;在字节与字节之间的等待时间}多个主机实现负载均衡。dir

主机配置

backend www {

  .host = "www.example.com";

  .port = "http";

  .connect_timeout = 1s;     连接时间

  .first_byte_timeout = 5s;    连接上后等待接受第一个字节的时间

  .between_bytes_timeout = 2s; 在字节与字节之间的等待时间

}

 

多个主机实现负载均衡

director b2 random {

  .retries = 5;

  {

    .backend = b1;

    .weight  = 7;

  }

  {

    .backend  = {

      .host = "fs2";

    }

  .weight  = 3;

  }

}

The random director(随即)

The round-robin director(轮询)

The client director 根据客户端(session COOKIE等)确认访问哪台服务器

The hash director(基于hash表来决定访问哪台服务器)

The DNS director

director directorname dns {

        .list = {

                .host_header = "www.example.com";

                .port = "80";

                .connect_timeout = 0.4;

                "192.168.15.0"/24;

                "192.168.16.128"/25;

        }

        .ttl = 5m;  查找缓存时间

        .suffix = "internal.example.net";   主机名后缀

}

 

 

健康检查

backend www {

  .host = "www.example.com";

  .port = "http";

  .probe = {

    .url = "/test.jpg";

    .timeout = 0.3 s;

    .window = 8;

    .threshold = 3;

    .initial = 3;

  }

}

Or it can be defined separately and then referenced::

 

probe healthcheck {

   .url = "/status.cgi";

   .interval = 60s;

   .timeout = 0.3 s;

   .window = 8;

   .threshold = 3;

   .initial = 3;

}

 

backend www {

  .host = "www.example.com";

  .port = "http";

  .probe = healthcheck;

}

If you have many backends this can simplify the config a lot.

 

It is also possible to specify the raw HTTP request:

 

probe rawprobe {

    # NB: \r\n automatically inserted after each string!

    .request =

      "GET / HTTP/1.1"

      "Host: www.foo.bar"

      "Connection: close";

}

An ACL declaration creates and initializes a named access control list which can later be used to match client addresses::

 

acl local {

  "localhost";         // myself

  "192.0.2.0"/24;      // and everyone on the local network

  ! "192.0.2.23";      // except for the dialin router

}


if (client.ip ~ local) {

  return (pipe);

}

 

函数形式

sub pipe_if_local {

  if (client.ip ~ local) {

    return (pipe);

  }

}

Subroutines in VCL do not take arguments, nor do they return values.

函数调用:

call pipe_if_local;

内置函数:

vcl_recv在请求开始的时候调用,判断是否处理该请求,怎样处理以及访问后台哪个服务器。

返回值可以为:

error code [reason]

返回指定错误代码,终止请求。

pass

切换到pass模式,调用vcl_pass函数。

pipe

切换到pipe模式,调用vcl_ pipe函数。

lookup

在缓存中查找请求对象,根据是否在缓存中调用vcl_hit or vcl_miss函数

vcl_pipe

在pipe模式下被调用,请求被传递到后台服务器,前台与后台直接多次交互,直到结束不写日志。

vcl_pass

在pass模式下被调用,请求被传递到后台服务器,前台与后台直接一次交互,不写日志。

The vcl_recv 会调用一下参数会停止。

error code [reason]

返回错误信息

pass

进入到pass模式

restart

重启事物。

vcl_hash

可以调用hash_data() 把数据添加到hash表中

vcl_hit

在cache中成功查找到数据会调用这个函数。

可以调用一下参数终止该函数

deliver

error code [reason]

pass

restart

vcl_miss

没有在内存中找到数据的时候调用这个函数,他的目的是是否从后台服务器上取数据,并且是从哪台服务器上取数据。

可以调用一下参数终止该函数

error code [reason]

pass

fetch

 

vcl_fetch

当后台服务器上的数据成功被加载到缓存中时调用。

可以调用一下参数终止该函数

deliver

数据被加载到cache中并传递给客户端。调用vcl_deliver

error code [reason]

pass

restart

vcl_deliver

缓存数据被传递给了客户端,调用这个函数。

可以调用一下参数终止该函数

deliver

error code [reason]

restart

vcl_error

当遇到后台或内部错误的时候会被调用。

可以调用一下参数终止该函数

deliver

Deliver the error object to the client.

restart

如果没有被定义会调用默认的。

函数样式:其中(?i)是正则表达式中不区分大小写的意思。

sub vcl_recv {

  if (req.http.host ~ "(?i)example.com") {

    set req.backend = foo;

  } elsif (req.http.host ~ "(?i)example.org") {

    set req.backend = bar;

  }

}

 

 

变量:

now  当前时间

.host 源主机名或后台服务器IP地址

.port 源服务名或者服务端口号。

 

client.ip 客户端IP

server.hostname  varnish服务器主机名

server.identity  varnish服务器标识

server.ip   varnish服务器的IP

server.port  varnish服务器的端口号

req.request  请求类型 get post head ……

req.url   请求的URL

req.proto  client使用的HTTP协议版本

req.backend   提供这个请求的原服务器名

req.backend.healthy  提供这个请求的原服务是否正常提供服务

req.http.header  相应的HTTP的header。

req.hash_always_miss 强迫varnish忽略这一请求,直接从元数据库取数据。

req.hash_ignore_busy 在cache lookup时,忽略忙的对象。

req.can_gzip  客户端是否接受gzip编码

 

下面参数是varnish访问源数据库时使用:

bereq.request  请求类型 head get post……

bereq.url

bereq.proto

bereq.http.header

bereq.connect_timeout 等待连接源数据库的时间(以秒计算)

bereq.first_byte_timeout 连接后,得到第一个字节的时间(以秒计算)

bereq.between_bytes_timeout 在两个字节之间的时间(以秒计算)

 

从源数据库中得到数据,在写入cache之前使用的变量,也就是说:在vcl_fetch中使用的变量:

beresp.do_esi 解析ESI对象

beresp.do_gzip  存储前是否压缩

beresp.do_gunzip 存储前是否解压缩

beresp.proto   源数据库使用的HTTP协议。

beresp.status  由varnish返回的HTTP状态码

beresp.response 由varnish返回的 HTTP status信息

beresp.ttl  目标在cache中存活时间

 

目标对象被加载到cache中后,下面的变量可以使用,也就是说在 vcl_hit and vcl_deliver.函数中使用的变量:

 

obj.proto 对象检索时使用的http协议。

obj.status  由varnish服务器返回的http协议状态码。

obj.response由varnish服务器返回的http协议状信息。

obj.ttl  对象还能存活的时间。

obj.lastuse 对象上次访问的大致时间

obj.hits  对象被访问的大致次数,如果是0,表示对象已经从cache中丢失。

 

下面的变量在确定一个对象的hash值的时候可用。

req.hash  指定对象的hash key 在读和写的时候会被访问。

 

下面的变量在准备反应回给客户端的时候会被使用:

resp.proto response给客户端的HTTP 协议版本

resp.status  将被返回的HTTP协议状态码

resp.response将被返回的HTTP协议状态信息

resp.http.header   相应的HTTP header.

 

变量实例:

sub vcl_recv {

  # Normalize the Host: header

  if (req.http.host ~ "(?i)^(www.)?example.com$") {

    set req.http.host = "www.example.com";

  }

}

HTTP headers can be removed entirely using the remove keyword::

 

sub vcl_fetch {

  # Don't cache COOKIEs

  remove beresp.http.Set-COOKIE;

}

有时候我们的源数据库组织数据比较慢我们可以设定函数如下,这样,每个对象都会被保存在varnish cache中2分钟,这样就可以不用使用户一直等待了,虽然数据不是最新,但是总比用户无法访问强。

sub vcl_recv {

  set req.grace = 2m;

}

sub vcl_fetch {

  set beresp.grace = 2m;

}


推荐阅读
  • 本文总结了一次针对大厂Java研发岗位的面试经历,探讨了面试中常见的问题及其背后的原因,并分享了一些实用的面试准备资料。 ... [详细]
  • 本文详细介绍了如何搭建一个高可用的MongoDB集群,包括环境准备、用户配置、目录创建、MongoDB安装、配置文件设置、集群组件部署等步骤。特别关注分片、读写分离及负载均衡的实现。 ... [详细]
  • 深入解析:存储技术的演变与发展
    本文探讨了从单机文件系统到分布式文件系统的存储技术发展过程,详细解释了各种存储模型及其特点。 ... [详细]
  • 本文详细介绍了如何使用Heartbeat构建一个高可用性的Apache集群,包括安装、配置和测试步骤。 ... [详细]
  • 本文介绍了两种有效的方法来解决DataSnap支持的Tcp长连接数受限的问题。方案一通过代理服务器实现负载均衡,方案二则利用多进程技术提升连接数。 ... [详细]
  • 本文详细介绍了如何在Linux系统中使用nslookup命令查询DNS服务器地址,这对于Linux服务器的运维管理是非常重要的基础知识。 ... [详细]
  • 直播带货系统中的推流技术详解
    本文介绍了RTMP(实时消息传输协议)及其在直播带货系统中的应用,并详细探讨了带货直播系统的连麦方案,包括服务端合流和客户端合流的优势与劣势。 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • ZooKeeper 入门指南
    本文将详细介绍ZooKeeper的工作机制、特点、数据结构以及常见的应用场景,包括统一命名服务、统一配置管理、统一集群管理、服务器动态上下线和软负载均衡。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • 小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限
    小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限 ... [详细]
  • 在JavaWeb项目架构中,NFS(网络文件系统)的实现与优化是关键环节。NFS允许不同主机系统通过局域网共享文件和目录,提高资源利用率和数据访问效率。本文详细探讨了NFS在JavaWeb项目中的应用,包括配置、性能优化及常见问题的解决方案,旨在为开发者提供实用的技术参考。 ... [详细]
  • (1)前期知识:1. 单机架构:单一服务器计算机——其处理能力和存储容量有限。2. 集群架构(负载均衡器与多节点服务器)——通过增加节点数量来提升系统性能和可靠性,实现高效的任务分配和资源利用。 ... [详细]
  • 第二章:Kafka基础入门与核心概念解析
    本章节主要介绍了Kafka的基本概念及其核心特性。Kafka是一种分布式消息发布和订阅系统,以其卓越的性能和高吞吐量而著称。最初,Kafka被设计用于LinkedIn的活动流和运营数据处理,旨在高效地管理和传输大规模的数据流。这些数据主要包括用户活动记录、系统日志和其他实时信息。通过深入解析Kafka的设计原理和应用场景,读者将能够更好地理解其在现代大数据架构中的重要地位。 ... [详细]
author-avatar
捕鱼达人2502940243
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有