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