Java基础之Nginx缓存

 

1 proxy_ignore_headers

1.1 Set-Cookie

By default, nginx does not caches requests with Set-Cookie.

默认情况下:Nginx不会缓存response中带有Set-Cookie的请求;

 

If a header includes the “Set-Cookie” field, such a response will not be cached. Processing of one or more of these response header fields can be disabled using the proxy_ignore_headers directive.

这时需要使用proxy_ignore_headers指令;

 

Nginx会根据proxy_ignore_headers忽略resin返回的response中的相关的header;

proxy_ignore_header指令:

Disables processing of certain response header fields from the proxied server. The following fields can be ignored: “X-Accel-Redirect”, “X-Accel-Expires”, “X-Accel-Limit-Rate” (1.1.6), “X-Accel-Buffering” (1.1.6), “X-Accel-Charset” (1.1.6), “Expires”, “Cache-Control”, and “Set-Cookie” (0.8.44).

1.2 Cache-Control

Public  指示响应可被任何缓存区缓存。

Private  指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。

no-cache  指示请求或响应消息不能缓存(HTTP/1.0用Pragma的no-cache替换)

 

根据什么能被缓存

no-store  用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。

根据缓存超时

max-age  指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。

min-fresh  指示客户机可以接收响应时间小于当前时间加上指定时间的响应。

max-stale  指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

 

经测试,cache-control为private和no-cache时也不能生成缓存文件;

也需要使用proxy_ignore_header指令:

 

 

1.3 Expires

Parameters of caching can also be set directly in the response header. This has a higher precedence than setting of caching time using the directive. The “X-Accel-Expires” header field sets caching time of a response in seconds. The value 0 disables to cache a response. If a value starts with the prefix @, it sets an absolute time in seconds since Epoch, up to which the response may be cached. If header does not include the “X-Accel-Expires” field, parameters of caching may be set in the header fields “Expires” or “Cache-Control”. 

 

Expires和Cache-Control会影响缓存的有效期,这个有效期默认是在配置文件中配置的:

 

除非确实想由resin来设置过期时间,也需要使用proxy_ignore_header指令:

 

经过以上三步配置后,nginx会忽略resin返回response中影响缓存是否生成以及缓存时间的header,缓存文件就可以正常生成;

 

2 proxy_hide_header

By default, nginx does not pass the header fields “Date”, “Server”, “X-Pad”, and “X-Accel-...” from the response of a proxied server to a client. Theproxy_hide_header directive sets additional fields that will not be passed.

 

由于第一次访问resin,resin会返回Set-Cookie:JSESSIONID=…,而nginx会将resin的返回原封不动的存为缓存文件:

 

打开缓存文件发现,第一行为乱码,可能是nginx控制缓存时间相关的字节,第二行为该缓存文件的KEY,下边就是一个完整的HTTP响应,包括完整的header和body,命中缓存的时候,nginx会将该响应直接返回而不再请求resin;

为了避免串Session的问题,需要增加proxy_hide_header指令:

 

来保证nginx在使用缓存的同时隐藏响应中相关header;

 

Proxy_hide_header指令:

 

详细请查看 http://wiki.nginx.org/HttpProxyModule

 

3 memcached module

另外,nginx还有一个memcached模块也可以用来作为页面缓存,即Nginx / memcached module:

The Nginx / Memcached module allows you to setup the previous architecture, using Nginx as a HTTP reverse proxy, and Memcached as storage. (Note: memcached is often used as shared HTTP session storage)

The module Nginx memcached works very well. But it has a big limitation: it can not store HTTP headers with data. For example, pages served by Nginx via Memcached storage have the default Nginx Content-Type. Moreover, it is quite difficult to store multiple type of data in Memcached : CSS, JS, images, HTML, json … You can add some specifics HTTP headers, but only in Nginx configuration. These headers will be shared by every resources served by Nginx/Memached, unless you put lot of ugly “if” in the configuration.

使用memcached做页面缓存的话避免了使用proxy_cache在每台nginx上都有一份缓存的问题,而且purge的时候也更简单;

posted @ 2019-06-16 22:22  匠人先生  阅读(765)  评论(0编辑  收藏  举报