使用多个后端清除清漆缓存

Purge varnish cache with multiple backends

我有一个 varnish 缓存,在 nginx ssl 终止节点后面,它基于 url 路由到两个不同的后端(运行ning wordpress)。 “/”路由到服务器A,“/about/”路由到服务器B。

如果我先curl在本地curl http://127.0.0.1/,设置缓存,然后curl -X PURGE http://127.0.0.1/,就清空缓存。

如果我从我们的 nginx ssl 终止服务器命中它,然后尝试使用相同的 curl 命令清除缓存,它不会清除通过 nginx 服务器创建的缓存项。

vcl 文件:

# Based off of https://gist.github.com/matthewjackowski/062be03b41a68edbadfc

# Marker to tell the VCL compiler that this VCL has been adapted to the
# new 4.0 format.
vcl 4.0;
import directors;

# Default backend definition. Set this to point to your content server.
backend default {
    .host = "serverA";
    .port = "80";
    .connect_timeout = 600s;
    .first_byte_timeout = 600s;
    .between_bytes_timeout = 600s;
    .max_connections = 800;
}

backend bedrock {
    .host = "serverB";
    .port = "80";
    .connect_timeout = 600s;
    .first_byte_timeout = 600s;
    .between_bytes_timeout = 600s;
    .max_connections = 800;
}

# Only allow purging from specific IPs
acl purge {
    "localhost";
    "127.0.0.1";
}

# This function is used when a request is send by a HTTP client (Browser) 
sub vcl_recv {
    # Normalize the header, remove the port (in case you're testing this on various TCP ports)
    set req.http.X-Forwarded-For = client.ip;
    set req.backend_hint = default;

    # Unset headers that might cause us to cache duplicate infos
    unset req.http.Accept-Language;
    unset req.http.User-Agent;
    set req.http.X-Forwarded-Proto = "https";

    if (req.url == "/") {
        set req.backend_hint = bedrock;
    }

    # Allow purging from ACL
    if (req.method == "PURGE") {
        # If not allowed then a error 405 is returned
        if (!client.ip ~ purge) {
            return(synth(405, "This IP is not allowed to send PURGE requests."));
        }    
        # If allowed, do a cache_lookup -> vlc_hit() or vlc_miss()
        return (purge);
    }

    # drop cookies and params from static assets
    if (req.url ~ "\.(gif|jpg|jpeg|swf|ttf|css|js|flv|mp3|mp4|pdf|ico|png)(\?.*|)$") {
        unset req.http.cookie;
        set req.url = regsub(req.url, "\?.*$", "");
    }

    # drop tracking params, only needed on the frontend.
    if (req.url ~ "\?(utm_(campaign|medium|source|term)|adParams|client|cx|eid|fbid|feed|ref(id|src)?|v(er|iew))=") {
        set req.url = regsub(req.url, "\?.*$", "");
    }

    # pass wp-admin urls
    if (req.url ~ "wp-(login|admin)" || req.url ~ "preview=true" || req.url ~ "xmlrpc.php") {
        return (pass);
    }

    # pass wp-admin cookies
    if (req.http.cookie) {
        if (req.http.cookie ~ "(wordpress_|wp-settings-)") {
            return(pass);
        } else {
            unset req.http.cookie;
        }
    }
}

# Drop any cookies Wordpress tries to send back to the client.
sub vcl_backend_response {
    # Remove some headers we never want to see
    unset beresp.http.Server;
    unset beresp.http.X-Powered-By;
    # This function is used when a request is sent by our backend (Nginx server)
    if (bereq.http.Cookie ~ "(UserID|_session)") {
        set beresp.http.X-Cacheable = "NO:Got Session";
        set beresp.uncacheable = true;
        return (deliver);

    } elsif (beresp.ttl <= 0s) {
        # Varnish determined the object was not cacheable
        set beresp.http.X-Cacheable = "NO:Not Cacheable";

    } elsif (beresp.http.set-cookie) {
        # You don't wish to cache content for logged in users
        set beresp.http.X-Cacheable = "NO:Set-Cookie";
        set beresp.uncacheable = true;
        return (deliver);

    } elsif (beresp.http.Cache-Control ~ "private") {
        # You are respecting the Cache-Control=private header from the backend
        set beresp.http.X-Cacheable = "NO:Cache-Control=private";
        set beresp.uncacheable = true;
        return (deliver);

    } else {
        # Varnish determined the object was cacheable
        set beresp.http.X-Cacheable = "YES";
        # Remove Expires from backend, it's not long enough
        unset beresp.http.expires;
        # Set the clients TTL on this object
        set beresp.http.cache-control = "max-age=900";
        # Set how long Varnish will keep it
        set beresp.ttl = 1d;
    }

    if ( (!(bereq.url ~ "((wp/)?wp-(login|admin)|login)")) || (bereq.method == "GET") ) {
        set beresp.http.X-UnsetCookies = "TRUE";
        unset beresp.http.set-cookie;
        set beresp.ttl = 1h;
    }

    if (bereq.url ~ "\.(gif|jpg|jpeg|swf|ttf|css|js|flv|mp3|mp4|pdf|ico|png)(\?.*|)$") {
        set beresp.ttl = 1d;
    }

}

# The routine when we deliver the HTTP request to the user
# Last chance to modify headers that are sent to the client
sub vcl_deliver {
    if (obj.hits > 0) { 
        set resp.http.X-Cache = "cached";
    } else {
        set resp.http.x-Cache = "uncached";
    }

    # Remove some headers: PHP version
    unset resp.http.X-Powered-By;
    # Remove some headers: Apache version & OS
    unset resp.http.Server;
    # Remove some headers: Varnish
    unset resp.http.X-Varnish;
}

缓存页面时varnishlog输出

*   << BeReq    >> 3         
-   Begin          bereq 2 fetch
-   Timestamp      Start: 1488390891.742004 0.000000 0.000000
-   BereqMethod    GET
-   BereqURL       /
-   BereqProtocol  HTTP/1.0
-   BereqHeader    X-Prerender-Token: qUcOM8XD5dRKUvlnCaMx
-   BereqHeader    X-Real-IP: 10.224.20.1
-   BereqHeader    Host: ssl-sermination-domain.com
-   BereqHeader    Upgrade-Insecure-Requests: 1
-   BereqHeader    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
-   BereqHeader    DNT: 1
-   BereqHeader    X-Forwarded-For: 10.224.20.146
-   BereqHeader    X-Forwarded-Proto: https
-   BereqHeader    Accept-Encoding: gzip
-   BereqProtocol  HTTP/1.1
-   BereqHeader    X-Varnish: 3
-   VCL_call       BACKEND_FETCH
-   VCL_return     fetch
-   BackendOpen    20 boot.bedrock 10.240.0.4 80 10.224.20.148 39350
-   BackendStart   10.240.0.4 80
-   Timestamp      Bereq: 1488390891.743281 0.001276 0.001276
-   Timestamp      Beresp: 1488390891.863164 0.121160 0.119883
-   BerespProtocol HTTP/1.1
-   BerespStatus   200
-   BerespReason   OK
-   BerespHeader   Date: Wed, 01 Mar 2017 17:54:51 GMT
-   BerespHeader   Server: Apache/2.4.7 (Ubuntu)
-   BerespHeader   X-Powered-By: PHP/5.5.9-1ubuntu4.21
-   BerespHeader   Link: <https://ssl-sermination-domain.com/wp-json/>; rel="https://api.w.org/"
-   BerespHeader   Link: <https://ssl-sermination-domain.com/>; rel=shortlink
-   BerespHeader   Vary: Accept-Encoding
-   BerespHeader   Content-Encoding: gzip
-   BerespHeader   Access-Control-Allow-Origin: *
-   BerespHeader   Cache-Control: Public
-   BerespHeader   Max-Age: 600
-   BerespHeader   Content-Length: 6396
-   BerespHeader   Content-Type: text/html; charset=UTF-8
-   TTL            RFC 120 10 -1 1488390892 1488390892 1488390891 0 0
-   VCL_call       BACKEND_RESPONSE
-   BerespUnset    Server: Apache/2.4.7 (Ubuntu)
-   BerespUnset    X-Powered-By: PHP/5.5.9-1ubuntu4.21
-   BerespHeader   X-Cacheable: YES
-   BerespUnset    Cache-Control: Public
-   BerespHeader   cache-control: max-age=900
-   TTL            VCL 86400 10 0 1488390892
-   BerespHeader   X-UnsetCookies: TRUE
-   TTL            VCL 3600 10 0 1488390892
-   VCL_return     deliver
-   Storage        malloc s0
-   ObjProtocol    HTTP/1.1
-   ObjStatus      200
-   ObjReason      OK
-   ObjHeader      Date: Wed, 01 Mar 2017 17:54:51 GMT
-   ObjHeader      Link: <https://ssl-sermination-domain.com/wp-json/>; rel="https://api.w.org/"
-   ObjHeader      Link: <https://ssl-sermination-domain.com/>; rel=shortlink
-   ObjHeader      Vary: Accept-Encoding
-   ObjHeader      Content-Encoding: gzip
-   ObjHeader      Access-Control-Allow-Origin: *
-   ObjHeader      Max-Age: 600
-   ObjHeader      Content-Length: 6396
-   ObjHeader      Content-Type: text/html; charset=UTF-8
-   ObjHeader      X-Cacheable: YES
-   ObjHeader      cache-control: max-age=900
-   ObjHeader      X-UnsetCookies: TRUE
-   Fetch_Body     3 length stream
-   Gzip           u F - 6396 27271 80 80 51104
-   BackendReuse   20 boot.bedrock
-   Timestamp      BerespBody: 1488390891.863519 0.121514 0.000355
-   Length         6396
-   BereqAcct      331 0 331 435 6396 6831
-   End            

*   << Request  >> 2         
-   Begin          req 1 rxreq
-   Timestamp      Start: 1488390891.741888 0.000000 0.000000
-   Timestamp      Req: 1488390891.741888 0.000000 0.000000
-   ReqStart       10.224.20.146 33370
-   ReqMethod      GET
-   ReqURL         /
-   ReqProtocol    HTTP/1.0
-   ReqHeader      X-Prerender-Token: qUcOM8XD5dRKUvlnCaMx
-   ReqHeader      X-Real-IP: 10.224.20.1
-   ReqHeader      X-Forwarded-For: 10.224.20.1
-   ReqHeader      Host: ssl-sermination-domain.com
-   ReqHeader      X-Forwarded-Proto: https
-   ReqHeader      Connection: close
-   ReqHeader      Cache-Control: max-age=0
-   ReqHeader      Upgrade-Insecure-Requests: 1
-   ReqHeader      User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko)     Chrome/56.0.2924.87 Safari/537.36
-   ReqHeader      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
-   ReqHeader      DNT: 1
-   ReqHeader      Accept-Encoding: gzip, deflate, sdch, br
-   ReqHeader      Accept-Language: en-US,en;q=0.8
-   ReqHeader      Cookie: __qca=P0-1762908153-1488362085426; _mkto_trk=id:503-BAR-730&token:_mch-ssl-termination.com-1488362085634-71558; calltrk_referrer=direct;     calltrk_landing=https%3A//www.ssl-termination.com/about/; optimizelyEndUserId=oeu1488387324154r0.4330785754032478; op
-   ReqUnset       X-Forwarded-For: 10.224.20.1
-   ReqHeader      X-Forwarded-For: 10.224.20.1, 10.224.20.146
-   VCL_call       RECV
-   ReqUnset       X-Forwarded-For: 10.224.20.1, 10.224.20.146
-   ReqHeader      X-Forwarded-For: 10.224.20.146
-   ReqUnset       Accept-Language: en-US,en;q=0.8
-   ReqUnset       User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko)     Chrome/56.0.2924.87 Safari/537.36
-   ReqUnset       X-Forwarded-Proto: https
-   ReqHeader      X-Forwarded-Proto: https
-   ReqUnset       Cookie: __qca=P0-1762908153-1488362085426; _mkto_trk=id:503-BAR-730&token:_mch-ssl-termination.com-1488362085634-71558; calltrk_referrer=direct;     calltrk_landing=https%3A//www.ssl-termination.com/about/; optimizelyEndUserId=oeu1488387324154r0.4330785754032478; op
-   VCL_return     hash
-   ReqUnset       Accept-Encoding: gzip, deflate, sdch, br
-   ReqHeader      Accept-Encoding: gzip
-   VCL_call       HASH
-   VCL_return     lookup
-   VCL_call       MISS
-   VCL_return     fetch
-   Link           bereq 3 fetch
-   Timestamp      Fetch: 1488390891.863387 0.121500 0.121500
-   RespProtocol   HTTP/1.1
-   RespStatus     200
-   RespReason     OK
-   RespHeader     Date: Wed, 01 Mar 2017 17:54:51 GMT
-   RespHeader     Link: <https://ssl-sermination-domain.com/wp-json/>; rel="https://api.w.org/"
-   RespHeader     Link: <https://ssl-sermination-domain.com/>; rel=shortlink
-   RespHeader     Vary: Accept-Encoding
-   RespHeader     Content-Encoding: gzip
-   RespHeader     Access-Control-Allow-Origin: *
-   RespHeader     Max-Age: 600
-   RespHeader     Content-Length: 6396
-   RespHeader     Content-Type: text/html; charset=UTF-8
-   RespHeader     X-Cacheable: YES
-   RespHeader     cache-control: max-age=900
-   RespHeader     X-UnsetCookies: TRUE
-   RespHeader     X-Varnish: 2
-   RespHeader     Age: 0
-   RespHeader     Via: 1.1 varnish-v4
-   VCL_call       DELIVER
-   RespHeader     x-Cache: uncached
-   RespUnset      X-Varnish: 2
-   VCL_return     deliver
-   Timestamp      Process: 1488390891.863412 0.121524 0.000025
-   RespHeader     Accept-Ranges: bytes
-   Debug          "RES_MODE 2"
-   RespHeader     Connection: close
-   Timestamp      Resp: 1488390891.863608 0.121720 0.000196
-   ReqAcct        1089 0 1089 501 6396 6897
-   End            

*   << Session  >> 1         
-   Begin          sess 0 HTTP/1
-   SessOpen       10.224.20.146 33370 0.0.0.0:8081 10.224.20.148 8081 1488390891.741828 14
-   Link           req 2 rxreq
-   SessClose      RESP_CLOSE 0.122
-   End     

清除时的varnishlog:

*   << Request  >> 98364     
-   Begin          req 98363 rxreq
-   Timestamp      Start: 1488390373.620924 0.000000 0.000000
-   Timestamp      Req: 1488390373.620924 0.000000 0.000000
-   ReqStart       127.0.0.1 56100
-   ReqMethod      PURGE
-   ReqURL         /
-   ReqProtocol    HTTP/1.1
-   ReqHeader      User-Agent: curl/7.35.0
-   ReqHeader      Host: 127.0.0.1:8081
-   ReqHeader      Accept: */*
-   ReqHeader      X-Forwarded-For: 127.0.0.1
-   VCL_call       RECV
-   ReqUnset       X-Forwarded-For: 127.0.0.1
-   ReqHeader      X-Forwarded-For: 127.0.0.1
-   ReqUnset       User-Agent: curl/7.35.0
-   ReqHeader      X-Forwarded-Proto: https
-   VCL_acl        MATCH purge "localhost"
-   VCL_return     purge
-   VCL_call       HASH
-   VCL_return     lookup
-   VCL_call       PURGE
-   VCL_return     synth
-   Timestamp      Process: 1488390373.620977 0.000052 0.000052
-   RespHeader     Date: Wed, 01 Mar 2017 17:46:13 GMT
-   RespHeader     Server: Varnish
-   RespHeader     X-Varnish: 98364
-   RespProtocol   HTTP/1.1
-   RespStatus     200
-   RespReason     OK
-   RespReason     Purged
-   VCL_call       SYNTH
-   RespHeader     Content-Type: text/html; charset=utf-8
-   RespHeader     Retry-After: 5
-   VCL_return     deliver
-   RespHeader     Content-Length: 240
-   Storage        malloc Transient
-   RespHeader     Accept-Ranges: bytes
-   Debug          "RES_MODE 2"
-   RespHeader     Connection: keep-alive
-   Timestamp      Resp: 1488390373.621082 0.000158 0.000106
-   ReqAcct        80 0 80 218 240 458
-   End            

*   << Session  >> 98363     
-   Begin          sess 0 HTTP/1
-   SessOpen       127.0.0.1 56100 0.0.0.0:8081 127.0.0.1 8081 1488390373.620850 18
-   Link           req 98364 rxreq
-   SessClose      REM_CLOSE 0.000
-   End            

编辑:

我相信我需要一个不同的清除命令,因为如果我通过 ssh 进入 varnish box 并且 运行 以下内容:

  1. curl url 本地(未缓存)
  2. curl url 本地(缓存)
  3. curl 在本地再次清除
  4. curl url 本地(未缓存)
  5. curl url 本地(缓存)

它按预期工作。

我查看了默认值 vcl_hash 并弄明白了。我需要发送主机 header 并正确破坏缓存。

curl -X PURGE http://127.0.0.1:8081/ -H "Host: ssl-termination-domain.com"