Varnish 缓存服务器

Varnish 缓存服务器


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.


Teo

You must be logged in to post a comment