一: HTTP相关内容
- 常见 HTTP 状态码
200:成功
206:请求体太大,分段请求
301:永久重定向
302:暂时重定向
304:浏览器缓存文件内容没发生改变,可以继续使用
403:网站服务器没有权限读取该请求内容
404:请求页面找不到
405:禁用的请求方法
5XX:服务器内部发生错误
- HTTP 头部信息
通用
Connection:close|keep-alive
Date:日期时间
Host:请求的主机
paragma:no-cache
Via:请求或响应消息,在客户端和服务器端之间所经过的代理
Transfer-Encoding:消息主机的传输编码方式,chunked表示采用块编码的方式
请求
If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它
If-None-Match
Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面
User-Agent:客户端浏览器类型
Host:请求的主机
Accept-Encoding:接受的编码方式
Accept-Language:接受的自然语言
Accept-Charest:接受字符集
Authorization:服务器发送www-authenticat时,客户通过此首部提供认证信息
响应
Etag:内容的标签
Location:重定向后的新位置
Server:服务器软件信息
WWW-Authenticate:要求对客户端进行认证
实体
Content-Encoding
Content-Language
Content-Length:实体大小
Content-Type:内容的MIME格式
Expires:应该在什么时候认为文档已经过期,从而不再缓存它
Last-Modified:文档最后改动时间
- 缓存处理的具体步骤
接受请求
解析请求(代理的功能)
查询缓存(检查本地缓存中是否存在对方请求的内容的副本)
副本的新鲜度检测(检查本地缓存的副本是否为最新版本)
构建响应(代理的功能)
发送响应
记录日志
二: varinsh
-
varinsh 程序架构
Management 进程:编译VCL并应用新配置、监控varnish、初始化varnish,并提供一个CLI。
Child/Cache 线程:
Acceptor:接收新的连接请求;
Worker:用于处理并响应用户请求;
Expiry:从缓存中清理过期cache object
日志进程:Shared Memory Log, 共享内存内存日志大小一般90MB;分为两部分:前一部分为计数器、后一部分为客户请求相关的数据。
varnish提供了多个不同的工具如varnishlog、varnishncsa或varnishstat等来分析共享内存日志中的信息并能够以指定的方式进行显示
- Vcl内置函数和处理流程(状态引擎)
vcl内置函数:
vcl_recv:用于接受和处理请求。当请求到达并成功接收后被调用,通过判断请求的数据来决定如何处理请求。例如如何响应、怎么响应、使用哪个后端服务器等。
vcl_fetch(vcl_backend_response):根据服务器端的响应作出缓存决策,如判断获取的内容来决定是将内容放入缓存,还是直接返回给客户端。
vcl_pipe:对于无法理解的用户请求,将请求直接发往后端主机;
vcl_hash:自定义hash生成时的数据来源
vcl_pass:用于将请求直接传递至后端主机,后端主机在应答数据后将应答数据发送给客户端,但不进行任何缓存。
vcl_hit:从缓存中查找到缓存对象时要执行的操作;
vcl_miss:从缓存中查找不到缓存对象时要执行的操作;
vcl_deliver:将用户请求的内容响应给客户端时用到的方法;
vcl_error:在varnish端合成错误响应而时;
vcl配置语法:
(1) //, #, /*comment*/用于注释;
(2) sub $NAME 用于定义函数;
(3) 不支持循环;
(4) 有众多内置变量;
(5) 支持终止语句,没有返回值;
(6) “域”专用语言;
(7) 操作符: =, ==, ~, !, &&, ||
vcl状态转换图
- varnish4 安装
https://varnish-cache.org/releases/install_redhat.html#install-redhat #CentOS 安装方法地址
varnish4安装:
curl -s https://packagecloud.io/install/repositories/varnishcache/varnish41/script.rpm.sh | sudo bash
yum -y install varnish
- varnish4 规则配置示例
vcl 4.0;
#允许清除缓存的IP地址
import std;
import directors;
acl purgers {
"127.0.0.1";
"192.168.71.0"/24;
}
probe healthcheck {
.url = "/index.html";
.interval = 3s;
.timeout = 1s;
.window = 5;
.threshold = 3;
}
#后端服务器1
backend web1 {
.host = "192.168.48.31";
.port = "80";
.probe = healthcheck;
}
#后端服务器2
#backend web2 {
# .host = "192.168.48.32";
# .port = "80";
# .probe = healthcheck;
#}
sub vcl_init {
new vdir = directors.round_robin();
vdir.add_backend(web1);
#vdir.add_backend(web2);
return (ok);
}
sub vcl_recv {
#添加原来请求的地址到X-Forwarded-For
#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;
#}
#不在acl列表内的IP不允许清除缓存
if (req.method == "PURGE") {
if (!client.ip ~ purgers) {
return(synth(405,"Method not allowed!"));
}
return(purge);
}
if (req.url ~ "^[^?]*\.(7z|avi|bmp|bz2|css|csv|doc|docx|eot|flac|flv|gif|gz|ico|jpeg|jpg|js|less|mka|mkv|mov|mp3|mp4|mpeg|mpg|odt|otf|ogg|ogm|opus|pdf|png|ppt|pptx|rar|rtf|svg|svgz|swf|tar|tbz|tgz|ttf|txt|txz|wav|webm|webp|woff|woff2|xls|xlsx|xml|xz|zip)(\?.*)?$") {
unset req.http.cookie;
}
#不缓存about.html页面
if (req.url ~ "^[^?]*\.php(\?.*)?$") {
return(pass);
}
}
sub vcl_hash {
#set req.hash = req.url;
# if (req.http.Accept-Encoding ~ "gzip") {
# set req.hash += "gzip"
# }
# return (hash);
}
sub vcl_purge {
return (synth(200, "Purged"));
}
sub vcl_backend_response {
#不同的文件类型设置不同时长度缓存时间
if (bereq.url ~ "\.(jpg|jpeg|gif|png|css|js|)$") {
set beresp.ttl = 86400s;
}
if (bereq.url ~ "\.(html|htm)$") {
set beresp.ttl = 300s;
}
if (bereq.url ~ "^[^?]*\.(7z|avi|bmp|bz2|css|csv|doc|docx|eot|flac|flv|gif|gz|ico|jpeg|jpg|js|less|mka|mkv|mov|mp3|mp4|mpeg|mpg|odt|otf|ogg|ogm|opus|pdf|png|ppt|pptx|rar|rtf|svg|svgz|swf|tar|tbz|tgz|ttf|txt|txz|wav|webm|webp|woff|woff2|xls|xlsx|xml|xz|zip)(\?.*)?$") {
#set beresp.do_gzip = false;
unset bereq.http.cookie;
}
}
sub vcl_deliver {
#添加缓存命中显示
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from " + server.ip;
} else {
set resp.http.X-Cache = "MISS";
}
}
- 测试结果
实验环境:
varnish 服务器IP:192.168.71.11;192.168.48.133
web1:192.168.48.31
web2:192.168.48.32
第一次请求
第二次请求