🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 什么是 Nginx 缓存 Nginx 基于Proxy Store 实现,使用 Nginx 的 `http_proxy `模块可以实现类似于squid 的缓存功能。当启用缓存时,Nginx 会将相应数据保存在磁盘缓存中,只要缓存数据尚未过期,就会使用缓存数据来响应客户端的请求。 ## 启用缓存 1. 在 http 模块下配置`proxy_cache_path `命令: ~~~ proxy_cache_path /data/cache keys_zone=huancun:10m; ~~~ 第一个参数指定缓存保存的本地路径;第二个参数定义缓存数据的共享内存区域的名称和内存区大小。 Nginx 启动后,缓存加载程序只进行加载一次,加载时会将缓存的元数据加载到共享内存区域,但是如果一次加载整个缓存全部内容可能会使 Nginx 刚启动的前几分钟性能消耗严重,大幅度降低 Nginx 的性能。所以可以在 `proxy_cache_path`命令中配置缓存迭代加载。缓存迭代加载一共可以设置三个参数: - loader_threshold:迭代的持续时间 (毫秒)(默认 200) - loader_files:在一次迭代期间加载的最大项目(毫秒)(默认 100) - loader_sleeps:迭代之间的延迟(毫秒)(默认为50) 例: ~~~ proxy_cache_path /data/cache keys_zone=niyueling:10m loader_threshold=300 loader_files=200; ~~~ 2. 在虚拟服务器配置中配置`proxy_cache`命令: ~~~ proxy_cache huancun; ~~~ 指定内存区。 > ps:通过配置 proxy_cache_path 中的 keys_zone 参数内存大小为 10m,并不会限制缓存数据大小,实际上缓存数据是存储在文件系统中的特定文件的元数据副本。如果想要限制缓存数据的上限,则需要在proxy\_cache\_path命令中添加max\_size参数设置缓存数据上限 3. 在虚拟服务器下配置`proxy_cache_methods`命令指定该虚拟服务器下什么类型的 HTTP 方法可以被缓存 ~~~ proxy_cache_methods[GET HEAD POST]; ~~~ 默认情况下 `GET` 请求及 `HEAD` 请求会被缓存,而`POST`请求不会被缓存。 4. `proxy_cache_vaild` 针对不同状态码的响应数据设置不同的缓存时间 ~~~ proxy_cache_valid reply_code [reply_code...] time; ~~~ 例: ~~~ proxy_cache_valid 200 10m; # 200状态码的缓存时间为 10 分钟 proxy_cache_valid 404 1m; # 404的缓存时间为 1 分钟 proxy_cache_valid 302 5m; # 302重定向的缓存时间为 5 分钟 proxy_cache_valid any 5m; # 所有状态缓存时间 5 分钟 ~~~ 5. `proxy_cache_bypass` ~~~ proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment; ·~~~ 配置不从缓存中获取响应的条件。如果URL中包含该配置的值,则这次请求会直接跳过缓存直接请求后端服务去获取数据 6. `proxy_cache_min_uses` ~~~ proxy_cache_min_uses 2; ~~~ 设置当某请求最少响应几次后会被缓存, 默认 1。 ## 清除缓存 如果缓存过期则需要从缓存中删除过期的缓存文件,防止新旧缓存出现交错出错,当Nginx接收到自定义HTTP头或者PURGE请求时,缓存将会被清除。 ### 配置缓存清除 http 模块下创建一个新变量 `$purge_method` 来标识使用 `PURGE `方法的请求并删除匹配的 URL。 ~~~ http { map $request_method $purge_method { PURGE 1; default 0; } } ~~~ 进入虚拟服务器配置,在location中配置高速缓存,并且指定缓存清除请求命令`proxy_cache_purge`。 ~~~ server { listen 80; server_name huancun.test; location / { proxy_cache huancun; proxy_cache_purge $purge_method; } } ~~~ ### 发送清除命令 发送PURGE请求来清除缓存 ~~~ PURGE huancun.test ~~~ 这些高速缓存数据不会从缓存中完全删除,它们将保留在磁盘上,直到它们被删除为非活动状态,或由缓存清除进程处理。 ### 限制IP访问清除命令 ~~~ geo $purge_allowed { default 0; 192.168.1.100/24 1; } map $request_method $purge_method { PURGE $purge_allowed; default 0; } ~~~ 当Nginx接收到清除缓存请求时,Nginx 检查客户端 IP 地址,若 IP 地址已经获得清除缓存权限,则`$purge_method`设置为`$purge_allowed`,值为 1 表示允许清除缓存,值为0表示表示 IP 地址未获得权限。 > 相关函数文档:https://nginx.org/en/docs/http/ngx_http_proxy_module.html