varnish05-varnish使用实例

  • 一个中小型Web站点的架构图。

1、使用Varnish

1.1、试验架构图

  • 在10.1.1.11上安装varnish,在10.1.1.12和13上安装httpd。

1.2、配置varnish.params文件

]# vim /etc/varnish/varnish.params
#启动服务时,systemd自动重新编译VCL配置文件
RELOAD_VCL=1
#默认加载的VCL配置文件
VARNISH_VCL_CONF=/etc/varnish/default.vcl
#varnish对外提供Web服务的IP地址和端口(默认监听所有IP地址和6081端口)
# VARNISH_LISTEN_ADDRESS=192.168.1.5
VARNISH_LISTEN_PORT=8080
#varnish的管理API接口监听的IP地址和端口
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1
VARNISH_ADMIN_LISTEN_PORT=6082
#CLI鉴权的加密文件
VARNISH_SECRET_FILE=/etc/varnish/secret
#varnish的缓存存储机制
VARNISH_STORAGE="malloc,256M"
#varnishd工作进程的用户和组
VARNISH_USER=varnish
VARNISH_GROUP=varnish
#运行时参数
#DAEMON_OPTS="-p thread_pool_min=5 -p thread_pool_max=500 -p thread_pool_timeout=300"

1.3、配置VCL文件

]# vim /etc/varnish/default.vcl
vcl 4.0;

import directors;
#定义后端服务器
backend hh1 {
    .host = "10.1.1.12";
    .port = "80";
}
backend hh2 {
    .host = "10.1.1.13";
    .port = "80";
}
#定义后端服务器组(round_robin和random)
sub vcl_init {
    new hh_group = directors.round_robin();
    hh_group.add_backend(hh1);
    hh_group.add_backend(hh2);
}
#使用后端服务器组
sub vcl_recv {
    set req.backend_hint = hh_group.backend();
}

#可以清理请求、删除cookie、重写请求等。(在检查缓存之前发生)
sub vcl_recv {
}
#可以清理响应头、删除Set-Cookie头和其他。(在后端读取响应头后发生)
sub vcl_backend_response {
}
#计算或修改最终对象,并准备将响应发送给客户端时发生。
sub vcl_deliver {
}

1.4、启动varnish服务

1、启动varnish服务

]# systemctl start varnish.service

//记录varnish日志服务(一般不用启动,日志会在前置nginx上记录)
]# systemctl start varnishncsa.service

2、查看varnish的VCL配置

]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
//列出VCL配置文件的版本
varnish> vcl.list
200        
active          0 boot
//查看VCL配置文件的版本boot的自定义内容
varnish> vcl.show boot
200        
vcl 4.0;

import directors;
#定义后端服务器
backend hh1 {
    .host = "10.1.1.12";
    .port = "80";
}
backend hh2 {
    .host = "10.1.1.13";
    .port = "80";
}
#定义后端服务器组(round_robin和random)
sub vcl_init {
    new hh_group = directors.round_robin();
    hh_group.add_backend(hh1);
    hh_group.add_backend(hh2);
}
#使用后端服务器组
sub vcl_recv {
    set req.backend_hint = hh_group.backend();
}

#可以清理请求、删除cookie、重写请求等。(在检查缓存之前发生)
sub vcl_recv {
}
#可以清理响应头、删除Set-Cookie头和其他。(在后端读取响应头后发生)
sub vcl_backend_response {
}
#计算或修改最终对象,并准备将响应发送给客户端时发生。
sub vcl_deliver {
}
//查看后端服务器列表
varnish> backend.list
200        
Backend name                   Refs   Admin      Probe
hh1(10.1.1.12,,80)             1      probe      Healthy (no probe)
hh2(10.1.1.13,,80)             1      probe      Healthy (no probe)

2、优化配置

2.1、varnish的缓存存储机制

1、内存存储

  • malloc[,<size>]
    • malloc是关键字,size是定义内存的大小。
    • 重启后所有缓存项失效。
  • jemalloc对内存缓存挺有用的,并发申请内存(malloc默认一个)
    • yum info jemalloc

2、磁盘文件存储

  • file[,<dir_or_file>[,<size>[,<granularity>]]]
    • file是关键字,默认目录是/tmp。
    • 重启后所有缓存项失效
  • 建议使将固态硬盘组织成ride
  • 示例,"file,/usr/local/varnish/cache.data,1G"

3、文件存储(实验)

  • persist{experimental}
    • 重启后所有缓存项有效

2.2、varnish的运行时参数

  • varnish的运行时参数有两种设置方式:
//方法一,配置varnish.params文件(永久生效)
]# vim /etc/varnish/varnish.params
#DAEMON_OPTS="-p thread_pool_min=5 -p thread_pool_max=500 -p thread_pool_timeout=300"

//方法二,varnishadm命令(重启生效)
]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
param.show [-l] [<param>]
param.set <param> <value>

1、线程相关的参数

  • 每一个请求由一个线程来处理。worker线程的最大数决定了varnish的并发响应能力。
  • thread_pools:工作线程池的数目,默认2个。小于或等于CPU核心的数量。
  • thread_pool_max:每个线程池中的最大线程数,默认5000个。(最大并发连接数=thread_pools * thread_pool_max)
  • thread_pool_min:每个线程池中的最小线程数,即“最大空闲线程数”。
  • thread_pool_timeout:空闲线程的超时时长。超过thread_pool_min的空闲线程将被销毁。
  • thread_pool_add_delay:在创建线程之后,至少要等待这么长时间才能创建下一个线程。
  • thread_pool_destroy_delay:杀死线程时要犹豫的时长。
  • thread_pool_fail_delay:创建线程失败时,要间隔多长时间才重新尝试创建线程。
  • thread_queue_limit:每个线程池允许的队列长度。排队等待线程的请求数量,超过这个限制的请求将被丢弃而不是排队。

2、计时器(Timer)相关的参数

  • connect_timeout:连接后端主机的超时时间,超时会返回502。如果有大量502出现,可以考虑连接数量、增加超时时间、添加后端服务器降低拥挤
  • first_byte_timeout:从后端接收第一个字节的默认超时。在放弃之前,我们只为第一个字节等待这么多秒。值为0意味着它永远不会超时。VCL可以为每个后端和后端请求重写此默认值。此参数不适用于管道。
  • between_bytes_timeout当从后端接收数据时,字节之间的默认超时。我们只在字节之间等待这么多秒就会放弃。值为0意味着它永远不会超时。VCL可以为每个后端请求和后端请求重写此默认值。此参数不适用于管道。
  • send_timeout:为客户端连接发送超时。如果HTTP响应没有在这么多秒内传输,会话将关闭。
  • timeout_idle:客户端连接的空闲超时。 (保持连接)
  • timeout_req:接收客户端请求头的最大时间,从第一个非空白字符到两个CRNL。
  • cli_timeout:子进程响应mgt_param命令行请求的超时时间。

1

#                                                                                                                        #
posted @ 2022-12-18 21:49  麦恒  阅读(99)  评论(0编辑  收藏  举报