Varnish缓存服务器
# yum install varnish
# rpm -ql varnish
/etc/varnish/default.vcl
/etc/varnish/varnish.params \\ 进程配置文件 命令行选项
/etc/varnish/secret \\ 进入varnishadm 的密码文件
# cd /etc/varnish
# vim varnish.params \\ 主配置文件
VARNISH_LISTEN_PORT=80 \\ 默认6081端口为监听端口 如果后端为http服务需要改成80
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1 \\ 不允许远程连接 如需要远程连接 更改此地址
VARNISH_ADMIN_LISTEN_PORT=6082 \\ 6082为 varnishadm命令行的端口
VARNISH_TTL=120 \\ 连接后端服务器超时时间
VARNISH_STORAGE="malloc,256M" \\ 可修改缓存的模式 详情看注解
# vim default.vcl \\ Vcl语言 命令行配置文件
backend default {
.host = "192.168.10.10";
.port = "80";
}
# systemctl restart varnish
# ss -tnl \\ 80 和 6082端口被监听
# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 \\ -S 指明密码文件 -T 指明连接地址 直接使用varnishadm也可以进入
help \\ 获取命令列表
ping \\ 探测后端服务器是否在线
status \\ 服务器本身状态
start \\ 启动 子进程的
stop \\ 停止 子进程的
vcl.list \\ 列出所有可用的vcl文件
active 0 boot \\ boot为启动时加载的 编号为0 当前为active活动状态
vcl.load test default.vcl \\ 装载vcl文件 可使用vcl.list 查看
后端Web服务器 可建立两台配置一样
# yum install httpd
# for i in {1..10}; do echo "Page $i on Web1" > /var/www/html/test$i.html; done \\ 建立十个测试页面
# mkdir /var/www/html/admin \\ 建立admin 测试目录
# echo "admin for 192.168.10.10" > /var/www/html/admin/index.html \\ 建立测试文件 为实例2准备
# systemctl restart httpd
实例1 在客户端添加varnish状态 查看本次请求是否为缓存 \\ 以下实例只做了一遍 是不太熟悉
# cd /etc/varnish/
# cp default.vcl test.vcl
# vim test.vcl \\ 可替换vcl_recv{}和sub vcl_deliver{}的内容
sub vcl_recv { \\ 被调用的时机 当一个请求接收完成,并且被解析之后 或重启之后 触发
if (req.method == "PRI") {
/* We do not support SPDY or HTTP/2.0 */
return (synth(405));
}
if (req.method != "GET" &&
req.method != "HEAD" &&
req.method != "PUT" &&
req.method != "POST" &&
req.method != "TRACE" &&
req.method != "OPTIONS" &&
req.method != "DELETE") {
/* Non-RFC2616 or CONNECT which is weird. */
return (pipe);
}
if (req.method != "GET" && req.method != "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 (hash);
}
sub vcl_deliver { \\ 发送对象给客户端前调用
if (obj.hits>0) { \\ obj.hits是varnish自带的值 hits是变量 表示是不是从缓存取得的 不是为0 取了一次加 1
set resp.http.X-Cache = "HIT"; \\ 如果大于0说明从缓存取得的 返回命中
} \\ 设置 resp响应报文的http首部加一个自定义首部X-Cache的值为 HIT
else {
set resp.http.X-Cache = "MISS"; \\ 设置 resp响应报文的http首部加一个自定义首部X-Cache的值为 MISS
}
}
# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 \\ 进入Vcl语言编辑
vcl.load test1 test.vcl \\ 创建vcl test1 使用test.vcl为模板进行加载
vcl.list \\ 显示所有的vcl active为正在使用的 available为可用的
vcl.use test1 \\ 使用 test1 使成为active
vcl.show test1 \\ 查看test1的内容 Ctrl+c 退出
# curl -I http://192.168.10.15/test1.html \\ 只请求 首部信息
实例2 强制对某资源的请求 不检查缓存 为查看效果可以在实例1基础上去做
# cd /etc/varnish/
# cp default.vcl test.vcl
# vim test.vcl \\ 修改配置文件
sub vcl_recv { \\ 在vcl_recv中添加 实例2.1
if (req.url ~ "^/test7.html$") { \\ ~为请求的资源的url能够被指定的模式所匹配 此资源是以tesh7.html开头和结尾
return(pass); \\ 不让去查缓存 略过缓存
} \\ 实例2.2 还有两个后台一个是以/admin开头的 一个是/login用户登录的不允许查缓存
if (req.url ~ "(?i)^/login" || req.url ~ "(?i)^/admin") { \\ (?i)在字符配置时候不区分大小写 || 或者 以/loginx开头的
return(pass);
}
}
# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 \\ 进入Vcl语言编辑
vcl.load test2 test.vcl
vcl.list
vcl.use test2
# curl -I http://192.168.10.15/test7.html \\ 在实例1的基础上 可以看到测试效果
# curl -I http://192.168.10.15/admin/index.html
实例3 对特定类型的资源取消其私有的cookie标识 \\ 感觉没什么大用
# cd /etc/varnish/
# cp default.vcl test.vcl
# vim test.vcl \\ 修改配置文件
sub vcl_backend_response { \\ 当成功从后端服务器获取到 response headers 时,调用
if (beresp.http.cache-control !~ "s-maxage") { \\ 服务器端响应的cache-control这个首部 此值对应的没有s-maxage这个首部
if (bereq.url ~ "(?i).jpg$") { \\ 所请求的url 不区分大小写以.jpg结尾的
set beresp.ttl = 3600s; \\ 强制缓存1小时 在varnish的缓存时长
unset beresp.http.Set-Cookie; \\ 把set-cookie强制取消
}
if (bereq.url ~ "(?i).css$") {
set beresp.ttl = 600s;
unset beresp.http.Set-Cookie;
}
}
}
实例4 不同资源发给不同的主机 实现动静分离
# cd /etc/varnish/
# cp default.vcl test.vcl
# vim test.vcl \\ 修改配置文件
backend webserver1 { \\ 定义了backend 必须要调用
.host = "192.168.10.10";
.port = "80";
.probe = { \\ 是否对后端服务器做健康状态检测
.url = "/test1.html"; \\ 通过获取哪个一个url当做健康状态检测还有
} \\ 还可以使用request expected_response timeout interval等
}
backend webserver2 {
.host = "192.168.10.12";
.port = "80";
.probe = {
.url = "/test1.html";
}
}
sub vcl_recv {
if (req.url ~ "(?i).(jpg|png|gif)$") { \\ 如果是图片发给第一个服务器 ~做匹配 (?i)不区分大小写 .转移符 |或者 $末尾牟定
set req.backend_hint = webserver1; \\ 在此调用
} else {
set req.backend_hint = webserver2;
}
}
# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 \\ 进入Vcl语言编辑
vcl.load test5 test.vcl
vcl.list
vcl.use test5
实例5 为2个后端服务器做负载均衡 不是对单个资源多次请求做轮询 而是对多个不同资源做轮询
# vim test.vcl \\ 在上一实验基础上去做
# cd /etc/varnish/
# cp default.vcl test.vcl
# vim test.vcl \\ 修改配置文件
backend webserver1 { \\ 定义了backend 必须要调用
.host = "192.168.10.10";
.port = "80";
.probe = { \\ 是否对后端服务器做健康状态检测
.url = "/test1.html"; \\ 通过获取哪个一个url当做健康状态检测还有
} \\ 还可以使用request expected_response timeout interval等
}
backend webserver2 {
.host = "192.168.10.12";
.port = "80";
.probe = {
.url = "/test1.html";
}
}
import directors; \\ 引入directors模块 才能使用
sub vcl_init {
new mycluster = directors.round_robin(); \\ 定义一个集群new名字 = 算法
\\ 负载均衡算法 round_robin轮询 random fallback hash原地址哈希
mycluster.add_backend(webserver1); \\ 集群之中第一个节点
mycluster.add_backend(webserver2); \\ 第二个节点
}
sub vcl_recv { \\ 被调用的时机 当一个请求接收完成,并且被解析之后 或重启之后 触发
set req.backend_hint = mycluster.backend(); \\ 调用自定义mycluster集群
}
# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 \\ 进入Vcl语言编辑
vcl.load test6 test.vcl
vcl.list
vcl.use test6
注:
1 三种缓存的模式
file 单个文件 不支持持久机制 重启服务就会都没有了 不能随便重启
malloc 内存 不建议太大空间
persistent 基于文件的持久存储
2 官方网站https://www.varnish-cache.org
比较好的文章 https://www.jianshu.com/p/1d4918cc58e8
3 varnish squid 缓存服务器 缓存首先要是 反向代理
CDN公司 网速 蓝迅 帝联 CDN是缓存网络
能力的三个核心 知识 技能 才干
4 Vcl简介
Varnish配置语言VCL是一种“域”专有类型的配置语言,用于描述Varnish Cache的请求处理和文档高速缓存策略.
当加载新配置时,Manager进程会创建VCC进程,然后将VCL代码转换为C代码,C代码被gcc编译成共享对象,
然后共享对象被加载到cacher进程中.
VCL有多个状态引擎(state engine),状态之间存在相关性,但状态引擎彼此间互相隔离.
每个状态引擎可使用return(x)指明关联至哪个下一级引擎,每个状态引擎对应于vcl文件中的一个配置段,即为subroutine.