设为首页收藏本站

LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区!

 找回密码
 注册

QQ登录

只需一步,快速开始

#公告#抱歉,网站将关闭,不再开放。由于PC时代已远逝 。在这个后移动互联网时代,我们继续携手前行,保持对技术的热情。共同构建linuxtone知识星球欢迎加入,一起讨论技术、招聘人才、分享资源。请新老linuxtone人 扫码移步到 知识星球:linuxtone

学习是一种信仰!分享是一种快乐!能力= 心态 * 沟通 * 知识 (你的每一天需要正能量!)

 网站的发展需要你贡献一份力量!希望你能每天坚持看贴1小时,并回答网友的问题!祝你在浏览论坛的过程中取得进步!谢谢!linuxtone加油!大家加油! 友情提示: 你今天学习了吗?你今天进步了吗?少一点抱怨!多一点进步!Life is short ! Why not linuxtone ?  

网站的发展、感谢每位坛友的努力!

查看: 2663|回复: 5

[Varnish] varnish链接页面服务器的图片无法缓存 [复制链接]

Rank: 6Rank: 6

签到
35
注册时间
2014-9-9
最后登录
2015-10-9
在线时间
15 小时
阅读权限
70
积分
3598
帖子
11
主题
3
精华
0
UID
42737
发表于 2014-9-28 14:46:05 |显示全部楼层
各位大虾,不同后端服务器,在缓存时,只有一台后端的响应头信息中有X-Cache字段,其他的都没有X-Cache字段,是怎么回事阿?


该贴已经同步到 351102319yang的微博

Rank: 8Rank: 8

注册时间
2011-9-16
最后登录
2019-12-15
在线时间
927 小时
阅读权限
90
积分
258581
帖子
2158
主题
2
精华
0
UID
15647
发表于 2014-9-29 09:02:52 |显示全部楼层
检查一下日志和配置文件

使用道具 举报

Rank: 6Rank: 6

注册时间
2014-9-9
最后登录
2015-10-9
在线时间
15 小时
阅读权限
70
积分
3598
帖子
11
主题
3
精华
0
UID
42737
发表于 2014-9-29 15:00:38 |显示全部楼层
Rockyw 发表于 2014-9-29 09:02
检查一下日志和配置文件

配置文件:
#VCL configuration file for varnish
import std;
acl internal {
    "localhost";
}

include "/etc/varnish/backend"; //后端backend文件

#Respond to incoming requests
sub vcl_recv {
    if (req.http.host ~ "^www.abc.com$") {
        set req.backend = www;
    }elsif (req.http.host ~ "app.abc.com"){
        set req.http.host = "app.abc.com";
        set req.backend = img1;
    }elsif (req.http.host ~ "pc.abc.com"){
        set req.backend = img2;
    }elsif (req.http.host ~ "image.abc.com"){
        set req.backend = img3;
    }else {
        return (pass);
    }

    if (req.http.host == "(www.)google(*).com(.*)"){
        set req.backend = google;
        return (pass);
    }

#Request restart times justify
    if (req.restarts == 0){
        if (req.http.x-forwarded-for){
            set req.http.X-Forwarded-For = req.http.X-Forwarded.For + "," + client.ip;
        } else {
            set req.http.X-Forwarded-For = client.ip;
        }
    }

#Normalize requests sent via curl -X mode and LWP
    #if (req.url ~ "^http://"){
#        set req.url = regsub(req.url,"http://[^/]*","");
#    }
#Normalize hostname to aviod double caching

    set req.url = regsub(req.url,"\?*","");
#Use anonymous,cached pages is all backend are down
    if (!req.backend.healthy){
        unset req.http.Cookie;
    }

    set req.grace = 6h;
#Do not cache these paths
    if (req.url ~ "^/status\.php$" || req.url ~ "^/administrator"){
        return (pass);
    }
#Do not cache authenticated sessions
    if (req.http.Cookie && req.http.Cookie ~ "authtoken="){
        return (pipe);
    }
#Allow purge only from internal users
    if (req.request == "PURGE"){
        if (!client.ip ~ internal){
            error 405 "Not allowed.";
        }
        return (lookup);
    }
#Handle compression correctly.
    if (req.http.Accept-Encoding){
        if (req.url~".(jpg|jpeg|png|gif|ico)"){
            unset req.http.Accept-Encoding;
        }else if (req.http.Accept-Encoding ~ "gzip"){
            set req.http.Accept-Encoding = "gzip";
        }else if (req.http.Accept-Encoding ~ "deflate"){
            set req.http.Accept-Encoding = "deflate";
       }else {
            unset req.http.Accept.Encoding;
        }
    }
#Always cache the following file types for all users
    if (req.request == "GET" && req.url ~ ".(png|jpg|jpeg|gif|ico|swf|pdf|txt|doc|docs|xsl|ppt|css|js|html|htm|gz|xml)" ){
        unset req.http.Cookie;
        return (lookup);
    }
   
    if (req.request != "GET" && req.request != "HEAD" && req.request != "PUT" && req.request != "POST" && req.request != "TRACE" && req.request != "OPTIONS" && req.request != "DELETE"){
        return (pipe);
    }
    if (req.request != "GET" && req.request != "HEAD"){
        return (pass);
    }
#Cache requests with cookies
    if (req.http.Authenticate || req.http.Authorization){
        return (pass);
    }
   
    return (lookup);
}

#Determine the cache key when storing/retrieving a cached page
sub vcl_hash {
    hash_data(req.url);
    if (req.http.host){
        hash_data(req.http.Host);
    }else {
        hash_data(server.ip);
    }
   
    if (req.http.Accept-Encoding~"gzip"){
        hash_data("gzip");
    }else if (req.http.Accept-Encoding~"deflate"){
        hash_data("deflate");
    }
       
    return (hash);
}

sub vcl_hit {
    if (req.request == "PURGE"){
        #purge;
        set obj.ttl = 0s;
        error 200 "Purged";
    }
    if (obj.ttl <= 0s){
        return (pass);
    }
    return (deliver);
}

sub vcl_miss {
    if (req.request == "PURGE"){
        error 404 "Not in cache.";
    }
    return (fetch);
}

sub vcl_fetch {
    if (req.request == "GET" && req.url~ "^(.*)\.(png|jpg|jpeg|gif|ico|swf|pdf|txt|doc|docs|xsl|ppt|xml|css|js|html|htm|gz)($|\?)"){
      #  unset beresp.http.Set-cookie;
        set beresp.do_gzip = true;
        set beresp.ttl = 30m;
    }else {
        set beresp.ttl = 15m;
    }
#Allow items to be  stale if needed
    set beresp.grace = 6h;

    if (beresp.ttl <= 0s){
        set beresp.http.X-Cache = "NO:Not Cacheable";
        return (hit_for_pass);
    }else if (req.http.Cookie ~ "(UserIDl_session)"){
        set beresp.http.X-Cache = "NO:Got Session";
        return (hit_for_pass);
    }else if (beresp.http.Cache-Control ~ "private"){
        set beresp.http.X-Cache = "NO:Cache-Control=private";
        return (hit_for_pass);
    }else if (beresp.ttl < 1s){
        set beresp.ttl = 300s;
        set beresp.grace = 300s;
        set beresp.http.X-Cache = "YES:Forced";
    } else {
        set beresp.http.X-Cache = "YES";
    }
#no cache object when the web specified

    if (beresp.http.Pragma ~ "no-cache" || beresp.http.Cache-Control ~ "(no-cache|peivate)"){
        return (hit_for_pass);
    }

    if (beresp.ttl <= 0s ||
         beresp.http.Set-Cookie ||
         beresp.http.Vary == "*") {
                /*
                 * Mark as "Hit-For-Pass" for the next 2 minutes
                 */
                set beresp.ttl = 120 s;
                return (hit_for_pass);
     }
    return (deliver);
}

sub vcl_deliver {
    set resp.http.X-Cache-Hits = obj.hits;
    if (obj.hits > 0){
#        set resp.http.Server = "}+beresp.http.Server+{";
        set resp.http.X-Cache = "HIT";
    }else {
        set resp.http.X-Cache = "MISS";
    }

    if (resp.http.X-Content-Encoded-By){
        unset resp.http.X-Content-Encoded-By;
    }

    if (resp.http.magicmarker){
        unset resp.http.magicmarker;
        set resp.http.Age = "0";
    }
    return (deliver);
}

sub vcl_error {
#Redirect to some to root,in case of failure
    set obj.http.Content-Type = "text/html;charset=utf-8";
    synthetic {"
        <html>
        <head>
          <title>Page Unavailable</title>
          <style>
            body { bacakground:#efefef;text-align:center;color:white;font-family:Trebuchet MS,sans-serif;}
            #page {width:500px; margin:100px auto 0; padding:30px; background:#888888; border-radius:14px; -moz-border-radius:14px; webkit-border-radiu:14px;border:0 }
            a,a:link,a;visited {color:#cccccc;}
            .error {color:#222222; }
          </style>
        </head>
        <body onload="setTimeout(function(){window.location = '/'},3000)">
          <div id="page">
            <h1 class="title">Page Unavailable</h1>
            <p>The page you requested is temporarily unavailable.</p>
            <p>We're redirecting you to the <a href="/">homepage</a> in 3 seconds.</p>
            <div class="error">(Error "} + obj.status + "" + obj.response + {")</div>
          </div>
        </body>
        </html>
    "};
    return (deliver);
}
这就是我的VCL配置文件。在www.abc.com的响应头文件可以看到X-Cache字段信息,但是在www.abc.com链接到app.abc.com的图片的响应头文件没有X-Cache字段。另外,在链接页面的请求头信息上有referer字段,指向www.abc.com。这是怎么回事呢?

使用道具 举报

Rank: 6Rank: 6

注册时间
2014-9-9
最后登录
2015-10-9
在线时间
15 小时
阅读权限
70
积分
3598
帖子
11
主题
3
精华
0
UID
42737
发表于 2014-9-29 17:57:18 |显示全部楼层
已解决,谢谢。
问题在于app.abc.com没有经过varnish,所以无法显示X-Cache字段。
解决:将app.abc.com指向varnish服务器即可。

使用道具 举报

Rank: 8Rank: 8

注册时间
2011-9-16
最后登录
2019-12-15
在线时间
927 小时
阅读权限
90
积分
258581
帖子
2158
主题
2
精华
0
UID
15647
发表于 2014-9-29 21:51:37 |显示全部楼层
351102319yang 发表于 2014-9-29 17:57
已解决,谢谢。
问题在于app.abc.com没有经过varnish,所以无法显示X-Cache字段。
解决:将app.abc.com指向 ...

感谢分享经验,建议把标题改一下,添加问题已解决,详见几楼

使用道具 举报

Rank: 6Rank: 6

注册时间
2014-9-9
最后登录
2015-10-9
在线时间
15 小时
阅读权限
70
积分
3598
帖子
11
主题
3
精华
0
UID
42737
发表于 2014-9-30 14:08:49 |显示全部楼层

RE: varnish链接页面服务器的图片无法缓存

Rockyw 发表于 2014-9-29 21:51
感谢分享经验,建议把标题改一下,添加问题已解决,详见几楼

不会改

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

IT运维专家网感谢您的支持

合作联系: QQ:67888954/MSN:cnseek@msn.com/mail:netseek@linuxtone.org

Archiver|手机版|感谢所有关心和支持过LinuxTone的朋友们 转载本站内容请注明原作者名及出处 ( 京ICP备08103151 )   |

GMT+8, 2019-12-15 15:14 , Processed in 0.022293 second(s), 14 queries , Apc On.

Powered by Discuz! X2 Licensed

© 2001-2011 Comsenz Inc.

回顶部