热门标签 | 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;

}


推荐阅读
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • 使用LVS与ldirectord实现高可用负载均衡
    本文介绍了如何通过LVS(Linux Virtual Server)结合ldirectord工具来实现服务器的健康检查及负载均衡功能。环境设置包括一个LVS节点和两个真实服务器节点,通过配置ldirectord进行健康状态监测,确保系统的高可用性。 ... [详细]
  • Spring Cloud因其强大的功能和灵活性,被誉为开发分布式系统的‘一站式’解决方案。它不仅简化了分布式系统中的常见模式实现,还被广泛应用于企业级生产环境中。本书内容详实,覆盖了从微服务基础到Spring Cloud的高级应用,适合各层次的开发者。 ... [详细]
  • 探讨GET与POST请求数据传输的最大容量
    在Web开发领域,GET和POST是最常见的两种数据传输方法。本文将深入探讨这两种请求方式在不同环境下的数据传输能力及其限制。 ... [详细]
  • 本文提供了一套实用的方法论,旨在帮助开发者构建能够应对高并发请求且易于扩展的Web服务。内容涵盖了服务器架构、数据库管理、缓存策略以及异步处理等多个方面。 ... [详细]
  • 一面问题:MySQLRedisKafka线程算法mysql知道哪些存储引擎,它们的区别mysql索引在什么情况下会失效mysql在项目中的优化场景&# ... [详细]
  • 本文详细探讨了虚拟化的基本概念,包括服务器虚拟化、网络虚拟化及其在云计算环境中的应用。特别强调了SDN技术在网络虚拟化和云计算中的关键作用,以及网络虚拟化技术如何提升资源利用效率和管理灵活性。 ... [详细]
  • 利用GitHub热门资源,成功斩获阿里、京东、腾讯三巨头Offer
    Spring框架作为Java生态系统中的重要组成部分,因其强大的功能和灵活的扩展性,被广泛应用于各种规模的企业级应用开发中。本文将通过一份在GitHub上获得极高评价的Spring全家桶文档,探讨如何掌握Spring框架及其相关技术,助力职业发展。 ... [详细]
  • 本文详细介绍了反向代理与负载均衡的概念及其在Nginx中的应用。反向代理主要用于将客户端请求转发到后端服务器,而负载均衡则通过分发请求来提高系统的响应速度和可用性。 ... [详细]
  • 腾讯视频 Node.js 服务国庆阅兵直播高并发实战
    本文分享了腾讯视频团队在国庆阅兵直播项目中,如何利用Node.js服务成功应对2.38亿次观看的高并发挑战。文章将从服务架构、可用性保障、缓存策略、日志与告警等方面详细解析。 ... [详细]
  • 本文深入探讨ZooKeeper的功能与应用场景,解释其作为开源分布式协调服务的核心作用,以及如何通过ZooKeeper实现数据的一致性和高可用性。 ... [详细]
  • 本文详细探讨了在Windows Server 2003环境下遇到MySQL连接失败(错误代码10061)的解决方案,包括通过卸载特定的Windows更新和调整系统注册表设置的方法。 ... [详细]
  • ipvsadm命令简介:ipvsadm是LVS在应用层的管理命令,我们可以通过这个命令去管理LVS的配置。在fedora14、Linux6.0之后系统中 ... [详细]
  • 本文档详细介绍了服务器与应用系统迁移的策略与实施步骤。迁移不仅涉及数据的转移,还包括环境配置、应用兼容性测试等多个方面,旨在确保迁移过程的顺利进行及迁移后的系统稳定运行。 ... [详细]
  • Linux双网卡绑定技术详解与实践
    本文详细介绍了如何在Linux系统中实现双网卡绑定,即将两块物理网卡合并为一个逻辑网卡,以提高网络性能和可靠性。文中不仅涵盖了基本的概念,还提供了具体的配置步骤和测试方法。 ... [详细]
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社区 版权所有