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

Varnish配置文件说明

varnish的VCL的详细解析:主机配置backendwww{.hostwww.example.com;.porthttp;.connect_timeout1s;连接时间.first_byte_timeout5s;连接上后等待接受第一个字节的时间.between_bytes_timeout2s;在字节与字节之间的等待

varnish的VCL的详细解析:

主机配置

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;

}


推荐阅读
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文探讨了如何在日常工作中通过优化效率和深入研究核心技术,将技术和知识转化为实际收益。文章结合个人经验,分享了提高工作效率、掌握高价值技能以及选择合适工作环境的方法,帮助读者更好地实现技术变现。 ... [详细]
  • 深入理解一致性哈希算法及其应用
    本文详细介绍了分布式系统中的一致性哈希算法,探讨其原理、优势及应用场景,帮助读者全面掌握这一关键技术。 ... [详细]
  • MySQL 高性能实战教程
    本课程深入探讨 MySQL 的架构、性能调优、索引优化、查询优化及高可用性等关键领域。通过实际案例和详细讲解,帮助学员掌握提升 MySQL 数据库性能的方法与技巧。 ... [详细]
  • 本文介绍了数据库体系的基础知识,涵盖关系型数据库(如MySQL)和非关系型数据库(如MongoDB)的基本操作及高级功能。通过三个阶段的学习路径——基础、优化和部署,帮助读者全面掌握数据库的使用和管理。 ... [详细]
  • Nginx 反向代理与负载均衡实验
    本实验旨在通过配置 Nginx 实现反向代理和负载均衡,确保从北京本地代理服务器访问上海的 Web 服务器时,能够依次显示红、黄、绿三种颜色页面以验证负载均衡效果。 ... [详细]
  • 在项目中使用 Redis 时,了解其不同架构模式(如单节点、主从复制、哨兵模式和集群)对于确保系统的高可用性和扩展性至关重要。本文将详细探讨这些模式的特点和应用场景。 ... [详细]
  • 深入解析Spring Cloud微服务架构与分布式系统实战
    本文详细介绍了Spring Cloud在微服务架构和分布式系统中的应用,结合实际案例和最新技术,帮助读者全面掌握微服务的实现与优化。 ... [详细]
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • 使用LVS与ldirectord实现高可用负载均衡
    本文介绍了如何通过LVS(Linux Virtual Server)结合ldirectord工具来实现服务器的健康检查及负载均衡功能。环境设置包括一个LVS节点和两个真实服务器节点,通过配置ldirectord进行健康状态监测,确保系统的高可用性。 ... [详细]
  • 本文提供了一套实用的方法论,旨在帮助开发者构建能够应对高并发请求且易于扩展的Web服务。内容涵盖了服务器架构、数据库管理、缓存策略以及异步处理等多个方面。 ... [详细]
  • 一面问题:MySQLRedisKafka线程算法mysql知道哪些存储引擎,它们的区别mysql索引在什么情况下会失效mysql在项目中的优化场景&# ... [详细]
  • 本文详细探讨了虚拟化的基本概念,包括服务器虚拟化、网络虚拟化及其在云计算环境中的应用。特别强调了SDN技术在网络虚拟化和云计算中的关键作用,以及网络虚拟化技术如何提升资源利用效率和管理灵活性。 ... [详细]
  • 利用GitHub热门资源,成功斩获阿里、京东、腾讯三巨头Offer
    Spring框架作为Java生态系统中的重要组成部分,因其强大的功能和灵活的扩展性,被广泛应用于各种规模的企业级应用开发中。本文将通过一份在GitHub上获得极高评价的Spring全家桶文档,探讨如何掌握Spring框架及其相关技术,助力职业发展。 ... [详细]
  • 本文详细介绍了反向代理与负载均衡的概念及其在Nginx中的应用。反向代理主要用于将客户端请求转发到后端服务器,而负载均衡则通过分发请求来提高系统的响应速度和可用性。 ... [详细]
author-avatar
AK7000
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有