当Nginx是后端服务器时,Varnish一直在收到MISS

我遇到了一个非常奇怪的情况,Varnish直接打到应用程序服务器(Play服务器),但不能与Nginx一起作为Web服务器。

  • 工作:清漆:6081 =>播放:9000
  • 非工作:清漆:6081 => Nginx:80(播放上游的反向代理)=>播放:9000

Nginx的configuration很简单

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; } 

非工作光油请求日志

 * << 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 UF - 175253 2677572 80 1173648 1401956 -- Gzip GFE 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 

加工

 * << 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 

这是我的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); }