GX博客

分享个人 Full-Stack JavaScript 项目开发经验

Nginx反向代理的缓存数据应用例子

Nginx 可以缓存来自上游服务器的响应,以便同样的请求不会再次发送给上游服务器。这样做可以减轻上游服务器的访问压力。当上游服务器发生错误或者宕机时候,也能够使用过时的缓存作为客户端的响应。

对于数据不经常发生改变、响应时间慢的请求可以考虑对其进行缓存,以提高客户端的响应速度。对于如首页这样需要确保可访问性的页面,亦可考虑当上游服务器发生错误时,使用过时的缓存响应客户端,为修复争取时间。


下面是一个缓存上游服务器响应的配置例子:

http {
    # 省略.....

    proxy_cache_path temp/proxy_cache levels=1:2 keys_zone=CACHE:10m inactive=6h max_size=1g;

    root public;

    location / {
        try_files $uri @blog_proxy;
    }

    location @blog_proxy {

        include my_proxy.conf;

        proxy_cache CACHE;

        proxy_cache_methods GET HEAD;

        proxy_cache_valid 200 1d;

        proxy_cache_background_update on;

        proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;

        proxy_pass http://blog_website;
    }

    # 省略.....
}

常用的缓存指令:

proxy_cache_path

该指令用于设置缓存的路径和其它参数。缓存数据储存在文件中。一个缓存的文件名为 proxy_cache_key 的 MD5 运算结果。(有效区段为:http)

proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
  • path

    设置缓存保存的目录。

  • levels

    该参数设置缓存目录的层级(1~3),每个级别的接受值为 1 或 2。层级用冒号分隔。

    如参数 levels=1:2 的存储结果类似于:

    /temp/proxy_temp/c/29/b7f54b2df7773722d382f4809d65029c

    目录首先会区分哈希值的最后一个字符,然后区分接下来的两个字符。

    如果单个目录中包含大量缓存文件,会使文件访问变得缓慢,一般使用如 levels=1:2 的两层目录深度。

  • use_temp_path

    缓存的响应会先被写入临时文件,然后再重命名该文件。(v0.8.9 开始,临时文件和缓存可以放在不同的文件系统上。在这情况下,文件将跨两个文件系统进行复制,而不是廉价的重命名操作。)如果该参数设置为 off,则临时文件直接放入缓存目录。如果忽略此参数或设置值为 on,则使用 proxy_temp_path 指令给定的目录。良好的安全实践是设置该目录使用权限属于同一个用户。

  • keys_zone

    所有活跃缓存键值和数据信息将会保存在该参数设置的共享内存区域,如 keys_zone=CACHE:10m。每 1m 可以存储大约 8000 个 keys。

  • inactive

    参数指定不活跃(未被访问)的缓存被删除前等待的时间(不管该缓存是否在有效期内都会被删除),即其调用超时时间。默认值为 inactive=10m(10分钟)。

  • max_size

    缓存管理器进程监视该参数设置的最大缓存大小。超过此大小时,它会删除最近最少使用的缓存数据。

    缓存数据的迭代删除配置由 manager_files、manager_threshold 和 manager_sleep 参数配置。默认值为 manager_files=100 manager_threshold=200ms manager_sleep=50ms。即每次迭代不会删除超过 100 项,一次迭代的持续时间为 200 毫秒,两个迭代之间停顿的时间为 50 毫秒。

    Nginx 启动一分钟后会激活缓存加载进程。它将存在在文件系统上的先前缓存数据的元数据加载到缓冲区。这个加载也是迭代完成的,而不是一次全部加载完。加载参数的默认值为 loader_files=100 loader_threshold=200ms loader_sleep=50ms。


proxy_cache

定义用于缓存的共享内存区域。同一个区域可以用于多个地方,并且参数可以使用变量。设置为 off,禁用从先前配置级别继承的缓存。默认值为:off。


proxy_cache_methods

该指令列出要缓存响应的客户端请求方法。 GET 和 HEAD 方法会总是被添加到列表中,但建议明确指定它们。默认值为:GET HEAD。


proxy_cache_key

定义缓存的 key,默认值为:$scheme$proxy_host$request_uri。

常用的缓存 key 变量说明如下:

变量名称说明
$scheme使用的协议名称,如 http 或 https。
$proxy_hostproxy_pass 指令指定的名称和端口号。
$request_uri完整的原始请求URI(带参数)。
$host按此优先顺序:来自请求行的主机名,Host 请求头的主机名,配置中匹配的 server 名。
$cookie_user用户的 cookie 值。
了解 Nginx 详尽的变量说明,请点击这里

proxy_cache_lock

如果开启,没有命中缓存的, proxy_cache_key 指定的属于同一个 key 的多个请求,只会有一个传递给上游服务器。其它的请求等待响应缓存的出现或者等待 proxy_cache_lock_timeout 指令指定的时间。默认值为:off。


proxy_cache_lock_age

如果上一个发送给上游服务器以产生新缓存的请求没有在该指令指定的时间内完成,则另一个请求将会发送给上游服务器。默认值为:5s。


proxy_cache_lock_timeout

设置 proxy_cache_lock 指令的超时值。当超时,请求会发送给上游服务器,然而响应不会被缓存。默认值为:5s。


proxy_cache_min_uses

设置响应生成某个 key 被缓存之前,要求请求被访问的最少次数,默认值为:1。


proxy_cache_background_update

当使用过时的缓存响应客户端时,允许启动后台子请求以更新过期的缓存项。在更新时候必须允许使用过时的缓存响应。默认值为:off。


proxy_cache_use_stale

确定在与上游服务器通信期间在哪些情况下可以使用过时的缓存作为客户端的响应。该指令的参数与 proxy_next_upstream 指令的参数一样。默认值为:off。

proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | off ...;
  • error

    如果根据 proxy_next_upstream 指令设置,没有可选择的上游服务器时,使用过时的缓存作为客户端的响应。

  • updating

    允许在更新缓存数据时,使用过时的的缓存作为客户端响应,最小化对上游服务器的访问次数。

另外,在上游服务器中设置响应头 Cache-Control 的stale-while-revalidatestale-if-error扩展同样可以设置使用过时缓存响应,优先级别比使用指令低。


proxy_cache_bypass

定义不从缓存中获取响应的条件。如果字符串参数的至少一个值不为空且不等于 0,则不会从缓存中获取响应。例如:

proxy_cache_bypass $http_pragma $http_authorization;

proxy_cache_valid

该指令用于指定对 200、301 和 302 有效响应状态码的缓存时间。如果在时间参数之前给定一个响应状态码,则仅对该响应状态码作用。特殊参数 any 代表任意响应状态码。例如:

proxy_cache_valid 200 302 10m;
proxy_cache_valid any 1m;

缓存响应参数也可以直接在上游服务器的响应头中设置,且优先级比指令高。

  • X-Accel-Expires

    指定整数值(秒),设置缓存响应有效时长。

    设置为 0,禁用缓存响应。

    使用@时间戳的形式,表示响应被缓存到这个绝对时间点。

  • Expires

    响应将会缓存到它指定的时间。

  • Cache-Control

    no-cache:禁用缓存响应。

    public:表明响应可以被任何对象(包括:发送请求的客户端,代理服务器,等等)缓存。

    private:表明响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它),可以缓存响应内容。

    no-store:缓存不应存储有关客户端请求或服务器响应的任何内容。

    max-age=<seconds>:设置缓存存储的最大周期,超过这个时间缓存被认为过期(单位为秒)。

    ......

  • Set-Cookie

    上游服务器响应设置了 Set-Cookie 头则它不会被缓存。

  • Vary

    当该响应头为 * 时,所有的请求都被视为唯一并且非缓存的。


了解更多官方 http 代理模块缓存的最新说明,请点击这里

版权声明:

本文为博主原创文章,若需转载,须注明出处,添加原文链接。

https://leeguangxing.cn/blog_post_32.html