首页
About Me
推荐
weibo
github
Search
1
linuxea:gitlab-ci之docker镜像质量品质报告
49,204 阅读
2
linuxea:如何复现查看docker run参数命令
21,591 阅读
3
Graylog收集文件日志实例
18,272 阅读
4
git+jenkins发布和回滚示例
17,900 阅读
5
linuxea:jenkins+pipeline+gitlab+ansible快速安装配置(1)
17,804 阅读
ops
Openvpn
Sys Basics
rsync
Mail
NFS
Other
Network
HeartBeat
server 08
Code
Awk
Shell
Python
Golang
virtualization
KVM
Docker
openstack
Xen
kubernetes
kubernetes-cni
Service Mesh
Data
Mariadb
PostgreSQL
MongoDB
Redis
MQ
Ceph
TimescaleDB
kafka
surveillance system
zabbix
ELK Stack
Open-Falcon
Prometheus
victoriaMetrics
Web
apache
Tomcat
Nginx
自动化
Puppet
Ansible
saltstack
Proxy
HAproxy
Lvs
varnish
更多
互联咨询
最后的净土
软件交付
持续集成
gitops
devops
登录
Search
标签搜索
kubernetes
docker
zabbix
Golang
mariadb
持续集成工具
白话容器
linux基础
nginx
elk
dockerfile
Gitlab-ci/cd
最后的净土
基础命令
jenkins
docker-compose
gitops
haproxy
saltstack
Istio
marksugar
累计撰写
676
篇文章
累计收到
140
条评论
首页
栏目
ops
Openvpn
Sys Basics
rsync
Mail
NFS
Other
Network
HeartBeat
server 08
Code
Awk
Shell
Python
Golang
virtualization
KVM
Docker
openstack
Xen
kubernetes
kubernetes-cni
Service Mesh
Data
Mariadb
PostgreSQL
MongoDB
Redis
MQ
Ceph
TimescaleDB
kafka
surveillance system
zabbix
ELK Stack
Open-Falcon
Prometheus
victoriaMetrics
Web
apache
Tomcat
Nginx
自动化
Puppet
Ansible
saltstack
Proxy
HAproxy
Lvs
varnish
更多
互联咨询
最后的净土
软件交付
持续集成
gitops
devops
页面
About Me
推荐
weibo
github
搜索到
5
篇与
的结果
2015-06-10
Varnish命令行工具使用介绍
varnish的线程模型: cache-worker线程 cache-main线程:此线程只有一个,用于启动caceh; ban luker:实现缓存清理 acceptor:接受用户请求 epoll:线程池管理器 expire:清理过期缓存 varnish工作特性: ***** varnish> param.show -l 定义acceptor线程工作特性 acceptor_sleep_decay acceptor_sleep_incr acceptor_sleep_max auto_restart 必要时要不要重启某一个cache线程,默认为on ban_dups 重复的是否自动清理 脚本中定义 thread_pool_max 默认500,最大并发线程数 thread_pool_min 启动时要启动的线程数默认为5个 varnish定义其最大并发连接数:是通过线程池模型定义: thread_pools:线程池个数;默认为2; thread_pool_max:单线程池内允许启动的最多线程个数;大约超过5000个将不太稳定 thread_pool_min:启动时要启动的线程数最少线程数,默认为5个 thread_pool_timeout:多于thread_pool_min的线程空闲此参数指定的时长后即被purge; thread_pool_purge_delay :清理空闲线程,1000毫秒被清理 thread_pool_stack :工作线程站有多大,默认为-1,不做限制 thread_pool_workspace:线程池工作空间,默认使用65536字节内存,64K varnish的param查看及改变: 示例:修改线程为2000个 varnish> param.set thread_pool_max 2000 varnish> param.show thread_pool_max 200 thread_pool_max 2000 [threads] Default is 500 The maximum number of worker threads in each pool. Do not set this higher than you have to, since excess worker threads soak up RAM and CPU and generally just get in the way of getting work done. NB: This parameter may take quite some time to take (full) effect. NB: We do not know yet if it is a good idea to change this parameter, or if the default value is even sensible. Caution is advised, and feedback is most welcome. varnish> param.show [-l] [param] aram.set [param] [value] varnish的常用命令行工具: varnishadm, varnishtop: 内存日志区域查看工具 [root@[node0] ~]# varnishtop RxHeader User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36 其中: RxHeader:称为tag, 基于tag过滤,可使用-i或-x选项; User-Agent起始的内容:称为日志信息,可使用-I或-X选项进行过滤; varnishtop过滤示例: -I regexp: 仅显示被模式匹配到的条目 -X regexp:仅显示不被模式匹配到的条目 -C: 忽略字符大小写; -d: 显示已有日志; 比如: 我只显示User-Agent字段 [root@[node0] ~]# varnishtop -I ^User-Agent -1 478.00 RxHeader User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; InfoPath.3) 在比如我只显示Hash字段 [root@[node0] ~]# varnishtop -i Hash -1 543.00 Hash 172.16.249.108 337.00 Hash /test.html 55.00 Hash /index.php 42.00 Hash /index.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42 42.00 Hash /index.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42 32.00 Hash / 30.00 Hash /favicon.ico 3.00 Hash /index.html [root@[node0] ~]# varnishstat: -f field, field, ...指明字段 -l: 列出所有可用字段 -x: xml输出格式 -j: json输出格式 如: [root@[node0] ~]# varnishstat -f client_conn -1 client_conn 271 0.02 Client connections accepted 另外还有两个命令:varnishlog, varnishncsa
2015年06月10日
2,989 阅读
0 评论
0 点赞
2015-06-09
varnish基本应用(二)
作为一个缓存来讲,它首先的是一个代理。varnish本身来讲http协议的反向代理,后端可以拖动多个主机来提供内容,一旦有多个主机,varnish如何从多个后端挑选一个主机来响应用户的请求。有实现定制的必要性。因此,它也能支持负载均衡调度的方式实现对后端主机的指定。 在官方文档中说明了如何实现,backend,方法非常简单、 Varnish使用多台后端主机 Varnish中可以使用director指令将一个或多个近似的后端主机定义为一个逻辑组,并可以指定的调度方式(也叫挑选方法)来轮流将请求发送至这些主机上。不同的director可以使用同一个后端主机,而某director也可以使用“匿名”后端主机(在director中直接进行定义)。每个director都必须有其专用名,且在定义后必须在VCL中进行调用,VCL中任何可以指定后端主机的位置均可以按需将其替换为调用某已定义的director。 backend web1 { .host = "backweb"; .port = "80"; } director webservers random { .retries = 5; { .backend = web1; .weight = 2; } { .backend = { .host = "backweb2"; .port = "80"; } .weight = 3; } } 我提供了两台后端主机,着两台都可以定义成backend,和haproxy一样,后端存在的主机就是为了前端调用。一旦定义了多台主机,在vcl_recv中必然要指明用户给请求到达时,对于不同的用户请求应该由哪一个后端主机,在什么情况下由哪些主机响应。 比如说: 1,定义主机 # vim /etc/varnish/default.vcl backend web1{ .host = "172.16.249.99"; .port = "80"; } backend web2 { .host = "172.16.249.69"; .port = "80"; } OK。已经定义了两个后端主机,我们期望访问主页是由第一个后端主机响应,访问test.html时由第二个后端主机响应 2,指明后端主机 if (req.url ~"test.html"){ set req.backend = web1; }else{ set req.backend = web2; } 如果访问的是test.html由web1响应,否则全部给web2 ************************************ *一旦没有默认主机,必须指明后端主机。 ************************************ 3,装载配置 设置好后进行装载 [root@[node0] ~]varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 varnish> vcl.load backend default.vcl 200 VCL compiled. varnish>vcl.use backend 200 varnish> vcl.list 200 available 0 boot active 0 backend varnish> 4,配置后端主机测试页面 node3:172.16.249.99:web1 [root@[node3] html]# cat index.html test.htmlnode3test page on web1[root@[node3] html]# node2:172.16.249.69:web2 [root@[node2] html]# cat index.html test.htmlnode2test page on web2[root@[node2] html]# 当我们访问默认页面时跳转至node2,也就是web2,访问test.html时跳转node3,显示est page on web1 ======================================================================== &定义要使用后端主机: & backend NAME { & .host = 主机名或地址 & .port = 端口或服务 & } & & vcl_recv { 定义在引擎的某个位置 & ... & if (CONDITION) { 指明条件,当符合条件是使用后端那个主机 & set req.backend = BE_NAME;比如指明set req.backend= BE_NAME & } & } & ========================================================================= 二,动静分离 我们在node2上安装php (node2:172.16.249.69:web2) (node3:172.16.249.99:web1) 我们希望能把动态内容请求道后端主机node2,静态到达node3 示例: 1,在noed2上安装php并且测试。 [root@[node2] html]# cat /var/www/html/index.php [root@[node2] html]# service httpd restart [root@[node2] html]# curl 172.16.249.69/index.php 在node0修改配置文件 1,############################################## backend static { .host = "172.16.249.99"; .port = "80"; } backend app { .host = "172.16.249.69"; .port = "80"; } 2,################################################ if (req.url ~"\.php$"){ set req.backend = app; }else{ set req.backend = static; } 3,################################################# varnish>vcl.load app1 default.vcl 200 VCL compiled. varnish> vcl.use app1 200 varnish> vcl.list 200 available 0 boot available 2 backend active 0 app1 varnish> 打开浏览器测试,会发现php的图片不见了;很明显,它是去静态web1页面找去了。url动静分离,url指向静态内容位置。如果很不幸的出现这种现象,就需要url重写。 ************************************************************* 三,varnish健康状态监测 Varnish可以检测后端主机的健康状态,在判定后端主机失效时能自动将其从可用后端主机列表中移除,而一旦其重新变得可用还可以自动将其设定为可用。为了避免误判,Varnish在探测后端主机的健康状态发生转变时(比如某次探测时某后端主机突然成为不可用状态),通常需要连续执行几次探测均为新状态才将其标记为转换后的状态。 硬状态:online状态,持续down好多次,无法自举 软状态:online状态,突然down up也一样,up到down需要慎重,down到up激进 每个后端服务器当前探测的健康状态探测方法通过.probe进行设定,其结果可由req.backend.healthy变量获取,也可通过varnishlog中的Backend_health查看或varnishadm的debug.health查看。 backend web1 { .host = "www.linuxea.com"; .probe = { .url = "/.healthtest.html"; .interval = 1s; .window = 5; .threshold = 2; } } .probe中的探测指令常用的有: (1) .url:探测后端主机健康状态时请求的URL,默认为“/”; (2) .request: 探测后端主机健康状态时所请求内容的详细格式,定义后,它会替换.url指定的探测方式;比如: .request = "GET /.healthtest.html HTTP/1.1" "Host: www.linuxea.com" "Connection: close"; (3) .window:设定在判定后端主机健康状态时基于最近多少次的探测进行,默认是8; (4) .threshold:在.window中指定的次数中,至少有多少次是成功的才判定后端主机正健康运行;默认是3; (5) .initial:Varnish启动时对后端主机至少需要多少次的成功探测,默认同.threshold; (6) .expected_response:期望后端主机响应的状态码,默认为200; (7) .interval:探测请求的发送周期,默认为5秒; (8) .timeout:每次探测请求的过期时长,默认为2秒 开始吧: 从官方的示例: probe healthcheck { .url = "/status.cgi"; .interval = 60s; .timeout = 0.3 s; .window = 8; .threshold = 3; .initial = 3; .expected_response = 200; } backend www { .host = "www.example.com"; .port = "http"; .probe = healthcheck; } 我们定义的示例: 1, # vim /etc/varnish/default.vcl probe chk { .url = "/test.html"; .window = 5; .threshold = 3; .initial = 3; .timeout = 1s; } backend static { .host = "172.16.249.99"; .port = "80"; .probe = chk; } backend app { .host = "172.16.249.69"; .port = "80"; .probe = chk; } 2,进入varnish界面 varnish> vcl.load probe1 default.vcl 200 VCL compiled. varnish>vcl.use probe1 200 varnish>backend.list 列出后端主机和后端状态监测机制 200 Backend name Refs Admin Probe web1(172.16.249.99,,80) 2 probe Healthy (no probe) web2(172.16.249.69,,80) 2 probe Healthy (no probe) static(172.16.249.99,,80) 2 probe Healthy 5/5 app(172.16.249.69,,80) 2 probe Healthy 5/5 varnish> 对于后端主机而言,5秒钟会产生一个日志信息 # tail -f /var/log/httpd/access_log - - - [07/Jun/2015:15:39:02 +0800] "GET /test.html HTTP/1.1" 200 27 "-" "-" - - - [07/Jun/2015:15:39:07 +0800] "GET /test.html HTTP/1.1" 200 27 "-" "-" - - - [07/Jun/2015:15:39:12 +0800] "GET /test.html HTTP/1.1" 200 27 "-" "-" - - - [07/Jun/2015:15:39:17 +0800] "GET /test.html HTTP/1.1" 200 27 "-" "-" - - - [07/Jun/2015:15:39:22 +0800] "GET /test.html HTTP/1.1" 200 27 "-" "-" - - - [07/Jun/2015:15:39:27 +0800] "GET /test.html HTTP/1.1" 200 27 "-" "-" - - - [07/Jun/2015:15:39:32 +0800] "GET /test.html HTTP/1.1" 200 27 "-" "-" - - - [07/Jun/2015:15:39:37 +0800] "GET /test.html HTTP/1.1" 200 27 "-" "-" - - - [07/Jun/2015:15:39:42 +0800] "GET /test.html HTTP/1.1" 200 27 "-" "-" - - - [07/Jun/2015:15:39:47 +0800] "GET /test.html HTTP/1.1" 200 27 "-" "-" 但是,在生成环境中监控状态监测会对系统造成大量的I/O资源,是需要关闭的。 验证健康状态监测。 到web1上 [root@[node3] html]# cd /var/www/html/ [root@[node3] html]# ls index.html test.html [root@[node3] html]# cat test.htmltest page on web1[root@[node3] html]# mv test.html 1.html [root@[node3] html]# tail /var/log/httpd/access_log - - - [07/Jun/2015:15:43:39 +0800] "GET /test.html HTTP/1.1" 200 27 "-" "-" - - - [07/Jun/2015:15:43:44 +0800] "GET /test.html HTTP/1.1" 200 27 "-" "-" - - - [07/Jun/2015:15:43:49 +0800] "GET /test.html HTTP/1.1" 200 27 "-" "-" - - - [07/Jun/2015:15:43:54 +0800] "GET /test.html HTTP/1.1" 200 27 "-" "-" - - - [07/Jun/2015:15:43:59 +0800] "GET /test.html HTTP/1.1" 200 27 "-" "-" - - - [07/Jun/2015:15:44:04 +0800] "GET /test.html HTTP/1.1" 200 27 "-" "-" - - - [07/Jun/2015:15:44:09 +0800] "GET /test.html HTTP/1.1" 200 27 "-" "-" -- - [07/Jun/2015:15:44:14 +0800] "GET /test.html HTTP/1.1" 404 286 "-" "-" - - - [07/Jun/2015:15:44:19 +0800] "GET /test.html HTTP/1.1" 404 286 "-" "-" - - - [07/Jun/2015:15:44:24 +0800] "GET /test.html HTTP/1.1" 404 286 "-" "-" 这时候响应便是404了 当多次响应后,varnish认为他挂掉了:sick varnish> backend.list 200 Backend name Refs Admin Probe web1(172.16.249.99,,80) 2 probe Healthy (no probe) web2(172.16.249.69,,80) 2 probe Healthy (no probe) static(172.16.249.99,,80) 2 probeSick 0/5 app(172.16.249.69,,80) 2 probe Healthy 5/5 varnish> OK,我们将node3上的test.html改回来 [root@[node3] html]# mv 1.html test.html 在来查看,探测,探测中,有三次在线就可以上线了,因为在配置中interval指定过 varnish> backend.list 200 Backend name Refs Admin Probe web1(172.16.249.99,,80) 2 probe Healthy (no probe) web2(172.16.249.69,,80) 2 probe Healthy (no probe) static(172.16.249.99,,80) 2 probe Sick 1/5 app(172.16.249.69,,80) 2 probe Healthy 5/5 varnish> backend.list 200 Backend name Refs Admin Probe web1(172.16.249.99,,80) 2 probe Healthy (no probe) web2(172.16.249.69,,80) 2 probe Healthy (no probe) static(172.16.249.99,,80) 2 probe Sick 2/5 app(172.16.249.69,,80) 2 probe Healthy 5/5 varnish> backend.list 200 Backend name Refs Admin Probe web1(172.16.249.99,,80) 2 probe Healthy (no probe) web2(172.16.249.69,,80) 2 probe Healthy (no probe) static(172.16.249.99,,80) 2 probe Healthy 3/5 app(172.16.249.69,,80) 2 probe Healthy 5/5 varnish> backend.list 200 Backend name Refs Admin Probe web1(172.16.249.99,,80) 2 probe Healthy (no probe) web2(172.16.249.69,,80) 2 probe Healthy (no probe) static(172.16.249.99,,80) 2 probe Healthy 4/5 app(172.16.249.69,,80) 2 probe Healthy 5/5 varnish> backend.list 200 Backend name Refs Admin Probe web1(172.16.249.99,,80) 2 probe Healthy (no probe) web2(172.16.249.69,,80) 2 probe Healthy (no probe) static(172.16.249.99,,80) 2 probe Healthy 5/5 app(172.16.249.69,,80) 2 probe Healthy 5/5 varnish> 上线后,直接访问就OK ********************************************************************** 4,实现多台后端主机做负载均衡 Varnish中可以使用director指令将一个或多个近似的后端主机定义为一个逻辑组,并可以指定的调度方式(也叫挑选方法)来轮流将请求发送至这些主机上。不同的director可以使用同一个后端主机,而某director也可以使用“匿名”后端主机(在director中直接进行定义)。每个director都必须有其专用名,且在定义后必须在VCL中进行调用,VCL中任何可以指定后端主机的位置均可以按需将其替换为调用某已定义的director。 backend web1 { .host = "backweb1.linuxea.com"; .port = "80"; } director webservers random { random:随机调度 .retries = 5; { .backend = web1; .weight = 2; weight:权重 } { .backend = { .host = "backweb2.linuxea.com"; .port = "80"; } .weight = 3; } } 如上示例中,web1为显式定义的后端主机,而webservers这个directors还包含了一个“匿名”后端主机(backweb2.linuxea.com)。webservers从这两个后端主机中挑选一个主机的方法为random,即以随机方式挑选。 Varnish的director支持的挑选方法中比较简单的有round-robin和random两种。其中,round-robin类型没有任何参数,只需要为其指定各后端主机即可,挑选方式为“轮叫”,并在某后端主机故障时不再将其视作挑选对象;random方法随机从可用后端主机中进行挑选,每一个后端主机都需要一个.weight参数以指定其权重,同时还可以director级别使用.retires参数来设定查找一个健康后端主机时的尝试次数。 Varnish 2.1.0后,random挑选方法又多了两种变化形式client和hash。client类型的director使用client.identity作为挑选因子,这意味着client.identity相同的请求都将被发送至同一个后端主机。client.identity默认为client.ip,但也可以在VCL中将其修改为所需要的标识符。类似地,hash类型的director使用hash数据作为挑选因子,这意味着对同一个URL的请求将被发往同一个后端主机,其常用于多级缓存的场景中。然而,无论是client还hash,当其倾向于使用后端主机不可用时将会重新挑选新的后端其机。 另外还有一种称作fallback的director,用于定义备用服务器,如下所示: director b3 fallback { { .backend = www1; } { .backend = www2; } // will only be used if www1 is unhealthy. { .backend = www3; } // will only be used if both www1 and www2 // are unhealthy. } 1, # vim /etc/varnish/default.vcl probe chk { .url = "/test.html"; .window = 5; .threshold = 3; .initial = 3; .timeout = 1s; } backend static { .host = "172.16.249.99"; .port = "80"; .probe = chk; } backend app { .host = "172.16.249.69"; .port = "80"; .probe = chk; } 定义director =======定义=============================================== +++++++++++++++++++++++++++++++++++++++++++++++++++++++ +如果不是要会话保持,可以随机调度,这里也不可能会话保持。 +作为缓存服务器进行调度。粘性,会话保持这里是不理想的 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ directormys random { .retries = 3; { .backend =app; .weight = 1; } { .backend = static; .weight = 1; } } =====调用================================================== 2, if (req.url ~"\.php$"){ set req.backend = app; }else{ set req.backend =mys; } =====静态内容两台主机都可以响应,动态内容发送给app============ 只要定义了,必须要调用,否则将出现语法错误。 3, varnish> vcl.load t1 default.vcl 200 VCL compiled. varnish> vcl.use t1 200 varnish> 4, 我门把缓存关闭,让它不要在查缓存 if (req.url ~ "/test.html"){ return(pass); } 在测试
2015年06月09日
2,640 阅读
0 评论
0 点赞
2015-06-08
varnish常用变量
常用变量: 1、在任何引擎中均可使用: now, .host, .port 2、用于处理请求阶段: client.ip, server.hostname, server.ip, server.port req.request:请求方法 req.url: 请求的URL req.proto: HTTP协议版本 req.backend: 用于服务此次请求的后端主机; req.backend.healthy: 后端主机健康状态; req.http.HEADER: 引用请求报文中指定的首部; req.can_gzip:客户端是否能够接受gzip压缩格式的响应内容; req.restarts: 此请求被重启的次数; 3、varnish向backend主机发起请求前可用的变量 bereq.request: 请求方法 bereq.url: bereq.proto: bereq.http.HEADER bereq.connect_timeout: 等待与be建立连接的超时时长 4、backend主机的响应报文到达本主机(varnish)后,将其放置于cache中之前可用的变量 beresp.do_stream: 流式响应; beresp.do_gzip:是否压缩之后再存入缓存; beresp.do_gunzip: beresp.http.HEADER: beresp.proto: beresp.status:响应状态码 beresp.response:响应时的原因短语 beresp.ttl:响应对象剩余的生存时长,单位为second; beresp.backend.name: 此响应报文来源backend名称; beresp.backend.ip beresp..backend.port beresp.storage 5、缓存对象存入cache之后可用的变量 obj.proto obj.status obj.response obj.ttl obj.hits obj.http.HEADER 6、在决定对请求键做hash计算时可用的变量 req.hash 7、在为客户端准备响应报文时可用的变量 resp.proto resp.status resp.response resp.http.HEADER
2015年06月08日
2,511 阅读
0 评论
0 点赞
2015-06-07
varnish基本应用示例(一)
补充下概念拓扑 状态引擎 sub vcl_recv #vim /etc/varnish/default.vcl 启用node0 -varnish sub vcl_recv { if (req.restarts == 0) { if (req.http.x-forwarded-for) { set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip; } else { set req.http.X-Forwarded-For = client.ip; } } if (req.request != "GET" && req.request != "HEAD" && req.request != "PUT" && req.request != "POST" && req.request != "TRACE" && sub vcl_recv { if (req.restarts == 0) { if (req.http.x-forwarded-for) { set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip; } else { set req.http.X-Forwarded-For = client.ip; } } if (req.request != "GET" && req.request != "HEAD" && req.request != "PUT" && req.request != "POST" && req.request != "TRACE" && req.request != "OPTIONS" && req.request != "DELETE") { /* Non-RFC2616 or CONNECT which is weird. */ return (pipe); } if (req.request != "GET" && req.request != "HEAD") { /* We only deal with GET and HEAD by default */ return (pass); } if (req.http.Authorization || req.http.Cookie) { /* Not cacheable by default */ return (pass); } return (lookup); } return (lookup)表示下一步将交由vcl hash 一,显示客户端真实IP地址 在node3上启用。 # vim /etc/httpd/conf/httpd.conf LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent 在node0上应用 [root@[node0] varnish]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 200 ----------------------------- Varnish Cache CLI 1.0 ----------------------------- Linux,2.6.32-504.el6.x86_64,x86_64,-smalloc,-smalloc,-hcritbit varnish-3.0.6 revision 1899836 Type 'help' for command list. Type 'quit' to close CLI session. varnish> vcl.list 200 available 0 boot available 2 test1 available 0 test2 active 2 reload_2015-06-06T19:36:04 varnish> vcl.load test3 ./default.vcl 200 VCL compiled. varnish> vcl.use test3 200 varnish> vcl.list 200 available 0 boot available 2 test1 available 0 test2 available 2 reload_2015-06-06T19:36:04 active 0test3 varnish> 在浏览器上刷新,而后在node3查看客户端的真实地址。就ok了 我访问的主机ip是172.16.250.167,所以我直接过滤 # cat /var/log/httpd/access_log | grep 172.16.250.167 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)" 172.16.250.167 - - [03/Jun/2015:21:36:03 +0800] "GET /icons/poweredby.png HTTP/1.1" 304 - "http://172.16.249.99/" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)" 172.16.250.167 - - [03/Jun/2015:21:36:04 +0800] "GET / HTTP/1.1" 403 4954 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)" 172.16.250.167 - - [03/Jun/2015:21:36:04 +0800] "GET /icons/poweredby.png HTTP/1.1" 304 - "http://172.16.249.99/" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)" 172.16.250.167 - - [03/Jun/2015:21:36:04 +0800] "GET /icons/apache_pb.gif HTTP/1.1" 304 - "http://172.16.249.99/" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)" 二,错误响应 定义拒绝错误响应,这里示例为拒绝172.16.250.167 # vim /etc/varnish/default.vcl if (client.ip == "172.16.250.167"){ error 404 "see you lala!ai yaa"; } if (req.request != "GET" && req.request != "HEAD" && req.request != "PUT" && req.request != "POST" && req.request != "TRACE" && req.request != "OPTIONS" && req.request != "DELETE") { /* Non-RFC2616 or CONNECT which is weird. */ return (pipe); 更新配置 varnish> vcl.load test4 ./default.vcl 200 VCL compiled. varnish> vcl.use test4 ====================================================== [cc lang="php"] *多分支示例: * if (CONDITION1) { * ... * } elseif (CONDITION2) { * ... * } else { * ... * } * [/cc] ====================================================== vcl hash大多不需要修改 三,acl purgers 移除单个缓存对象 如果某个内容给缓存到缓存空间,在缓存失效之前,在后端服务器更新了新内容,需要手动将缓存空间缓存移除。但是缓存要么在内存中,要么在单个文件中,是不可能删除单个文件的。只能通过扮演客户端发送http请求,使用purgers方法,请求那个url,就把url对应的对象给清除。 acl purgers就是控制那些客户端可以向主机发送http purgers purge用于清理缓存中的某特定对象及其变种(variants),因此,在有着明确要修剪的缓存对象时可以使用此种方式。HTTP协议的PURGE方法可以实现purge功能,不过,其仅能用于vcl_hit和vcl_miss中,它会释放内存工作并移除指定缓存对象的所有Vary:-变种,并等待下一个针对此内容的客户端请求到达时刷新此内容。另外,其一般要与return(restart)一起使用。下面是个在VCL中配置的示例。 1,定义在引擎之外、 # vim /etc/varnish/default.vcl # appended to your code. acl purgers{ "127.0.0.1"; "172.16.0.0"/16; } sub vcl_recv { if (req.restarts == 0) { if (req.http.x-forwarded-for) { set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip; } else { set req.http.X-Forwarded-For = client.ip; } } 去掉以下两行 #if (client.ip == "172.16.250.167"){ # error 404 "see you lala!ai yaa"; # } 换成 if (req.request == "PURGE"){ if (!client.ip ~ purgers){ error 405 "Method not alloweb."; } } if (req.request != "GET" && req.request != "HEAD" && req.request != "PUT" && req.request != "POST" && req.request != "TRACE" && req.request != "OPTIONS" && 添加一行 req.request != "DELETE"&& req.request != "PURGE" ) { #这里必须定义,否则purge送达不到 /* Non-RFC2616 or CONNECT which is weird. */ return (pipe); } #这行也需要更改 if (req.request != "GET" && req.request != "HEAD") { /* We only deal with GET and HEAD by default */ return (pass); } 改为 if (req.request != "GET" && req.request != "HEAD" && req.request != "PURGE"){ /* We only deal with GET and HEAD by default */ return (pass); } if (req.http.Authorization || req.http.Cookie) { /* Not cacheable by default */ return (pass); } -- INSERT -- ***************如果报这样的内容就是没有定义purgers方法*********** [root@[node0] ~]# curl -I -X PURGE http://172.16.249.108 HTTP/1.1 501 Method Not Implemented Date: Sat, 06 Jun 2015 15:26:47 GMT Server: Apache/2.2.15 (CentOS) Allow: GET,HEAD,POST,OPTIONS,TRACE Content-Length: 297 Connection: close Content-Type: text/html; charset=iso-8859-1 2,而后定义purgers # vim /etc/varnish/default.vcl sub vcl_pass { if (req.request == "PURGE"){ error 502 "Purged on a passed object." } return (pass); } # # sub vcl_hash { # hash_data(req.url); # if (req.http.host) { # hash_data(req.http.host); # } else { # hash_data(server.ip); # } # return (hash); # } # sub vcl_hit { if (req.request == "PURGE"){ purge; error 200 "Purged."; } return (deliver); } sub vcl_miss { if (req.request == "PURGE"){ purge; error 404 "Purged Not in cache."; } return (fetch); } 3,定义完成,load varnish> vcl.load test6 ./default.vcl 200 VCL compiled. varnish>vcl.use test6 4,开始移除这个小蝌蚪,太坚强了。。。。 在进行请求 [root@[node0] ~]# curl -I http://172.16.249.108/index.html HTTP/1.1 200 OK Server: Apache/2.2.15 (CentOS) Last-Modified: Sat, 06 Jun 2015 06:43:21 GMT ETag: "20102-f-517d3b980dbfa" Content-Type: text/html; charset=UTF-8 Content-Length: 15 Accept-Ranges: bytes Date: Sat, 06 Jun 2015 15:43:08 GMT X-Varnish: 476000667 Age: 0 Via: 1.1 varnish Connection: keep-alive X-Cache: MISS 第一次miss [root@[node0] ~]# curl -I http://172.16.249.108/index.html HTTP/1.1 200 OK Server: Apache/2.2.15 (CentOS) Last-Modified: Sat, 06 Jun 2015 06:43:21 GMT ETag: "20102-f-517d3b980dbfa" Content-Type: text/html; charset=UTF-8 Content-Length: 15 Accept-Ranges: bytes Date: Sat, 06 Jun 2015 15:43:11 GMT X-Varnish: 476000668 476000667 Age: 2 Via: 1.1 varnish Connection: keep-alive X-Cache: HIT #第二次请求为hit,同时产生缓存,在继续请求仍然为HIT 我们手动指定清理 [root@[node0] ~]#curl -I -X PURGE http://172.16.249.108/index.html HTTP/1.1 200 Purged. Server: Varnish Content-Type: text/html; charset=utf-8 Retry-After: 5 Content-Length: 382 Accept-Ranges: bytes Date: Sat, 06 Jun 2015 15:59:45 GMT X-Varnish: 476000701 Age: 0 Via: 1.1 varnish Connection: close X-Cache: MISS 在来请求,就MISS了,现在就达到了手动清理单挑缓存的目的 [root@[node0] ~]# curl -I http://172.16.249.108/index.html HTTP/1.1 200 OK Server: Apache/2.2.15 (CentOS) Last-Modified: Sat, 06 Jun 2015 06:43:21 GMT ETag: "20102-f-517d3b980dbfa" Content-Type: text/html; charset=UTF-8 Content-Length: 15 Accept-Ranges: bytes Date: Sat, 06 Jun 2015 16:00:18 GMT X-Varnish: 476000702 Age: 0 Via: 1.1 varnish Connection: keep-alive X-Cache: MISS 第一次为MISS,第二次建立缓存则HIT 在完整的粘贴一次配置文件 VCL中配置的示例。 [cc lang="php"] acl purgers { "127.0.0.1"; "172.16.0.0"/16; } sub vcl_recv { if (req.request == "PURGE") { if (!client.ip ~ purgers) { error 405 "Method not allowed"; } return (lookup); } } sub vcl_hit { if (req.request == "PURGE") { purge; error 200 "Purged"; } } sub vcl_miss { if (req.request == "PURGE") { purge; error 404 "Not in cache"; } } sub vcl_pass { if (req.request == "PURGE") { error 502 "PURGE on a passed object"; } } [/cc] 客户端在发起HTTP请求时,只需要为所请求的URL使用PURGE方法即可,其命令使用方式如下: # curl -I -X PURGE http://varniship/path/to/someurl 启用默认vcl_recv默认配置时使用的方式: [cc lang="php"] sub vcl_recv { if (req.restarts == 0) { if (req.http.x-forwarded-for) { set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip; } else { set req.http.X-Forwarded-For = client.ip; } } if (req.request == "PURGE" ) { if (!client.ip ~ purgers) { error 405 "Method not allowed."; } } if (req.request != "GET" && req.request != "HEAD" && req.request != "PUT" && req.request != "POST" && req.request != "TRACE" && req.request != "OPTIONS" && req.request != "DELETE" && req.request != "PURGE" ) { /* Non-RFC2616 or CONNECT which is weird. */ return (pipe); } if (req.request != "GET" && req.request != "HEAD" && req.request != "PURGE") { /* We only deal with GET and HEAD by default */ return (pass); } if (req.http.Authorization || req.http.Cookie) { /* Not cacheable by default */ return (pass); } return (lookup); } [/cc]
2015年06月07日
2,881 阅读
0 评论
0 点赞
2015-06-06
varnish配置示例,概念安装篇
varnish: www.varnish-cache.org varnish是一款开源应用程序,高性能且开源的反向代理服务器,同时也是http加速器,采用较新的开发技术和体系结构,较为现代的硬件体系紧密结合,于传统squid相比,varnish性能更高,速度更快,管理更方便等一系列优点。目前大多大型网站已经用varnish来替换squid。 varnsh只要有两个进程,management和child/cache。 1,management主要实现应用新的配置,编译vcl,监控varnsh众多子进程,初始化varnsh,并且提供命令行commadn line进程。commadn line由多线程组成。 2,varnsh每隔几秒钟就会探测cache进程,来判断是否正常。如果cache较长时间内没有回应management探测,management将会重启相应的cache进程。一旦cache无法响应management,management将会将cache唤醒,这种唤醒一般重启cache。 cache/chuld,有多类线程 Acceptor:接收新的链接请求 worker:主要负责为每个会话启动worker线程,用于处理并响应用户请求。 Expiry:从缓存中清理过期的cache varnsh依赖于工作区, varnsh的配置文件是由vcl编写,由c编译器编译成varnsh能够加载的格式,由management分析并加载新的配置,配置生效由management指挥各cache/child实现。 varnsh接口: cli interface :密码认证 telnet interface:已经被废 web interface:基于gui界面管理,but,这是收费的。 日志文件log file: 对varnsh而言,为了实现较高性能,对日志是保存在一个共享内存空间之中的。一旦这个内存空间用完,将会从头开始存储。最多保持最近最新的日志,如果希望长久保存只能将日志导出保存到其他空间。默认情况是保存在内存空间的,不但包含了谁放我的varnsh,还包括访问时命中与否,命中率多高,分析客户端请求首部,记录varnsh响应响应首部等等,通过记录日志可以了解很多varnsh的信息。 日志:Shared Memory Log Shared可以通过文件系统进程访问的共享内存日志,因此某进程如果需要记录信息,只需持有一个锁向内存发数据即可。这种类型使得每个进程在记录日志时都使用了自己的日志缓存。 共享内存内存日志大小一般为90mb,分别两部分组成,前部分为计数器,后部分为客户端请求数据。 Varnish Configuration Language 1,vlc配置是由vcl来实现。这个配置是配置varnsh的缓存策略,并不是varnsh进程的。如果是启动varnsh自己监听端口,Ip,以及最多启动多少个工作线程等,则是在启动varnsh进程同时使用命令行参数指定的;它没有专属的配置文件。 2,基于“域'的编程语言,代码写在{}中生效,这个"域"在一定程度上讲指的是vcl的状态引擎。 varnsh工作机制:在vcl中用于让管理员定义缓存策略,而定义好的策略由management进行分析,转换成c语言代码,c编译器编译成二进制程序并连接至chache程序。 varnsh工作时有多种状态。 state engine: vcl_recv:vcl内部有几个状态,可以理解为处理流程步骤,在这些状态所加vcl定义的策略完成缓存的处理机制,因此所有的缓存配置都是在引擎上实现的。vcl配置的缓存策略在此些state engine发挥作用;vcl也称为域专用,它写的配置必须要指明用在那些或那个状态引擎上。 当recv在处理一个http引擎的时候,需要获取这个请求中的各种信息,比如url,请求方法等。请求结束后作出第一个决策,是否查缓存,这个决策的实施在决策完成以后。而这个位置就是vcl_recv。 如果没有定义vcl_recv,系统有默认vcl_recv。系统会执行默认的vcl_recv state engine之间有相关性,上级engine通过return指明下级engine; vcl的配置语法: 1) //, #, /*comment*/用于注释; (2) sub $NAME 用于定义函数; (3) 不支持循环; (4) 有众多内置变量; (5) 支持终止语句,没有返回值; (6) “域”专用语言; (7) 操作符: =, ==, ~, !, &&, || state engine之间有相关性,上级engine通过return指明下级engine; vcl_recv 终止语句 vcl_pipe 管道 vcl_pass 不要查缓存 vcl_hash 查缓存 vcl_hit 命中 vcl_miss 未命中 vcl_fetch 命中后投递 vcl_delier 命中后投递 vcl_error 查询缓存未命中工作流 查询缓存命中工作流 安装包下载: www.varnish-cache.org/redhat/varnish-3.0/el6/x86_64/varnsh/ varnish,varnish-docs,varnish-libs varnish-devel开发包,可以不用下载 1,安装 三个包依赖于gcc #yum -y install gcc #rpm -ivh varnish-libs-3.0.6-1.el6.x86_64.rpm varnish-3.0.6-1.el6.x86_64.rpm varnish-docs-3.0.6-1.el6.x86_64.rpm PS: #rpm -ql varnish 用于实现从varnish共享内存中去读取日志,并持久保存在文件中的一种脚本 /etc/rc.d/init.d/varnishlog /etc/rc.d/init.d/varnishncsa 配置缓存策略文件 /etc/varnish/default.vcl 命令行工具 /usr/bin/varnish_reload_vcl是为/etc/rc.d/init.d/varnish脚本配置以实现启动varnishd的时候传递命令行参数,来决定varnish工作特性 /usr/bin/varnishadm /usr/bin/varnishhist /usr/bin/varnishlog /usr/bin/varnishncsa /usr/bin/varnishreplay /usr/bin/varnishsizes /usr/bin/varnishstat /usr/bin/varnishtest /usr/bin/varnishtop /usr/sbin/varnishd 主程序 状态数据 /var/lib/varnish /var/log/varnish #export LANG=en #man varnishd -a 监听端口,默认监听6081 -b 指明后端主机 -c 显示vcl编辑代码转换c语言 -d 打开bug模式 -f 指明配置文件 -h 指明hash算法 -l 指明共享内存日志大小 -P pid文件 -p 众多参数 -s 指定存储客户端 |||||||| -s |||||||| Hash Algorithms varnish支持后端缓存存储机制: -s type malloc[,size] file[,path[,size[,granularity]]],文件类型,大小,力度 persistent,path,size, persistent:即便使用file,一旦缓存重启,所有缓存对象统统清空,而persistent不会被清楚。不过persistent在生成环境表现不太友好。 如果一旦缓存服务器重启,缓存将被清空,需要重新建立缓存;对于缓存而言,预热(将热点数据缓存)缓存,可能需要几分钟。缓存服务器一旦预热完毕,不宜随意上下线更换缓存服务器;一旦缓存崩溃,可能会造成雪崩。 -T 提供一个管理接口。默认6082 脚本文件详解 #vim /etc/sysconfig/varnish NFILES=131072 打开文件最大数 MEMLOCK=82000 锁定内存空间 NPROCS="unlimited" 最多单个用户运行的进程树 # Maximum size of corefile (for ulimit -c). Default in Fedora is 0 # DAEMON_COREFILE_LIMIT="unlimited" # Set this to 1 to make init script reload try to switch vcl without restart. # To make this work, you need to set the following variables # explicit: VARNISH_VCL_CONF, VARNISH_ADMIN_LISTEN_ADDRESS, # VARNISH_ADMIN_LISTEN_PORT, VARNISH_SECRET_FILE, or in short, # use Alternative 3, Advanced configuration, below RELOAD_VCL=1 会不会自己自动装载缓存策略配置文件 # This file contains 4 alternatives, please use only one. ## Alternative 1, Minimal configuration, no VCL # # Listen on port 6081, administration on localhost:6082, and forward to # content server on localhost:8080. Use a fixed-size cache file. # #DAEMON_OPTS="-a :6081 \ # -T localhost:6082 \ # -b localhost:8080 \ # -u varnish -g varnish \ # -s file,/var/lib/varnish/varnish_storage.bin,1G" ## Alternative 2, Configuration with VCL # # Listen on port 6081, administration on localhost:6082, and forward to # one content server selected by the vcl file, based on the request. Use a # fixed-size cache file. # #DAEMON_OPTS="-a :6081 \ # -T localhost:6082 \ # -f /etc/varnish/default.vcl \ # -S /etc/varnish/secret \ # -s file,/var/lib/varnish/varnish_storage.bin,1G" VARNISH_VCL_CONF=/etc/varnish/default.vcl 默认读取缓存策略配置文件 VARNISH_LISTEN_PORT=80 默认监听端口 # VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1 指的是cli interface接口 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_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin 缓存数据路径 # VARNISH_STORAGE_SIZE=1G 缓存大小 # 【】VARNISH_STORAGE_SHM=64M 缓存一般不应该太大,缓存大小取决于硬盘的I/O能力 VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}" 存储类型 # 【】VARNISH_STORAGE="malloc,${VARNISH_STORAGE_SHM}" 使用内存缓存 VARNISH_TTL=120 # # # DAEMON_OPTS is used by the init script. If you add or remove options, make # # sure you update this section, too. 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}" # ## Alternative 4, Do It Yourself. See varnishd(1) for more information. # # DAEMON_OPTS="" 2,启动 2.1编辑脚本文件 #vim /etc/sysconfig/varnish VARNISH_STORAGE_SHM=64M 缓存一般不应该太大,缓存大小取决于硬盘的I/O能力 VARNISH_STORAGE="malloc,${VARNISH_STORAGE_SHM}" 使用内存缓存 VARNISH_LISTEN_PORT=80 修改默认监听端口为80 #service varnish start # ss -tnlp |grep :6082 LISTEN 0 10 127.0.0.1:6082 *:* users:(("varnishd",1830,6)) # ss -tnlp |grep :80 LISTEN 0 128 :::80 :::* users:(("varnishd",1832,8)) LISTEN 0 128 *:80 *:* users:(("varnishd",1832,7)) # 3,配置node2后端主机node2 #yum -y install http #vim /var/www/html/index.html node2 4,编辑node0 # vim /etc/varnish/default.vcl backend default { .host = "172.16.249.69"; 修改为后端主机ip .port = "80"; 在通过浏览器访问完全可以访问到node2的。 二:通过varnishadm管理 1,链接varnishadm # varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 200 ----------------------------- Varnish Cache CLI 1.0 ----------------------------- Linux,2.6.32-504.el6.x86_64,x86_64,-smalloc,-smalloc,-hcritbit varnish-3.0.6 revision 1899836 Type 'help' for command list. Type 'quit' to close CLI session. varnish>help 200 help [command] ping [timestamp] auth response 做认证的 quit 退出 banner banner信息显示 status 状态信息显示 start 启动子进程 stop 停止子进程 vcl.load 装载 vcl.inline 使用 vcl.use 使用 vcl.discard 删除 vcl.list 显示 vcl.show 显示vcl内部信息 vcl.show boot param.show [-l] [] param.set panic.show panic.clear storage.list backend.list backend.set_health matcher state ban.url ban [&& ]... 演示: 打开node3主机,配置node0从node2切换至node3 node3已经配置好http 配置后端node0 1,node1打开 # vim /etc/varnish/default.vcl backend default { .host = "172.16.249.99"; .port = "80"; } 这里改了之后是不会立即生效的 2, # varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 varnish> vcl.list 200 active 2 boot varnish>vcl.load test1 default.vcl 装载一个命令为test1,文件为default.vcl 200 VCL compiled. varnish>vcl.list test1已经装载编译完毕 200 active 2 boot available 0 test1 varnish> vcl.use test1 配置使用test1 200 varnish> vcl.list 在查看,已经激活 200 available 2 boot active 0 test1 varnish> vcl.show test1 show test1,host的ip地址已经启用 200 # This is a basic VCL configuration file for varnish. See the vcl(7) # man page for details on VCL syntax and semantics. # # Default backend definition. Set this to point to your content # server. # backend default { .host = "172.16.249.99";这里已经启用 .port = "80"; } 指明缓存命中机制,添加响应首部。 1,还是在node0上配置配置文件 # vim /etc/varnish/default.vcl 找到sub vcl_deliver修改 sub vcl_deliver { if (obj.hits>0){ set resp.http.X-Cache = "HIT"; } else { set resp.http.X-Cache = "MISS"; } return (deliver); } 2, varnish> vcl.load test2 default.vcl varnish> vcl.use test2 varnish> vcl.list 在打开浏览器查看
2015年06月06日
4,290 阅读
2 评论
0 点赞