黑帽联盟

标题: 用varnish缓存discuz相关静态资源 [打印本页]

作者: 定位    时间: 2019-10-8 20:01
标题: 用varnish缓存discuz相关静态资源
haproxy+varnish(缓存相关静态内容)+(nginx+php 两台主机,处理动态请求)+(nginx 1台主机,处理静态请求)+mysql(1台mysql)+nfs(一台共享存)

varnish子程序调用流程图,通过大部分子程序的return返回值进入下一步行动:
wKiom1kVBqujVhT6AATfL-bE37g690.jpg

官方的图示:
Free-Converter.com-simplified_fsm-64345405.png

相关文章:haproxy实现discuz论坛的动静分离和负载均衡

继上面链接之后,我们继续配置varnish,用varnish来缓存静态资源,这里我使用的是varnish4.0

varnish主机ip:192.168.1.108

default.vcl内容如下:
  1. vcl 4.0;

  2. import directors;

  3. import std;


  4. backend web_app_01 {

  5.     .host = "192.168.1.114";

  6.     .port = "80";

  7.     .first_byte_timeout = 9s;

  8.     .connect_timeout = 3s;

  9.     .between_bytes_timeout = 1s;


  10. }


  11. acl purgers {

  12.     "127.0.0.1";

  13.     "localhost";

  14.     "192.168.1.0/24";

  15. }



  16. sub vcl_init {

  17.     new web = directors.round_robin();

  18.     web.add_backend(web_app_01);

  19. }



  20. sub vcl_recv {   

  21.     set req.backend_hint = web.backend();

  22.     if (req.method == "PURGE") {

  23.         if (!client.ip ~ purgers) {

  24.             return (synth(405, "NotAllowed."));

  25.         }

  26.         return (purge);

  27.     }

  28.    

  29.     if (req.method != "GET"&&

  30.       req.method != "HEAD" &&

  31.       req.method != "PUT" &&

  32.       req.method != "POST" &&

  33.       req.method != "TRACE"&&

  34.       req.method != "OPTIONS"&&

  35.       req.method != "PATCH"&&

  36.       req.method != "DELETE") {

  37.       return (pipe);

  38.     }



  39.    

  40.     if (req.method != "GET"&& req.method != "HEAD") {

  41.         return (pass);

  42.     }



  43.     if (req.url ~"\.(php|asp|aspx|jsp|do|ashx|shtml)($|\?)") {

  44.         return (pass);

  45.     }

  46.    

  47.     if (req.http.Authorization) {

  48.         return (pass);

  49.     }

  50.    

  51.     if (req.http.Accept-Encoding) {

  52.         if (req.url ~"\.(bmp|png|gif|jpg|jpeg|ico|gz|tgz|bz2|tbz|zip|rar|mp3|mp4|ogg|swf|flv)[        DISCUZ_CODE_0        ]quot;){

  53.             unset req.http.Accept-Encoding;      

  54.         } elseif (req.http.Accept-Encoding ~"gzip") {

  55.             set req.http.Accept-Encoding ="gzip";

  56.         } elseif (req.http.Accept-Encoding ~"deflate") {

  57.             set req.http.Accept-Encoding ="deflate";

  58.         } else {

  59.             unset req.http.Accept-Encoding;

  60.         }

  61.     }



  62.     if (req.url ~"\.(css|js|html|htm|bmp|png|gif|jpg|jpeg|ico|gz|tgz|bz2|tbz|zip|rar|mp3|mp4|ogg|swf|flv)($|\?)"){

  63.         unset req.http.cookie;

  64.         return (hash);

  65.     }

  66.     if (req.restarts == 0) {

  67.         if (req.http.X-Forwarded-For) {

  68.             set req.http.X-Forwarded-For =req.http.X-Forwarded-For + ", " + client.ip;

  69.         } else {

  70.             set req.http.X-Forwarded-For =client.ip;

  71.         }

  72.     }

  73.     return (hash);

  74. }

  75. sub vcl_hash {

  76.     hash_data(req.url);

  77.     if (req.http.host) {

  78.         hash_data(req.http.host);

  79.     } else {

  80.         hash_data(server.ip);

  81.     }

  82.     return (lookup);

  83. }

  84. sub vcl_hit {

  85.     if (req.method == "PURGE") {

  86.         return (synth(200,"Purged."));

  87.     }

  88.     return (deliver);

  89. }

  90. sub vcl_miss {

  91.     if (req.method == "PURGE") {

  92.         return (synth(404,"Purged."));

  93.     }

  94.     return (fetch);

  95. }



  96. sub vcl_deliver {

  97.     if (obj.hits > 0) {

  98.         set resp.http.X-Cache ="HIT";

  99.         set resp.http.X-Cache-Hits = obj.hits;

  100.     } else {

  101.         set resp.http.X-Cache ="MISS";

  102.     }

  103.     unset resp.http.X-Powered-By;

  104.     unset resp.http.Server;

  105.     unset resp.http.X-Drupal-Cache;

  106.     unset resp.http.Via;

  107.     unset resp.http.Link;

  108.     unset resp.http.X-Varnish;

  109.     set resp.http.xx_restarts_count =req.restarts;

  110.     set resp.http.xx_Age = resp.http.Age;

  111.     set resp.http.hit_count = obj.hits;

  112.     unset resp.http.Age;

  113.     return (deliver);

  114. }



  115. sub vcl_pass {

  116.     return (fetch);

  117. }



  118. sub vcl_backend_response {

  119.     set beresp.grace = 5m;

  120.     if (beresp.status == 499 || beresp.status== 404 || beresp.status == 502) {

  121.     set beresp.uncacheable = true;

  122.     }

  123.     if (bereq.url ~"\.(php|jsp)(\?|$)") {

  124.       set beresp.uncacheable = true;

  125.     } else {

  126.        if (bereq.url ~ "\.(css|js|html|htm|bmp|png|gif|jpg|jpeg|ico)($|\?)"){

  127.          set beresp.ttl = 15m;

  128.          unset beresp.http.Set-Cookie;

  129.        } elseif (bereq.url ~"\.(gz|tgz|bz2|tbz|zip|rar|mp3|mp4|ogg|swf|flv)($|\?)") {

  130.            set beresp.ttl = 30m;

  131.            unset beresp.http.Set-Cookie;

  132.          } else {

  133.             set beresp.ttl = 10m;

  134.             unset beresp.http.Set-Cookie;

  135.          }

  136.       }

  137.     return (deliver);

  138. }

  139. sub vcl_purge {

  140.         return(synth(200,"success"));

  141. }



  142. sub vcl_backend_error {

  143.     if (beresp.status == 500 ||

  144.         beresp.status == 501 ||

  145.         beresp.status == 502 ||

  146.         beresp.status == 503 ||

  147.         beresp.status == 504) {

  148.         return (retry);

  149.     }

  150. }



  151. sub vcl_fini {

  152.     return (ok);

  153. }
复制代码
修改HAproxy的配置文件,把静态资源的调度IP改为varnish:
  1. #---------------------------------------------------------------------
  2. global    #全局配置

  3.     log         127.0.0.1 local2    #日志纪录位置

  4.     chroot      /var/lib/haproxy    #haproxy的工作目录
  5.     pidfile     /var/run/haproxy.pid    #pid文件位置
  6.     maxconn     4000                    #最大连接数
  7.     user        haproxy                #运行时使用的用户身份
  8.     group       haproxy                #运行时使用的组身份
  9.     daemon                            #启动为守护进程,不加此处运行在前台
  10.    
  11.     stats socket /var/lib/haproxy/stats    #本地访问stats统计信息时以套接字方式通信
  12.    
  13. defaults    #默认配置
  14.     mode                    http    #已http模式运行
  15.     log                     global    #默认日志为全局配置中日志的设置
  16.     option                  httplog
  17.     option                  dontlognull
  18.     option http-server-close
  19.     option forwardfor       except 127.0.0.0/8    #除本机外所有发往服务器的请求首部中加入“X-Forwarded-For”首部
  20.     option                  redispatch
  21.     retries                 3
  22.     timeout http-request    10s
  23.     timeout queue           1m
  24.     timeout connect         10s
  25.     timeout client          1m
  26.     timeout server          1m
  27.     timeout http-keep-alive 10s
  28.     timeout check           10s
  29.     maxconn                 3000    #前端最大并发连接数
  30.    
  31. listen static    #设置统计报告页面
  32.     bind *:9000    #监听在本机9000端口
  33.     stats enable    #打开
  34.     stats hide-version    #隐藏haproxy版本
  35.     stats uri /hadzadmin?stats    #统计页面路径
  36.     stats realm "HAProxy/ Static"    #打开统计页面的认证功能
  37.     stats auth hasts:123            #进入统计页面所使用的账号hasts和密码123
  38.     stats admin if TRUE            #条件满足时进入管理级别
  39.    
  40. frontend  dz    #前端设置
  41.     bind *:80    #监听在80端口
  42.     acl url_static path_beg -i /data /static /images /javascript /stylesheets    #url开头为这些的静态内容
  43.     acl url_static path_end -i .jpg .gif .png .css .js .html .ico    #url结尾带为这些的静态内容
  44.     use_backend staser  if url_static    #如果静态内容符合url_static的条件,就调度到staser中的服务器
  45.     default_backend             dyser    #其他默认调度到dyser中的服务器
  46.    
  47. backend dyser    #后端动态内容服务器设置
  48.     cookie srv insert nocache    #在cookie中插入srv字串防止登录信息丢失
  49.     balance     roundrobin    #调度算法为轮询
  50.     server      cs3 192.168.1.113:80 check
  51.     server      cs4 192.168.1.115:80 check
  52.     rspadd X-Via:dynamic
  53.    
  54. backend staser    #后端静态内容服务器设置
  55.     balance     roundrobin
  56.     server  cs1 <font color="#ff0000">192.168.1.108</font>:80 check
  57.     rspadd X-Via:static
复制代码
最后访问192.168.1.107测试一下:(经多次ctrl+F5强制刷新)
2121.png

可以看到已命中缓存,并且X-Via:static

动态内容被转发到对应的机器上
2122.png
可以看到X-Via:dynamic,说明内容来自动态内容主机


相关参照:https://blog.51cto.com/zpf666/1924816




欢迎光临 黑帽联盟 (https://bbs.cnblackhat.com/) Powered by Discuz! X2.5