Varnish sigue recibiendo MISS cuando Nginx es el servidor backend

Varnish sigue recibiendo MISS cuando Nginx es el servidor backend

Estoy experimentando una situación realmente extraña en la que Varnish funciona bien al acceder directamente al servidor de aplicaciones (servidor Play), pero no funciona con Nginx como servidor web.

  • Trabajando: Barniz:6081 => Reproducir:9000
  • No funciona: Varnish:6081=> Nginx:80 (Proxy inverso ascendente para reproducir) => Play:9000

La configuración de Nginx es sencilla

    location / {
    <% if env !~ /prod/ -%>
        ssi on; #turn on ssi
        proxy_set_header Accept-Encoding ""; # turn on the gzip in the request head request to Play, so the gz can be handled on Nginx
    <% end -%>

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_pass_header True-Client-IP;
        proxy_pass_header NSC-client-ip;

        proxy_pass         http://playservers;
        proxy_read_timeout 120s;
    }

Registro de solicitud de barniz que no funciona

*   << Request  >> 262151    
-   Begin          req 98305 rxreq
-   Timestamp      Start: 1430506271.730155 0.000000 0.000000
-   Timestamp      Req: 1430506271.730155 0.000000 0.000000
-   ReqStart       172.29.225.140 59335
-   ReqMethod      GET
-   ReqURL         /en/store-finder
-   ReqProtocol    HTTP/1.1
-   ReqHeader      Host: sdc-d1-caredesicache-app2.dev.walmart.com:6081
-   ReqHeader      Connection: keep-alive
-   ReqHeader      Pragma: no-cache
-   ReqHeader      Cache-Control: no-cache
-   ReqHeader      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
-   ReqHeader      User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36
-   ReqHeader      Accept-Encoding: gzip, deflate, sdch
-   ReqHeader      Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4
-   ReqHeader      Cookie: AMCV_C4C6370453309C960A490D44%40AdobeOrg=1766948455%7CMCMID%7C53747178867536931389166539357943008388%7CMCAAMLH-1430926858%7C7%7CMCAAMB-1430926858%7CNRX38WO0n5BH8Th-nqAG_A%7CMCAID%7CNONE; __gads=ID=21e2f1aff97858dc:T=1430322062:S=ALNI_MbzvCyNpyNFP
-   ReqHeader      X-Forwarded-For: 172.29.225.140
-   VCL_call       RECV
-   ReqUnset       X-Forwarded-For: 172.29.225.140
-   ReqHeader      X-Forwarded-For: 172.29.225.140
-   VCL_return     hash
-   ReqUnset       Accept-Encoding: gzip, deflate, sdch
-   ReqHeader      Accept-Encoding: gzip
-   VCL_call       HASH
-   VCL_return     lookup
-   Debug          "XXXX HIT-FOR-PASS"
-   HitPass        2147483654
-   VCL_call       PASS
-   VCL_return     fetch
-   Link           bereq 262152 pass
-   Timestamp      Fetch: 1430506272.045614 0.315459 0.315459
-   RespProtocol   HTTP/1.1
-   RespStatus     200
-   RespReason     OK
-   RespHeader     Server: nginx
-   RespHeader     Date: Fri, 01 May 2015 18:51:11 GMT
-   RespHeader     Content-Type: text/html; charset=utf-8
-   RespHeader     Vary: Accept-Encoding
-   RespHeader     Access-Control-Allow-Credentials: true
-   RespHeader     Access-Control-Allow-Origin: http://pstore-dev2.walmart.ca
-   RespHeader     Request-Id: 588
-   RespHeader     Request-Time: 5ms
-   RespHeader     Served-By: app2
-   RespHeader     X-Frame-Options: SAMEORIGIN
-   RespHeader     X-Page-Type: storeFinder
-   RespHeader     X-UA-Compatible: IE=edge,chrome=1
-   RespHeader     Set-Cookie: ENV=pstore-dev;max-age=1200;path=/;domain=.walmart.ca
-   RespHeader     Timing-Allow-Origin: *
-   RespHeader     Content-Encoding: gzip
-   RespHeader     cache-control: max-age=900
-   RespHeader     magicmarker: 1
-   RespHeader     X-Varnish: 262151
-   RespHeader     Age: 0
-   RespHeader     Via: 1.1 varnish-v4
-   VCL_call       DELIVER
-   RespHeader     X-Age: 0
-   RespUnset      Age: 0
-   RespHeader     X-Cache: MISS
-   VCL_return     deliver
-   Timestamp      Process: 1430506272.045706 0.315551 0.000092
-   RespHeader     Transfer-Encoding: chunked
-   Debug          "RES_MODE 8"
-   RespHeader     Connection: keep-alive
-   RespHeader     Accept-Ranges: bytes
-   Timestamp      Resp: 1430506276.767342 5.037187 4.721636
-   Debug          "XXX REF 1"
-   ReqAcct        1808 0 1808 675 178859 179534
-   End            
**  << BeReq    >> 262152    
--  Begin          bereq 262151 pass
--  Timestamp      Start: 1430506271.730440 0.000000 0.000000
--  BereqMethod    GET
--  BereqURL       /en/store-finder
--  BereqProtocol  HTTP/1.1
--  BereqHeader    Host: sdc-d1-caredesicache-app2.dev.walmart.com:6081
--  BereqHeader    Pragma: no-cache
--  BereqHeader    Cache-Control: no-cache
--  BereqHeader    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
--  BereqHeader    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36
--  BereqHeader    Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4
--  BereqHeader    Cookie: AMCV_C4C6370453309C960A490D44%40AdobeOrg=1766948455%7CMCMID%7C53747178867536931389166539357943008388%7CMCAAMLH-1430926858%7C7%7CMCAAMB-1430926858%7CNRX38WO0n5BH8Th-nqAG_A%7CMCAID%7CNONE; __gads=ID=21e2f1aff97858dc:T=1430322062:S=ALNI_MbzvCyNpyNFP
--  BereqHeader    X-Forwarded-For: 172.29.225.140
--  BereqHeader    Accept-Encoding: gzip
--  BereqHeader    X-Varnish: 262152
--  VCL_call       BACKEND_FETCH
--  VCL_return     fetch
--  Backend        19 vdir play2(10.242.215.40,,80)
--  Timestamp      Bereq: 1430506271.730848 0.000407 0.000407
--  Timestamp      Beresp: 1430506271.784953 0.054513 0.054105
--  BerespProtocol HTTP/1.1
--  BerespStatus   200
--  BerespReason   OK
--  BerespHeader   Server: nginx
--  BerespHeader   Date: Fri, 01 May 2015 18:51:11 GMT
--  BerespHeader   Content-Type: text/html; charset=utf-8
--  BerespHeader   Transfer-Encoding: chunked
--  BerespHeader   Connection: keep-alive
--  BerespHeader   Keep-Alive: timeout=20
--  BerespHeader   Vary: Accept-Encoding
--  BerespHeader   Access-Control-Allow-Credentials: true
--  BerespHeader   Access-Control-Allow-Origin: http://pstore-dev2.walmart.ca
--  BerespHeader   Request-Id: 588
--  BerespHeader   Request-Time: 5ms
--  BerespHeader   Served-By: app2
--  BerespHeader   X-Frame-Options: SAMEORIGIN
--  BerespHeader   X-Page-Type: storeFinder
--  BerespHeader   X-UA-Compatible: IE=edge,chrome=1
--  BerespHeader   Set-Cookie: ENV=pstore-dev;max-age=1200;path=/;domain=.walmart.ca
--  BerespHeader   Timing-Allow-Origin: *
--  BerespHeader   Content-Encoding: gzip
--  TTL            RFC 3600 -1 -1 1430506272 1430506272 1430506271 0 0
--  VCL_call       BACKEND_RESPONSE
--  TTL            VCL 86400 10 0 1430506272
--  BerespHeader   cache-control: max-age=900
--  BerespHeader   magicmarker: 1
--  TTL            VCL 120 10 0 1430506272
--  VCL_return     deliver
--  Storage        malloc Transient
--  ObjProtocol    HTTP/1.1
--  ObjStatus      200
--  ObjReason      OK
--  ObjHeader      Server: nginx
--  ObjHeader      Date: Fri, 01 May 2015 18:51:11 GMT
--  ObjHeader      Content-Type: text/html; charset=utf-8
--  ObjHeader      Vary: Accept-Encoding
--  ObjHeader      Access-Control-Allow-Credentials: true
--  ObjHeader      Access-Control-Allow-Origin: http://pstore-dev2.walmart.ca
--  ObjHeader      Request-Id: 588
--  ObjHeader      Request-Time: 5ms
--  ObjHeader      Served-By: app2
--  ObjHeader      X-Frame-Options: SAMEORIGIN
--  ObjHeader      X-Page-Type: storeFinder
--  ObjHeader      X-UA-Compatible: IE=edge,chrome=1
--  ObjHeader      Set-Cookie: ENV=pstore-dev;max-age=1200;path=/;domain=.walmart.ca
--  ObjHeader      Timing-Allow-Origin: *
--  ObjHeader      Content-Encoding: gzip
--  ObjHeader      cache-control: max-age=900
--  ObjHeader      magicmarker: 1
--  Fetch_Body     2 chunked -
--  Gzip           U F - 175253 2677572 80 1173648 1401956
--  Gzip           G F E 2677572 178843 80 1430664 1430674
--  BackendReuse   19 play2(10.242.215.40,,80)
--  Timestamp      BerespBody: 1430506272.046118 0.315678 0.261165
--  Length         178843
--  BereqAcct      1821 0 1821 568 175312 175880
--  End  

Laboral

*   << Request  >> 32780     
-   Begin          req 1 rxreq
-   Timestamp      Start: 1430506376.837363 0.000000 0.000000
-   Timestamp      Req: 1430506376.837363 0.000000 0.000000
-   ReqStart       172.29.225.140 59394
-   ReqMethod      GET
-   ReqURL         /en/store-finder
-   ReqProtocol    HTTP/1.1
-   ReqHeader      Host: sdc-d1-caredesicache-app2.dev.walmart.com:6081
-   ReqHeader      Connection: keep-alive
-   ReqHeader      Pragma: no-cache
-   ReqHeader      Cache-Control: no-cache
-   ReqHeader      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
-   ReqHeader      User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36
-   ReqHeader      Accept-Encoding: gzip, deflate, sdch
-   ReqHeader      Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4
-   ReqHeader      Cookie: AMCV_C4C6370453309C960A490D44%40AdobeOrg=1766948455%7CMCMID%7C53747178867536931389166539357943008388%7CMCAAMLH-1430926858%7C7%7CMCAAMB-1430926858%7CNRX38WO0n5BH8Th-nqAG_A%7CMCAID%7CNONE; __gads=ID=21e2f1aff97858dc:T=1430322062:S=ALNI_MbzvCyNpyNFP
-   ReqHeader      X-Forwarded-For: 172.29.225.140
-   VCL_call       RECV
-   ReqUnset       X-Forwarded-For: 172.29.225.140
-   ReqHeader      X-Forwarded-For: 172.29.225.140
-   VCL_return     hash
-   ReqUnset       Accept-Encoding: gzip, deflate, sdch
-   ReqHeader      Accept-Encoding: gzip
-   VCL_call       HASH
-   VCL_return     lookup
-   Hit            2147516419
-   VCL_call       HIT
-   VCL_return     deliver
-   RespProtocol   HTTP/1.1
-   RespStatus     200
-   RespReason     OK
-   RespHeader     Access-Control-Allow-Credentials: true
-   RespHeader     Access-Control-Allow-Origin: http://pstore-dev2.walmart.ca
-   RespHeader     Content-Type: text/html; charset=utf-8
-   RespHeader     Request-Id: 592
-   RespHeader     Request-Time: 5ms
-   RespHeader     Served-By: app2
-   RespHeader     X-Frame-Options: SAMEORIGIN
-   RespHeader     X-Page-Type: storeFinder
-   RespHeader     X-UA-Compatible: IE=edge,chrome=1
-   RespHeader     Date: Fri, 01 May 2015 18:52:42 GMT
-   RespHeader     cache-control: max-age=900
-   RespHeader     magicmarker: 1
-   RespHeader     Content-Encoding: gzip
-   RespHeader     X-Varnish: 32780 32771
-   RespHeader     Age: 15
-   RespHeader     Via: 1.1 varnish-v4
-   VCL_call       DELIVER
-   RespHeader     X-Age: 15
-   RespUnset      Age: 15
-   RespHeader     X-Cache: HIT
-   VCL_return     deliver
-   Timestamp      Process: 1430506376.837544 0.000181 0.000181
-   RespHeader     Content-Length: 178843
-   Debug          "RES_MODE 2"
-   RespHeader     Connection: keep-alive
-   RespHeader     Accept-Ranges: bytes
-   Timestamp      Resp: 1430506376.837811 0.000448 0.000267
-   Debug          "XXX REF 2"
-   ReqAcct        1808 0 1808 547 178843 179390
-   End 

Aquí está mi default.vcl

vcl 4.0;

import std;

# Default backend definition. Set this to point to your content server.
include "backends.vcl";

acl purge {
  "127.0.0.1";
  "localhost";
}

sub vcl_recv {
     # Allow purging
     if (req.method == "PURGE") {
        if (!client.ip ~ purge) { # purge is the ACL defined at the begining
          # Not from an allowed IP? Then die with an error.
          return (synth(405, "This IP is not allowed to send PURGE requests."));
        }
        # If you got this stage (and didn't error out above), purge the cached result
        return (purge);
    }

    set req.backend_hint = vdir.backend();
    set req.http.X-Forwarded-For = client.ip;

    # Happens before we check if we have this in cache already.
    #
    # Typically you clean up the request here, removing cookies you don't need,
    # rewriting the request, etc.
    if (req.url ~ "\.(gif|png|bmp|ico|jpeg|jpg)$" || // static image files
        req.url ~ "(?i)\.(aif|aiff|au|avi|bin|cab|carb|cct|cdf|class|css|doc|dcr|dtd|exe|flv|gcf|grv|hdml|hqx|ini|js|mov|mp3|nc|pct|pdf|ppc|pws|swa|swf|txt|vbs|w32|wav|wbmp|wml|wmlc|wmls|wmlsc|xsd|zip)$" || // other static assets
        req.url ~ "^/(en|fr)$" || // landing pages
        req.url ~ "^/(en/store-finder|fr/trouver-magasin)")
        {
            return(hash);
        }
    return(pass);
}

sub vcl_hash {

    #hash_data(req.http.cookie);

    ## defaults
    if ( req.url ~ "^/(en|fr)(\?[^/]+){0,1}$" ){
        hash_data(regsub(req.url, "^/(en|fr)(\?[^/]+){0,1}$", "/\1"));
    } else {
        hash_data(req.url);
    }
    if (req.http.host) {
        hash_data(req.http.host);
    } else {
        hash_data(server.ip);
    }
    ## end of defaults

   return(lookup);
}

sub vcl_hit {
  # Called when a cache lookup is successful.

  if (obj.ttl >= 0s) {
    # A pure unadultered hit, deliver it
    return (deliver);
  }

  # We have no fresh fish. Lets look at the stale ones.
  if (std.healthy(req.backend_hint)) {
    # Backend is healthy. Limit age to 10s.
    if (obj.ttl + 10s > 0s) {
      #set req.http.grace = "normal(limited)";
      return (deliver);
    } else {
      # No candidate for grace. Fetch a fresh object.
      return(fetch);
    }
  } else {
    # backend is sick - use full grace
      if (obj.ttl + obj.grace > 0s) {
      #set req.http.grace = "full";
      return (deliver);
    } else {
      # no graced object.
      return (fetch);
    }
  }

  # fetch & deliver once we get the result
  return (fetch); # Dead code, keep as a safeguard
}

sub vcl_miss {
  # Called after a cache lookup if the requested document was not found in the cache. Its purpose
  # is to decide whether or not to attempt to retrieve the document from the backend, and which
  # backend to use.

  return (fetch);
}


sub vcl_backend_response {
    # Happens after we have read the response headers from the backend.
    #
    # Here you clean the response headers, removing silly Set-Cookie headers
    # and other mistakes your backend does.
    set beresp.do_esi = true; // Do ESI processing
    set beresp.do_gzip = true;

    if (bereq.url ~ "^/(en|fr)(\?[^/]+){0,1}$" || bereq.url ~ "^/(en|fr)$") {
        set beresp.ttl = 4h;
    }
    if (bereq.url ~ "^/(en/store-finder|fr/trouver-magasin)"){
        set beresp.ttl = 1d;
    }
    if (beresp.ttl > 0s) {
                        /* 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";

                        /* marker for vcl_deliver to reset Age: */
                        set beresp.http.magicmarker = "1";
    }
}

sub vcl_deliver {
    set resp.http.X-Age = resp.http.Age;
    unset resp.http.Age;

    if (obj.hits > 0) {
            set resp.http.X-Cache = "HIT";
    } else {
            set resp.http.X-Cache = "MISS";
    }

    return (deliver);

}

información relacionada