11.|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"; } }

服务器响应
【11.|11. Nginx缓存】返回给客户端的 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 模块清理特定缓存
参考资料
  • Cache-Control https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Cache-Control
  • nginx缓存优先级 http://www.ttlsa.com/nginx/nginx-cache-priority/
  • A Guide to Caching with NGINX and NGINX Plus https://www.nginx.com/blog/nginx-caching-guide/
专题阅读
  • 1. Nginx的优点
  • 2. Nginx的安装与开机自启
  • 3. Nginx目录和配置语法
  • 4. Nginx模块
  • 5. Nginx静态资源处理
  • 6. Nginx浏览器缓存原理
  • 7. Nginx资源的跨域访问
  • 8. Nginx资源的防盗链
  • 9. Nginx代理
  • 10. Nginx负载均衡
  • 11. Nginx缓存
  • 12. Nginx动静分离
  • 13. Nginx Rewrite
  • 14. Nginx Secure Link
  • 15. Nginx Geo
  • 16. Nginx HTTPS服务
  • 17. Nginx与Lua开发
  • 18. Nginx与Lua灰度发布
  • 19. Nginx常见错误
  • 20. Nginx性能优化
  • 21. Nginx安全管理

    推荐阅读