11. Nginx缓存

Posted 思过崖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了11. Nginx缓存相关的知识,希望对你有一定的参考价值。

缓存类型

  1. 浏览器缓存
  2. nginx代理服务器缓存
  3. 服务器缓存,例如Redis、Memcache等

缓存配置

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_path

upstream backend {
    server x.x.x.x:1023;
    server x.x.x.x:1024;
    server x.x.x.x:1025;
}

# 缓存存放的位置是 /data/nginx/cache,也可以通过访问这个目录来排查缓存是否成功生成
# levels=1:2,将缓存分两级目录进行存储,如果把大量的缓存文件都放在一个文件夹下面,会降低磁盘文件的读取速度
# max_size 设置缓存文件能够占用的最大磁盘空间,避免磁盘爆满
# keys_zone 设置缓存key存放的内存空间以及空间大小。1M 的内存空间可以存储大概8000个key
# inactive 如果资源在多长时间内没有被访问,就自动删除
# use_temp_path 是否使用临时存储区域,建议选择否,避免在文件系统中产生不必要的重复数据 

proxy_cache_path /data/nginx/cache levels=1:2 max_size=10g keys_zone=default_cache:10m inactive=60m use_temp_path=off;

server {
    ...
    location / {
    
        # 使用backend负载均衡组
        proxy_pass http://backend;
        # 使用 default_cache 缓存配置
        proxy_cache default_cache;
        # 使用$uri作为缓存key
        proxy_cache_key $uri;
        
        # 对于以下特定情况,继续请求负载均衡组里面的其他服务器
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        # 如果后端集群服务器异常或返回如下状态码的时候,则返回缓存内容,避免直接返回报错的页面,给用户更好的体验
	    proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
        # 针对后端集群服务器200、304的响应header,设置缓存的有效期为12小时
        proxy_cache_valid 200 304 12h;
        # 非200、304的响应缓存时间为10m
        proxy_cache_valid any 10m;
        
        # 由于缓存服务器默认需要遵守源服务器的缓存规则,如果不忽略源服务器返回的特定响应头,可能缓存失败
        proxy_ignore_headers Cache-Control Expires Set-Cookie;
        # 如果请求中含有参数或者为授权请求,则不缓存 
        proxy_no_cache $http_pragma    $http_authorization;
        
        
        # 当客户端存在缓存,但是该缓存已过期的时候,用于支持客户端在传递 If-Modified-Since 参数的时候,返回Last-Modified
        proxy_cache_revalidate on;
        # 如果缓存文件需要更新,正在从后端集群中拉取,此时先返回旧版本的文件内容(有的版本不支持)
        proxy_cache_background_update on;
        # 如果有大量请求进来,且没有找到对应的缓存,则只允许第一个请求去访问后端集群,然后生成缓存之后,再返回缓存给其他请求
        proxy_cache_lock on;
        # 当资源被客户端请求了多少次之后才开始缓存,这有助于节省缓存空间,只缓存一些访问较为频繁的资源
        proxy_cache_min_uses 1;
        
        # 向客户端返回一个是否击中缓存的头信息
        add_header Nginx-Cache "$upstream_cache_status";
    }
}

服务器响应

返回给客户端的 Response Header

HTTP/1.1 200 OK
Server: nginx
Date: Sat, 06 Jun 2020 08:49:56 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Cache-Control: private, must-revalidate
pragma: no-cache
expires: -1
Set-Cookie: XSRF-TOKEN=eyJpdiI6Ik1Lb2RxSzlYYWFBREJVQkNSdThCZ1E9PSIsInZhbHVlIjoiZEl0TVVETVFSYk8wQk9JR0UzUW4zU2E4c1R1eWJqeldHbXBEU0g4Q2tkZ3FPWXYrSlNielZ6a0w1WE5BMnNsRlNyRFoyT3VXTE40bFdQTTdPaGNybkE9PSIsIm1hYyI6IjNmZmJmNzc1NmMwMDcyZDNlMTExY2EyMzA1Nzk3YjgzNzgwYmU4NjAwNGY1ZGE5NzQ1NDFkZjE1MjAxNzAyZTIifQ%3D%3D; expires=Sat, 06-Jun-2020 10:49:25 GMT; Max-Age=7200; path=/
Set-Cookie: laravel_session=eyJpdiI6InNWQnY5M1dCWUdMcHNPSlFSZkcxMVE9PSIsInZhbHVlIjoibDBEUzhkSHNtWkUxN0d4MnAwNFpaRmtSaDdqTHpEeFNUdUd6Y0NxTFhhblFtcmwwV0tNbnFNVXZpelZza0xiNWZ5dEpLVzdETUZueThCcXlhcXZ1cFE9PSIsIm1hYyI6IjljZmIxZWE4MmYyMjBmYWY4N2E1Mjc3Mzg0ZDZkZGYzMTUzMDMzNjQzYmQ4NDFhMTc3MDVlNmMxNDgwYzAyMDkifQ%3D%3D; expires=Sat, 06-Jun-2020 10:49:25 GMT; Max-Age=7200; path=/; HttpOnly
Nginx-Cache: HIT
Content-Encoding: gzip
  • Nginx-Cache: 为 HIT, 告诉客户端命中了缓存
  • Cache-Control :private 表明响应只能被单个用户缓存,不能作为共享缓存;must-revalidate 表示一旦资源过期(比如已经超过max-age),必须先成功向原始服务器进行验证,方能继续使用。
  • pragma:no-cache 强制要求缓存服务器在返回缓存的版本之前将请求提交到源头服务器进行验证。pragma 用来向后兼容只支持 HTTP/1.0 协议的缓存服务器,那时候 HTTP/1.1 协议中的 Cache-Control 还没有出来
  • expires: 为 -1,表示永不过期

缓存清理

  • rm -rf 缓存目录
  • 使用 ngx_cache_purge 模块清理特定缓存

参考资料

专题阅读

以上是关于11. Nginx缓存的主要内容,如果未能解决你的问题,请参考以下文章

为 memcached 和 Rails 组合片段和对象缓存的最佳方式

Android获取各个应用程序的缓存文件代码小片段(使用AIDL)

Nginx——Nginx启动报错Job for nginx.service failed because the control process exited with error code(代码片段

Nginx——nginx作为缓存服务(缓存示例)

Nginx——nginx作为缓存服务(部分页面不缓存示例)

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题