首先谈谈遇到的问题: 一个Nginx架在一个后端服务的前面,Nginx proxy_pass到它并开启proxy_cache,假设这个后端服务总是会吐Etag响应头。 在应用中,我们发现当nginx 的proxy_cache成功将后端的页面cache住时,浏览器多次对该页面发起请求,会命中nginx的cache,但即使浏览器请求带了If-None-Match请求头,nginx却不会响应304,而是响应200. 这样带来的问题是,即使nginx的cache将请求阻挡在后端应用之外,但是: (1)命中后每次响应200导致我们nginx所在的服务器和客户浏览器双方都有流量损耗 (2)更重要的是增长了我们的服务响应时间。因为,如果是304的话,nginx不需要向浏览器吐数据,只用告诉浏览器用本地的缓存就好了。 排查过程涉及个版本的测试和代码比对,这里就省略了,下面说下结论: 一. nginx-1.7.3之前的版本:
二.nginx-1.7.3及其之后的版本: 首先我们看看nginx-1.7.3的changelog: Changes with nginx 1.7.3 08 Jul 2014 *) Feature: weak entity tags are now preserved on response modifications, and strong ones are changed to weak. *) Feature: cache revalidation now uses If-None-Match header if possible. *) Feature: the "ssl_password_file" directive. *) Bugfix: the If-None-Match request header line was ignored if there was no Last-Modified header in a response returned from cache. *) Bugfix: "peer closed connection in SSL handshake" messages were logged at "info" level instead of "error" while connecting to backends. *) Bugfix: in the ngx_http_dav_module module in nginx/Windows. *) Bugfix: SPDY connections might be closed prematurely if caching was used. 可以看到,主要有两点:
那么,在nginx-1.7.3及其以后的版本,其Etag功能可以描述如下:
(责任编辑:IT) |