黑帽联盟

 找回密码
 会员注册
查看: 1551|回复: 0
打印 上一主题 下一主题

[集群服务] 用varnish缓存discuz相关静态资源

[复制链接]

895

主题

38

听众

3322

积分

管理员

Rank: 9Rank: 9Rank: 9

  • TA的每日心情

    前天 13:01
  • 签到天数: 1643 天

    [LV.Master]伴坛终老

    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
    帖子永久地址: 

    黑帽联盟 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与黑帽联盟享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和黑帽联盟的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、黑帽联盟管理员和版主有权不事先通知发贴者而删除本文

    勿忘初心,方得始终!
    您需要登录后才可以回帖 登录 | 会员注册

    发布主题 !fastreply! 收藏帖子 返回列表 搜索
    回顶部