Nginx缓存集成
缓存概述
客户端的所有请求直接请求服务端, 会影响服务端的性能. 如: 接收过多请求, 压力增大, 某些操作比较耗时, 影响响应速度. 所以引入缓存机制可以大大减轻服务器压力.
用户请求资源数据时, 先从缓存中查看, 若缓存中存在则直接返回给客户, 若不存在, 才请求服务器资源获取, 在返回用户的同时将其放入缓存, 下次就可以直接从缓存中获取
缓存使用场景:
| 场景 |
作用 |
| 操作系统磁盘缓存 |
减少磁盘机械操作 |
| 数据库缓存 |
减少文件系统IO操作 |
| 应用程序缓存 |
减少对数据库的查询 |
| Web服务器缓存 |
减少对应用服务器请求次数 |
| 浏览器缓存 |
减少后台交互次数 |
缓存优点:
减少数据传输, 节省网络带宽流量, 加快响应速度, 提升用户体验
减轻服务器压力
提供服务端高可用性
缓存缺点:
数据的即时性和一致性可能有延迟
增加成本
Nginx的web缓存服务
基于proxy store实现, 将URL及相关组合当做key, 在使用MD5算法对key进行哈希, 的到硬盘对应的哈希目录路径, 从而将缓存内容保存在该目录中. Nginx支持对指定URL或者状态码设置过期时间, 也可以使用purge命令手动清除指定URL缓存

Nginx缓存设置指令
Nginx的web缓存服务主要是使用ngx_http_proxy_module完成,常用指令如下:
1
| 文档: https://nginx.org/en/docs/http/ngx_http_proxy_module.html
|
proxy_cache_path指令
用于设置缓存文件的存储路径
1 2 3 4
| 语法: proxy_cache_path path [levels=number] keys_zone=zone_name:zone_size [inactive=time] [max_size=size] 位置: http块
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| - path 为缓存路径地址, 如: /usr/local/proxy_cache
- levels 指定缓存空间子目录等级, 最多设置三层, 每层取值为1或2. 如: levels=1:2 代表缓存空间有两层, 第一层是一个字符, 第二层是两个字符 设置key=ni9ne, 通过MD5编码后为:f5d6316dd7ab283c02f90cd236dce1cc levels=1:2 最终存储路径为: /usr/local/proxy_path/c/1c levels=2:1:2最终存储路径为: /usr/local/proxy_path/cc/1/ce
- key_zone 指定该缓存区名称和大小. 如: key_zone=ni9ne:200m 代表缓存区的名称为ni9ne,大小为200m
- inactive 指定缓存数据多久时间未访问才会删除.如: inactive=1d 代表数据仅缓存1天, 1天内没有访问就会删除
- max_size 设置最大缓存空间, 若空间已满, 默认覆盖缓存时间最长的资源 max-size=20g
|
配置实例:
1 2 3 4 5
| http{ ... proxy_cache_path /usr/local/proxy_cache levels=2:2 keys_zone=ni9ne:200m inactive=1d max_size=20g ... }
|
proxy_cache指令
用于开启或关闭指定缓存配置
1 2 3 4 5 6
| 语法: proxy_cache zone_name [off]; 默认值: proxy_cache off; 位置: http server location块
|
proxy_cache_key指令
用于指定web缓存的key值, Nginx会依据key值MD5哈希存储缓存
1 2 3 4 5 6
| 语法: proxy_cache_key key; 默认值: proxy_cache_key $scheme$proxy_host$request_uri; 位置: http server location块
|
proxy_cache_valid指令
用于对不同返回状态码的URL设置不同的缓存时间
1 2 3 4
| 语法: proxy_cache_valid [code] time; 位置: http server location块
|
1 2 3 4 5 6
| 如: proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; # 设置200和302响应的URL缓存10分钟, 响应404的URL缓存1分钟 proxy_cache_valid any 1m; # 对所有响应状态码的URL都设置1分钟缓存
|
proxy_cache_min_uses指令
用于设置资源被访问多少次后备缓存
1 2 3 4 5 6
| 语法: proxy_cache_min_uses; 默认值: proxy_cache_min_uses 1; 位置: http server location块
|
proxy_cache_methods指令
用于设置缓存哪些方法的请求
1 2 3 4 5 6
| 语法: proxy_cache_methods GET|HEAD|POST; 默认值: proxy_cache_methods GET HEAD; 位置: http server location块
|
Nginx缓存设置案例
客户端请求134服务器, 获取jquery.js文件, 但文件存在于135服务器中, 服务器134在获取135资源后, 将其缓存, 后续请求资源将从缓存中获取
环境准备
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| server{ listen 80; server_name localhost; location /js{ root /var/www/project/; index index.html; } }
server { listen 80; server_name localhost; location /js { proxy_pass http://192.168.253.135/js/; } }
|
添加缓存配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| http{ ... proxy_cache_path /usr/local/proxy_cache levels=2:2 keys_zone=ni9ne:200m inactive=30s max_size=20g ... server { listen 80; server_name localhost; location /js { proxy_cache ni9ne; proxy_cache_key $scheme$proxy_host$request_uri; proxy_cache_valid 200 20s; proxy_cache_valid 404 30s; proxy_cache_valid any 1m; proxy_cache_min_uses 5; add_header Nginx-Cache-Status "$upstream_cache_status"; proxy_pass http://192.168.253.135/js/; } } }
|
验证缓存结果


Nginx缓存清除
方式一: 删除对应缓存目录
1
| $ sudo rm -rf /usr/local/proxy_pass/...
|
方式二: 第三方扩展模块
使用ngx_cache_purge模块清除缓存, 需要安装模块
1
| 模块: https://github.com/FRiCKLE/ngx_cache_purge
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| http { proxy_cache_path /usr/local/proxy_cache levels=2:2 keys_zone=ni9ne:200m inactive=30s max_size=2g; server { location /js { proxy_cache ni9ne; proxy_cache_key $scheme$host$request_uri; proxy_cache_valid any 1m; add_header Nginx-Cache-Status "$upstream_cache_status"; add_header Nginx-Cache-Key "$scheme$host$request_uri"; proxy_pass http://192.168.253.135/js/; } location ~ /purge(/.*) { proxy_cache_purge ni9ne $scheme$host$1; } } }
|
访问清除页面结果

Nginx设置资源不缓存
对不需要缓存的数据进行指定, 使用以下指令可以实现
proxy_no_cache指令
定义不缓存数据的条件
1 2 3 4
| 语法: proxy_no_cache string ...; 位置: http server location块
|
1 2
| proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
|
proxy_cache_bypass指令
设置不从缓存中获取数据的条件
1 2 3 4
| 语法: proxy_cache_bypass string ...; 位置: http server location块
|
1 2
| proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment;
|
上述两个指令均支持多个条件, 且可以同时使用, 条件中只要至少有一个不为空且不等于’0’, 则条件满足成立, 不缓存或不获取缓存数据
涉及内置变量介绍
1 2 3 4 5
| - $cookie_nocache 当前请求的cookie中键为nocache对应的值 测试可使用 add_header Set-Cookie 'nocache=1' - $arg_nocache/$arg_comment 当前请求的参数中属性名为nocache和comment对应的属性值
|
案例实现
1 2 3 4 5 6 7 8 9 10 11 12 13
| http { server { location /js { if ($request_uri ~ /.*\.js$){ set $my_cache_sign 1; } proxy_cache ni9ne; proxy_pass http://192.168.253.135/js/; proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment $my_cache_sign; } } }
|
