3

一: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

一:程序架构

clipboard.png

程序架构:

        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服务)

clipboard.png
更改为

clipboard.png

启动服务 systemctl start varnish

启动服务时,要确保本机的httpd 及 nginx服务都是关闭状态

ss –ntl

clipboard.png

测试: http://172.16.253.95:6081/ind...
95主机没有提供web服务,
显示的是后端服务器的页面

clipboard.png

响应报文 也证实了这一点

clipboard.png

三:配置VCL

1:varnish工作流程

varnish 3版本和 4 版本的流程稍微不一样。具体如下

varnish 3版本

clipboard.png

clipboard.png
一: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

clipboard.png

clipboard.png

增加的引擎:
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:变量可以使用的位置

clipboard.png

下述章节主要描述 vcl配置及 实验实现


济贞
287 声望8 粉丝

不积跬步无以至千里;不积小流无以成江海。