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
# #

浙公网安备 33010602011771号