一:http再闲聊
一:http闲扯
1跨主机直接通讯,分布式存储等,现在互联网上层之间的应用都是在基于http协议之上的,所以深入的理解http协议.对于上层之间的熟练运用是至关重要的.
现在智能手机与互联网技术的充分融合,使得我们的生活越来越依赖于手机.手机已成为我们身体之外的另一个器官.手机在带给我们便利的同时.也在无尽的损耗着我们的碎片化时间.花费在手机上的时间日渐增多,但对于生活的增益却无甚寥寥.
增益,首先是在思维上对一个事物有深刻的见解,需要花费心力、脑力持续不断的试探、执行、重复、改进。
2写日记的另一个目的在于:有迹可循。
3大道理少讲。一件事情如何做成的,心态如何改变的。
等等此类事宜。在发生改变之后,后续最好可以整理出相应的改变执法1234。
二:动态静态
用户请求web资源在服务器层面一般分为两块:
1:动态内容服务器:js css php jsp
php jsp 在后台为动态内容
js css 在服务器端 是静态内容,但偶尔需要作出相应修改
2:静态内容服务器:存放 jpg png jif 等图片文件
三:动态内容服务器:
分为 前端数据和后端数据
前端数据:js css 网页布局 展示 交互式设计
wordpress属于前端展示工具,在服务器端存储的数据格式一般为 js css
php。
用户访问一个网页所看到的界面一般由js css 数据来提供。
后端数据:PHP jsp 数据处理的业务端程序,负责被调用后生成数据
四:程序
指令+数据
指令:存放在程序文件中
数据:变量和属组,通过i/o加载数据
数据一般存放在 文件系统中或者 数据库之中
五:缓存
经常被访问的数据,存放在用户较近的位置。进而减少用户的I/O请求跳转,使得用户可以快速的获取所需要的数据。
缓存不处理用户的请求,仅仅是把用户经常访问的数据,在本地存放下来,随后当用户再次访问时,把数据推送给用户。
公共缓存:CDN Content Delivery NetWork
六:缓存工具:
squid:http1.0时代使用
varnish:http2.0时代。拥有更好的性能
首先是代理,其次是缓存。
varnish最强大的是缓存,其次是代理
Nginx:最强大的是代理,其次是缓存。
七:http缓存是如何工作的
缓存机制
过期机制: 依据缓存中定义的过期时间
文件过期之前,从缓存处响应客户端
文件过期之后,从后台服务器响应客户端
条件式请求:访问缓存时,查看服务器与缓存内容有无改变
查看缓存内容有无改变的两种
1文件的修改时间
2文件的校验码
请求流程:每一次请求,缓存服务器都要向后端服务器发请求,查看缓存中的数
据有无变化,无变化时,从缓存处响应。有变化时从后端响应
二者的结合: 请求时,时间未过期,从缓存处响应。 过期时,想后端服务器发送请求,看文件有无变化,决定响应的方式。
八:缓存中的请求报文 响应报文
请求报文用于通知缓存服务如何使用缓存响应请求:
cache-request-directive =
"no-cache", 不可用缓存中的数据响应客户端
| "no-store"
| "max-age" "=" delta-seconds 最大可缓存的时间
| "max-stale" [ "=" delta-seconds ]
| "min-fresh" "=" delta-seconds
| "no-transform"
| "only-if-cached"
| cache-extension
响应报文用于通知缓存服务器如何存储上级服务器响应的内容:
cache-response-directive =
"public" 仅可用于公共缓存
| "private" [ "=" <"> 1#field-name <"> ]
| "no-cache" [ "=" <"> 1#field-name <"> ],可缓存,但响应给客户端之前需要revalidation,即必须发出条件式请求进行缓存有效性验正;
| "no-store" ,不允许存储响应内容于缓存中;
| "no-transform"
| "must-revalidate"
| "proxy-revalidate"
| "max-age" "=" delta-seconds
| "s-maxage" "=" delta-seconds
| cache-extension
九:缓存命中率
缓存命中率:hit/(hit+miss)
页面命中率:基于页面数量进行衡量
字节命中率:基于页面的体积进行衡量
十:开源解决方案
squid:
varnish:
varnish官方站点: http://www.varnish-cache.org/
Community :社区版
Enterprise :企业版
二:Varnish
一:程序架构
程序架构:
Manager进程
Cacher进程,包含多种类型的线程:
accept, worker, expiry, ...
shared memory log:
日志存放于内存中,重启后日志数据及缓存都将丢失
统计数据:计数器;
日志区域:日志记录;
查看日志的命令
varnishlog, varnishncsa, varnishstat...
配置接口:VCL
Varnish Configuration Language,
vcl complier --> c complier --> shared object
二:varnish安装
yum install varnish
varnish位于epl仓库 中
三:varnish的程序环境:
/etc/varnish/varnish.params: 配置varnish服务进程的工作特性,例如监听的地址和端口,缓存机制, 使用多大的缓存,启用多少个线程;
/etc/varnish/default.vcl:配置各Child/Cache线程的缓存策略;
主程序:
/usr/sbin/varnishd
CLI interface:
/usr/bin/varnishadm
Shared Memory Log交互工具:
/usr/bin/varnishhist
/usr/bin/varnishlog
/usr/bin/varnishncsa
/usr/bin/varnishstat
/usr/bin/varnishtop
测试工具程序:
/usr/bin/varnishtest
VCL配置文件重载程序:
/usr/sbin/varnish_reload_vcl
Systemd Unit File:
/usr/lib/systemd/system/varnish.service
varnish服务
/usr/lib/systemd/system/varnishlog.service
/usr/lib/systemd/system/varnishncsa.service
日志持久的服务;
四:varnish的缓存存储机制( Storage Types):
/etc/varnish/varnish.params 在此文件中做修改
-s [name=]type[,options]
• malloc[,size]
内存存储,[,size]用于定义空间大小;重启后所有缓存项失效;
• file[,path[,size[,granularity]]]
磁盘文件存储,黑盒;重启后所有缓存项失效;
• persistent,path,size
文件存储,黑盒;重启后所有缓存项有效;实验;
varnish程序的选项:
程序选项:/etc/varnish/varnish.params文件
-a address[:port][,address[:port][...],http监听的端口默认为6081端口;
-T address[:port],默认为6082端口;
-s [name=]type[,options],定义缓存存储机制;
-u user
-g group
-f config:VCL配置文件;
-F:运行于前台;
运行时参数:
/etc/varnish/varnish.params文件, DEAMON_OPTS
DAEMON_OPTS="-p thread_pool_min=5 -p thread_pool_max=500 -p thread_pool_timeout=300"
-p param=value:设定运行参数及其值; 可重复使用多次;
-r param[,param...]: 设定指定的参数为只读状态;
重载vcl配置文件:
~ ]# varnish_reload_vcl
五:简要修改配置文件。启动varnish服务、
修改 /etc/varnish/default.vcl文件
默认监听的后端 ip地址及端口号(http服务)
更改为
启动服务 systemctl start varnish
启动服务时,要确保本机的httpd 及 nginx服务都是关闭状态
ss –ntl
测试: http://172.16.253.95:6081/ind...
95主机没有提供web服务,
显示的是后端服务器的页面
响应报文 也证实了这一点
三:配置VCL
1:varnish工作流程
varnish 3版本和 4 版本的流程稍微不一样。具体如下
varnish 3版本
一:vcl_recv()引擎 收到请求如何处理
1:不是http请求 直接发至后端服务器
使用pass()引擎
2:是http请求,发送至Cacheable处理
1)不可缓存的方法如 put post等
给fetch()引擎。fetch()引擎向后端去取数据
去取数据之前,还可以操纵以下请求报文,作出一些修改
fetch()取到数据之后,给deliver()引擎(交付之意),deliver引擎发送至客户端。
deliver()引擎发送至客户端之前,可以修改以下响应报文
2)可以缓存的方法 get head
交付给 vcl_hash, vcl_hash可以定义hash哪些数据
hash完之后的结果有两种命中或不命中
命中交付给 hit()引擎处理
不命中miss() 引擎处理
结:此流程主要 提及了以下几个引擎
vcl_recv() 接收用户请求的引擎
fetch() 向后端去取数据的引擎,可以修改请求报文
deliver() 发送数据给 客户端的引擎,可以修改响应报文
vcl_hash() : 缓存 hash比较的引擎,可以定义hash的一些规则
hit() 命中缓存的引擎
miss() 未命中缓存的引擎
varnish 4.0
增加的引擎:
vcl_purge(): 修剪。 清除一项缓存项
ban():篱笆 清除一类缓存项。 支持正则
pipe(): 不是http请求,直接发送至后端处理
2:vcl中的状态引擎
1:recv():接收用户请求的缓存
pipe():不是http的请求,通过管道(四层)直接发送至后端
pass():直接发送至后端
sysnth() 自定义不接受用户的请求
purge()修剪缓存
hash()
2:hash()缓存 hash比较的引擎,可以定义hash的一些规则
hit() 命中缓存的引擎
miss() 未命中缓存的引擎
3:
fetch():
接收的是 miss()引擎后的请求及
recv()请求 及
beresponce() 后端处理过的请求
修改请求报文至 后端
error():发送至后端处理之后,没有找到数据
beresponce() 后端处理之后 ,可以处理的数据
deliver() 发送数据给 客户端的引擎,可以修改响应报文
接收 hit()及 fetch()的数据
3:变量可以使用的位置
下述章节主要描述 vcl配置及 实验实现