当前位置: 首页 > 工具软件 > Varnish Agent > 使用案例 >

varnish简介

斜博超
2023-12-01

Varnish Configuration Language (VCL)是varnish配置缓存策略的工具,它是一种基于“域”(domain specific)的简单编程语言,它支持有限的算术运算和逻辑运算操作、允许使用正则表达式进行字符串匹配、允许用户使用set自定义变量、支持if判断语句,也有内置的函数和变量等。使用VCL编写的缓存策略通常保存至.vcl文件中,其需要编译成二进制的格式后才能由varnish调用。事实上,整个缓存策略就是由几个特定的子例程如vcl_recv、vcl_fetch等组成,它们分别在不同的位置(或时间)执行,如果没有事先为某个位置自定义子例程,varnish将会执行默认的定义。

VCL策略在启用前,会由management进程将其转换为C代码,而后再由gcc编译器将C代码编译成二进制程序。编译完成后,management负责将其连接至varnish实例,即child进程。正是由于编译工作在child进程之外完成,它避免了装载错误格式VCL的风险。因此,varnish修改配置的开销非常小,其可以同时保有几份尚在引用的旧版本配置,也能够让新的配置即刻生效。编译后的旧版本配置通常在varnish重启时才会被丢弃,如果需要手动清理,则可以使用varnishadm的vcl.discard命令完成。

varnish支持的缓存存储类型:

  • file:使用特定的文件存储所有的缓存数据,然后在通过mmap()这个系统调用将整个文件的数据映射到进程空间。不过,重启或停止varnish后,缓存的内容会消失,也就是说不能持久存储。
  • malloc:使用malloc()系统调用在varnish启动的时候想内存申请固定大小的内存来缓存数据。
  • persistent:还处于测试时期,不建议使用。

总体架构流程:

  1. 主进程 fork 子进程,主进程等待子进程的信号,子进程退出后,主进程重新启动子进程,子进程生成若干线程。
  2. Accept 线程:接受请求,将请求挂在 overflow队列上
  3. Work 线程: 多个,从对列上摘除请求,对请求进行处理,直到完成,然后处理下一个请求
  4. Epoll 线程: 一个请求处理称作一个 session,在 session 周期内,处理完请求后,会交给Epoll 处理,监听是否还有事件发生。
  5. Expire 线程:对于缓存的对象,根据过期时间,组织成二叉堆,该线程周期检查该堆的根,处理过期的文件。
    变量类型:
        内建变量:
                req.*:request,表示由客户端发来的请求报文相关;
                    req.http.*
                        req.http.User-Agent, req.http.Referer, ...
                bereq.*:由varnish发往BE主机的httpd请求相关;
                    bereq.http.*
                beresp.*:由BE主机响应给varnish的响应报文相关;
                    beresp.http.*
                resp.*:由varnish响应给client相关;
                obj.*:存储在缓存空间中的缓存对象的属性;只读;

                常用变量:
                    bereq.*, req.*:
                        bereq.http.HEADERS
                        bereq.request:请求方法;
                        bereq.url:请求的url;
                        bereq.proto:请求的协议版本;
                        bereq.backend:指明要调用的后端主机;

                        req.http.Cookie:客户端的请求报文中Cookie首部的值; 
                        req.http.User-Agent ~ "chrome"


                    beresp.*, resp.*:
                        beresp.http.HEADERS
                        beresp.status:响应的状态码;
                        reresp.proto:协议版本;
                        beresp.backend.name:BE主机的主机名;
                        beresp.ttl:BE主机响应的内容的余下的可缓存时长;

                    obj.*
                        obj.hits:此对象从缓存中命中的次数;
                        obj.ttl:对象的ttl值

                    server.*
                        server.ip:varnish主机的IP;
                        server.hostname:varnish主机的Hostname;
                    client.*
                        client.ip:发请求至varnish主机的客户端IP;

配置文件:

vim /etc/sysconfig/varnish
    NFILES=131072           #最大打开文件数65536*2
    MEMLOCK=82000           #默认日志文件大小,单位kB
    NPROCS="unlimited"      #最大线程数量
    RELOAD_VCL=1            #设置为1可以使用reload代替restart加载vcl

## Alternative 3, Advanced configuration
VARNISH_VCL_CONF=/etc/varnish/default.vcl   # 定义vcl配置文件
VARNISH_LISTEN_ADDRESS=                   # 定义varnish服务监听地址
VARNISH_LISTEN_PORT=6081                    # 定义varnish服务监听端口
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1      # 定义允许进行进程管理地址
VARNISH_ADMIN_LISTEN_PORT=6082              # 定义管理进程监听端口
VARNISH_SECRET_FILE=/etc/varnish/secret     # 定义密码文件
VARNISH_MIN_THREADS=50                      # 定义varnish启动时最小线程数
VARNISH_MAX_THREADS=1000                    # 定义varnish启动时最大线程数
VARNISH_THREAD_TIMEOUT=120                  # 定义varnish线程响应超时时间
VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin  # 定义varnish文件存储地址
VARNISH_STORAGE_SIZE=1G                     # 定义缓存使用文件大小,单位:k/M/G/T
# VARNISH_MEMORY_SIZE=64M                   # 定义缓存使用内存大小  VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}"# 使用文件缓存
VARNISH_STORAGE="malloc,${VARNISH_MEMORY_FILE}"                       # 使用内存缓存             
VARNISH_TTL=120                             # 设置后端超时时间
DAEMON_OPTS="-a"
${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \   # 变量调用
            -f ${VARNISH_VCL_CONF} \
            -T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \
            -t ${VARNISH_TTL} \
            -w ${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS},${VARNISH_THREAD_TIMEOUT} \
            -u varnish -g varnish \
            -S ${VARNISH_SECRET_FILE} \
            -s ${VARNISH_STORAGE}"

简单示例:添加http首部,让客户端可知缓存是否从服务器中得到
修改后端主机:

vim /etc/varnish/defatult.vcl
backend default {
  .host = "172.18.19.11";
  .port = "80";
}

添加vcl语句:

vim /etc/varnish/defatult.vcl
sub vcl_deliver {

  if (obj.hits > 0) {
    set resp.http.X-Cache = "anuuy";
  } else {
    set resp.http.X-Cache = "sunny";
  }
}
 sub vcl_hit {
     return (deliver);
 }

通过命令行工具varnishadm重载配置

varnish> vcl.list
200       
active          0 boot
varnish> vcl.load test1 /etc/varnish/default.vcl
200       
VCL compiled.
varnish> vcl.use test1
200       
varnish> vcl.list
200       
available       0 boot
active          0 test1
 类似资料: