• 【原创】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的时候也更简单;

  • 相关阅读:
    查询数据库对象依赖关系
    SQL Server数据库管理员必备:DBCC命令
    使用延迟的FileSystemWatcher来避免重复触发事件
    在Lambda表达式中使用递归
    如何观察SQL Server 生成和重用执行计划
    利用Lambda表达式、扩展方法以及泛型来实现一个另类的AOP
    将 SQL Server 2000 系统表映射到 SQL Server 2005 系统视图[MSDN]
    利用Lambda表达式、扩展方法以及泛型来为对象添加方法
    C# 中编译器是如何实现闭包的
    在ASP.NET中使用FileSystemWatcher来监控文件目录
  • 原文地址:https://www.cnblogs.com/barneywill/p/10116849.html
Copyright © 2020-2023  润新知