Nginx没有通过ELB缓存请求

时间:2014-11-16 19:43:22

标签: caching nginx amazon-elb

我在ELB之间坐着nginx。我在ELB后面有几个应用程序池,nginx将流量传回给我,我想缓存静态内容。我的问题是nginx似乎没有缓存任何响应。这是缓存配置:

proxy_cache_path  /usr/share/nginx/cache/app levels=1:2 keys_zone=cms-cache:8m max_size=1000m inactive=600m;
proxy_temp_path /usr/share/nginx/cache/;

  location / {
    proxy_pass  http://cms-pool;
    proxy_cache cms-cache;
    proxy_cache_valid  200 302  60m;
    proxy_cache_valid  404      1m;
  }

经过一些阅读后,我发现可能有一些标题导致了这个问题,但在隐藏了明显的标题之后我没有运气,最后因为我隐藏了所有的后端cookie而破坏了应用程序。这些是我尝试删除的标题:

proxy_ignore_headers Cache-Control Expires Set-Cookie;
proxy_hide_header Cache-Control;
proxy_hide_header Set-Cookie;

我现在不知道为什么请求没有被缓存,这里是通过上面的头配置得到的头文件卷曲的输出(cookie等等是从nginx / elb前面设置的nginx的):

Accept-Ranges: bytes
Connection: keep-alive
Content-length: 6821
Content-Type: text/html
Date: Sun, 16 Nov 2014 19:25:41 GMT
ETag: W/"6821-1415964130000"
Expires: Thu, 01 Jan 1970 00:00:00 GMT
HTTP/1.1 200 OK
Last-Modified: Fri, 14 Nov 2014 11:22:10 GMT
Pragma: no-cache
Server: nginx/1.7.6
Set-Cookie: AWSELB=4BB7AB49169E74EC05060FB9839BD30C2CB1D0E43D90837DC593EB2BA783FB372E90B6F6F575D13C6567102032557C76E00B1F5DB0B520CF929C3B81327C1D259A9EA5C73771C4EA3DB6390EB40484EDF56491135B;PATH=/
Set-Cookie: frontend=CgAAi1Ro+jUDNkZYAwMFAg==; path=/

更新我发现以上内容并不完全准确,因为有一个302指示用户登录,这会触及另一个没有静态资源的后端,因此上面的标题即将到来从登录后端。我调整了URI以指向图像,但没有发生缓存。我正在使用以下位置块:

  location /app/images {
    proxy_pass  http://cms-pool/app/images;
    proxy_cache cms-cache;
    proxy_cache_valid  200 302  60m;
    proxy_cache_valid  404      1m;
    proxy_ignore_headers Cache-Control Expires Set-Cookie;
    proxy_hide_header Cache-Control;
    proxy_hide_header Set-Cookie;
  }

这些是现在即将出现的标题:

Accept-Ranges: bytes
Connection: keep-alive
Content-length: 12700
Content-Type: image/png
Date: Mon, 17 Nov 2014 09:25:38 GMT
ETag: "0cd80ce9afecf1:0"
HTTP/1.1 200 OK
Last-Modified: Wed, 12 Nov 2014 17:05:06 GMT
Server: nginx/1.7.6
Set-Cookie: AWSELB=4BB7AB49169E74EC05060FB9839BD30C2CB1D0E43D638163025E92245C6C6E40197CA48C5B22F3E8FDA53365109BC1C16C808322881855C100D4AC54E5C0EC6CDE91B96151F66369C7B697B04D2C08439274033D81;PATH=/
Set-Cookie: tscl-frontend=CgAK1FRpvxI4b0bQAwMEAg==; path=/
X-Powered-By: ASP.NET

1 个答案:

答案 0 :(得分:0)

这是由于ELB背后的HTTP缓存标头的不稳定实现造成的。

Per RFC 2616(HTTP 1.1):

  

Pragma指令必须由代理或网关传递    应用程序,无论其重要性如何,    因为指令可能适用于所有接收者    请求/响应链。

     

HTTP / 1.1缓存应该对待" Pragma:no-cache" 好像客户端了    发送"缓存控制:无缓存" 。没有新的Pragma指令    在HTTP中定义。

     

注意:因为" Pragma:no-cache 的含义作为回应    标题字段实际上没有指定,它没有提供    可靠替换"缓存控制:无缓存"在回复中

Pragma: no-cache标题并不代表HTTP回复中的任何内容,因为RFC的行为未指定

但是,由于nginx在您的情况下充当(反向)代理,它将尊重标头,就像它是Cache-Control: no-cache标头一样,以保持与{1.0中定义的HTTP 1.0协议的Pragma标头的兼容性}}

它也会通过客户端的响应标头传递它,因为它不必假设它的实际含义。

因此要么纠正这个错误的实现,要么将Pragma标头附加到proxy_ignore_headersproxy_hide_header指令。