Nginx高级(九):nginx缓存配置、nginx proxy_cache缓存模块指令详解

article/2025/5/6 17:53:32

一、nginx缓存

1、什么是缓存?

1.缓存的基本概述

缓存的基本思想是利用客户端访问的时间局限性,将客户端访问过的内容做一个副本,在一定时间内存放到本地,当改数据下次被访问时,不必连接到后端服务器反复去查询数据,而是由本地保存的副本响应数据。

保存在本地的这些副本具有一个过期时间,超过该时间将会更新。判断一个副本数据是否为过期数据的办法有很多,可以使用保留时间来判断,也可以使用数据完整度来判断。

许多Web服务器还具有校验功能,就是当某些副本数据过期以后,先向后端服务器发送校验请求,后端服务器对这些数据进行校验,如果发现原数据和副本没有差别,则将过期副本重新置为可用副本。

2.缓存的好处

1、减轻服务器负载
2、提供网页响应效率
3、降低网络阻塞,增强网络可扩展性

3.为什么使用缓存?

1、服务器处理能力以及负载能力出现瓶颈,响应效率大大降低
2、为了减少网络传输延迟,提升响应效率
3、能够避免因为后端服务器出现异常以及网络故障,客户端请求数据副本能够及时响应

2、nginx的缓存机制

proxy模块指令
在这里插入图片描述
以上nginx配置结合使用:

http {...proxy_cache_path /cache/nginx levels=1:2 keys_zone=imooc_cache:10m max_size=5g inactive=60m use_temp_path=off;...server {...location /api/ {proxy_cache imooc_cache;proxy_pass http://www.blogs-s.com:8080/api/;proxy_cache_valid 200 304 12h;proxy_cache_valid any 10m;proxy_cache_key $host$uri$is_args$args;include proxy_params;}}
}

tip: server配置完整版示列:(域名自行配置)

server
{listen 80;server_name www.blogs.com;root /www/blog;index  index.html index.php;location /api/ {proxy_cache imooc_cache;proxy_pass http://www.blogs-s.com:8080/api/;proxy_cache_valid 200 304 12h;proxy_cache_valid any 10m;proxy_cache_key $host$uri$is_args$args;include proxy_params;}location ~ /clear_cache(.*) {allow   all;proxy_cache_purge imooc_cache $host$1$is_args$args;}
}

proxy_params文件(nginx.conf目录同级)的配置如下:

proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;

访问一次页面,并向 http://www.blogs-s.com:8080/api/ 发起一个接口数据请求,查看/cache/nginx目录下的缓存结果:

[root@localhost /]# cat /cache/nginx/b/e1/a88f32c1bd828f3a614ab8584c74ae1b
KEY: www.blogs.com/api/index.php
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Mon, 22 Mar 2021 16:23:18 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 36
Connection: close
X-Powered-By: PHP/7.4.16{"message":"this is api","code":304}
[root@localhost e1]#

tip:缓存配置指令详解

在这里插入图片描述

3、清除缓存

ngx_cache_purge介绍

ngx_cache_purge是nginx的第三方模块,能够帮助我清除nginx中的缓存。

在之前的nginx编译安装中我们是没有把缓存的清除模块ngx_cache_purge编译进去的,如果启动了缓存,没有安装这个模块,在之后的调试中我们尝试去清除缓存时,将会出现异常:

2021/11/26 11:17:49 [emerg] 12180#0: unknown directive "proxy_cache_purge" in /vhost/blog.conf:24

这个异常是在指示我们,找不到该指令的驱动,需要按照相关模块。

ngx_cache_purge只是nginx的第三方模块,并不是某个特殊的软件,所以我们需要对nginx重新进行编译,操作如下:

./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-http_gzip_static_module --with-http_stub_status_module --with-file-aio --with-http_realip_module --with-http_ssl_module --with-pcre=/home/pcre-8.44 --with-zlib=/home/zlib-1.2.11 --with-openssl=/home/openssl-1.1.1g --add-module=/home/ngx_cache_purge-2.3make -j2make install

配置nginx:

location ~ /clear_cache(.*) {allow   all;proxy_cache_purge imooc_cache $host$1$is_args$args;
}

再一次启动nginx成功;

接下来进行缓存清除测试,访问:http://blogs.com/clear_cache/api/index.php, 访问这个连接将会清除接口:http://blogs.com/api/index.php 的缓存数据。

结果如下:
在这里插入图片描述

4、 控制nginx缓存(如何控制nginx缓存什么数据不缓存什么数据?)

在项目开发中,不可能出现什么都需要缓存的数据,缓存仅仅适合去缓存查询频繁,但是不需要实时更新的数据,这个是它适合的场景,而我们上面的配置,只要是访问api接口目录就会缓存接口的数据,这样对于一些需要实时更新的接口数据来说是不合理的,需要控制好nginx的缓存去缓存什么以及不缓存什么

server
{...location /api/ {set $a 0;if ( $request_uri ~ /api/noapi/(.*) ){set $a 1;}proxy_no_cache $a;...}location ~ /clear_cache(.*) {allow   all;proxy_cache_purge imooc_cache $host$1$is_args$args;}
}

set 指令为变量设置,proxy_no_cache参数中的值可以设置多个,但是多个值中,只要有一个是不为0的,就会通过缓存响应数据。

二、proxy_cache缓存模块指令详解

1.proxy_cache 指令

该指令用于配置一块公用的内存区域的名称,该区域可以存放缓存的索引数据。这些数据在Nginx服务器启动时由缓存索引重建进程负责建立,在Nginx服务器的整个运行过程中由缓存管理进程负责定时检测过期数据,检索等管理工作。

proxy_cache zone | off;zone,设置的用于存放缓存索引的内存区域的名称。
off,关闭proxy_cache 功能,是默认的设置。

2.proxy_cache_bypass指令

该指令用于配置Nginx服务器向客户端发送响应数据时,不从缓存中获取的条件。这些条件支持使用Nginx 配置的常用变量。

proxy_cache_bypass string ..;string为条件变量,支持设置多个,当至少有一个字符串指令不为空或者不等于О时,响应数据不从缓存中获取。

看一个例子:

proxy_cache _bypass $cookie_nocache $arg nocache $Sarg_comment $http_pragma $http.authorization;其中,Scookie_nocache、Sarg_nocache、Sarg_comment、Shttp_pragma 和Shttp_authorization 都是Nginx配置文件的变量

3.proxy_cache_key指令

该指令用于设置Nginx服务器在内存中为缓存数据建立索引时使用的关键字。

proxy cache key string;string为设置的关键字,支持变量。

如果我们希望缓存数据包含服务器主机名称等关键字,则可以将该指令设置为:

proxy_cache_key "$scheme$host$request";

4.proxy_cache_lock指令

该指令用于设置是否开启缓存的锁功能。在缓存中,某些数据项可以同时被多个请求返回的响应数据填充。开启该功能后,Nginx服务器同时只能有一个请求填充缓存中的某一数据项,这相当于给该数据项上锁,不允许其他请求操作。其他的请求如果也想填充该项,必须等待该数据项的锁被释放。这个等待时间由 proxy_cache_lock_timeout 指令配置。

proxy_cache_lock on | off;默认情况下为关闭

5.proxy_cache_lock_timeout指令

该指令用于设置缓存的锁功能开启以后锁的超时时间。具体细节参见proxy_cache_lock 指令的相关内容。

proxy cache_ lock_timeout time;其中,time为设置的时间,默认为5s。

6.proxy_cache_min_uses指令

该指令用于设置客户端请求发送的次数,当客户端向被代理服务器发送相同请求达到该指令设定的次数后,Nginx服务器才对该请求的响应数据做缓存。合理设置该值可以有效地降低硬盘上缓存数据的数量,并提高缓存的命中率。

proxy_cache_min_uses number;其中,number为设置的次数。默认设置为1。

7.proxy_cache_path指令

该指令用于设置Nginx服务器存储缓存数据的路径以及和缓存索引相关的内容。

proxy_cache_path [levels=levels] keys_zone=name:sizel [inactive=time1] [max_size=size2][loader_files=number] [loader_sleep=time2]
[loader_threshold-time3];path,设置缓存数据存放的根路径,该路径应该是预先存在于磁盘上的。levels,设置在相对于path指定目录的第几级hash目录中缓存数据。
levels=1:表示一级hash目录;levels=1:2,表示两级,依次类推。目录的名称是基于请求URL通过哈希算法获取到的。
name:sizel,Nginx服务器的缓存索引重建进程在内存中为缓存数据建立索引,这一对变量用来设置存放缓存索引的内存区域的名称和大小。
timel,设置强制更新缓存数据的时间,当硬盘上的缓存数据在设定的时间内没有被访问时,Nginx服务器就强制从硬盘上将其删除,下次客户端访问该数据时重新缓存。该指令默认设置为10s。
size2、设置硬盘中缓存数据的大小限制。我们知道,硬盘中的缓存源数据由Nginx服务器的缓存管理进程进行管理,当缓存的大小超过该变量的设置时,缓存管理进程将根据最近最少被访问的策略删除缓存。
number ,设置缓存索引重建进程每次加载的数据元素的数量上限。在重建缓存索引的过程中,进程通过一系列的递归遍历读取硬盘上的缓存数据目录及缓存数据文件,对每个数据文件中的缓存数据在内存中建立对应的索引,我们称每建立一个索引为加载一个数据元素。进程在每次遍历过程中可以同时加载多个数据元素,该值限制了每次遍历中同时加载的数据元素的数量。默认设置为100。
time2,设置缓存索引重建进程在一次遍历结束、下次遍历开始之间的暂停时长。默认设置为50ms.
time3,设置遍历一次磁盘缓存源数据的时间上限。默认设置为200ms

该指令设置比较复杂,一般需要设置前面三个指令的情形比较多,后面的几个变量与Nginx服务器缓存索引重建进程及管理进程的性能相关,一般情况下保持默认设置就可以了。我们来看几个简单的配置实例:

proxy_cache path /nginx/cache/a levels=1 keys_zone=a:10m;
proxy_cache_path /nginx/cache /b levels-2:2 keys_zone=b:100m;
proxy _cache_path /nginx/cache/c levels=1:1:2 keys_zone=c:1000m;

8.proxy_cache_use_stale指令

如果Nginx在访问被代理服务器过程中出现被代理的服务器无法访问或者访问错误等现象时,Nginx服务器可以使用历史缓存响应客户端的请求,这些数据不一定和被代理服务器上最新的数据相一致,但对于更新频率不高的后端服务器来说,Nginx服务器的该功能在一定程度上能够为客户端提供不间断访问。该指令用来设置一些状态,当后端被代理的服务器处于这些状态时,Nginx服务器启用该功能。

proxy_cache_use_stale error| timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_404 | off..·:该指令可以支持的状态如语法结构中所示。

9.proxy_cache_valid指令

该指令可以针对不同的HTTP响应状态设置不同的缓存时间。

proxy_cache_valid [code...] time;code,设置HTTP响应的状态代码。该指令可选,如果不设置,Nginx服务器只为HTTP状态代码为200、301和302的响应数据做缓存。可以使用“any”表示缓存所有该指令中未设置的其他响应数据。time,设置缓存时间。看几个例子:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;该例子中,对返回状态为200和302的响应数据缓存10分钟,对返回状态为301的响应数据缓存1小时,对返回状态为非200、302和301的响应数据缓存1分钟。

10.proxy_no_cache指令

该指令同于配置在什么情况下不使用cache功能。

proxy_no_cache $string...;string 可以是一个或者都多个变量。当string的值不为空或者不为0时,不启用cache功能

11.proxy_store 指令

该指令配置是否在本地磁盘缓存来自被代理服务器的响应数据。这是Nginx服务器提供的另一种缓存数据的方法,但是该功能相对 Proxy Cache简单一些,它不提供缓存过期更新、内存索引建立等功能,不占用内存空间,对静态数据的效果比较好。

proxy_store on | off | string;on | off,设置是否开启Proxy Store功能。如果使用变量on,功能开启,缓存文件会存放到alias指令或root指令设置的本地路径下。默认设置为off。
string,自定义缓存文件的存放路径。如果使用变量string,Proxy Store功能开启,缓存文件会存放到指定的本地路径下。

Proxy Store方法多使用在被代理服务器端发生错误的情况下,用来缓存被代理服务器的响应数据。

12.proxy_store_access指令

该指令用于设置用户或用户组对Proxy Store缓存的数据的访问权限。

proxy_store_access users:permissions ...users,可以设置为user、group或者all。
permissions,设置权限。

有关Proxy Store方法的使用,我们通过官方给出的实例加深理解:

1ocation /images/
{root /data/www;error_page 404 = /fetch$uri;      #定义了404错误的请求页面
}1ocation /fetch/                    #匹配404错误时的请求
{proxy_pass http://backend;proxy_store on;                   #开启Proxy store方法proxy_store_access user:rw group:rw all:r;root/data/www;                    #缓存数据的路径
}

http://chatgpt.dhexx.cn/article/V4Kq4HBe.shtml

相关文章

Nginx缓存配置(简易实现CDN功能)

环境推荐使用openresty,自带了挺多模块的,如果直接使用nginx,需要对缺少的模块进行添加,添加教程参照百度或者OpenResty教程 1、本地站点ETag缓存 示范开启静态文件缓存 环境: nginx -v nginx version: openresty/1.15…

Nginx缓存配置教程

问题引出 假设某电商平台商品详情页需要实现 700 QPS(假设宽带是千兆宽带) 千M局域网宽带网卡速率按照1000进位,所以1Gbps1,000,000,000bps125,000,000Bps≈119.21MB/s 当达到500QPS 的时候很难继续压测上去。 假设每个页面主体渲染所需要的…

Nginx缓存配置

Nginx缓存配置 一、Nginx缓存介绍二、具体操作三、实例1 一、Nginx缓存介绍 Nginx 不仅仅是一个 Web 服务器,它还可以作为一个缓存服务器使用。通过 Nginx 缓存,可以对一些静态资源或者数据更新频率较低的后端服务做缓存,降低静态资源或后端…

nginx 缓存配置详解都是干货

一、缓存类型 1、服务端缓存 2、代理缓存 3、客户端缓存 4、代理缓存的工作流程: 二、代理缓存配置语法 1、代理缓存路径 配置语法 Syntax: proxy_cache_path path [levelslevels] [use_temp_pathon|off] keys_zonename:size [inactivetime] [max_sizesize] […

微信那些词语发不出去

在写文章的时候,会遇到以下3种情况: 1、你所编辑的图文消息可能含有敏感内容,你可以继续保存或发布该图文消息(发布等待时长约3-4小时),若保存或发布后,经核实含有敏感内容的,将可能…

微信公众号文章存在敏感词被屏蔽

在写文章的时候,会遇到以下3种情况: 1、你所编辑的图文消息可能含有敏感内容,你可以继续保存或发布该图文消息(发布等待时长约3-4小时),若保存或发布后,经核实含有敏感内容的,将可能…

微信公众平台有哪些敏感词不准发

在写文章的时候,会遇到以下3种情况: 1、你所编辑的图文消息可能含有敏感内容,你可以继续保存或发布该图文消息(发布等待时长约3-4小时),若保存或发布后,经核实含有敏感内容的,将可能…

微信公众号敏感词检测工具

在写文章的时候,会遇到以下3种情况: 1、你所编辑的图文消息可能含有敏感内容,你可以继续保存或发布该图文消息(发布等待时长约3-4小时),若保存或发布后,经核实含有敏感内容的,将可能…

微信公众号文章是否违规怎么检测?

在写文章的时候,会遇到以下3种情况: 1、你所编辑的图文消息可能含有敏感内容,你可以继续保存或发布该图文消息(发布等待时长约3-4小时),若保存或发布后,经核实含有敏感内容的,将可能…

微信小程序发布需要校验敏感信息(内容、图片)-Java后端实现

精选30云产品&#xff0c;助力企业轻松上云&#xff01;>>> 前端只需要将图片和内容传过来即可 pom依赖 HttpClient的依赖和json转换的依赖 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><versio…

SpringBoot调用微信小程序敏感词拦截接口

SpringBoot调用微信小程序敏感词拦截接口 获取接口调用凭据 | 微信开放文档 (qq.com) 在调用微信小程序安全识别接口时需要先拿到&#xff0c;小程序的token令牌&#xff0c;需要调用下面这个接口 https://api.weixin.qq.com/cgi-bin/token?grant_typeclient_credential&am…

微信小程序通过云函数调用安全api,实现敏感词校验

如题&#xff0c;话不多说&#xff0c;直接上代码 1.首先需要在小程序中引入云函数框架 1.1在project.config.json中添加设置&#xff0c;同时在小程序根目录新建cloudfunctions文件夹 "cloudfunctionRoot": "cloudfunctions/" 1.2在app.json中添加设置…

php屏蔽词库,PHP调用微信过滤敏感词汇API

之前写过一篇过滤敏感词汇的文章,但是最近临近国庆,小程序提高了安全能力得检测,审核变得更加严格,要求自定义昵称、头像、签名等必须要有过滤敏感词汇得机制,严格上之前那边文章也可以过滤,但是具体微信过滤得内容就不得而知了,所以,今天就分享一下PHP利用微信小程序的…

微信小程序敏感词过滤

当你的小程序有用户提交&#xff08;评论、文章、图片&#xff09;时&#xff0c;如果你的代码没有过滤敏感词汇&#xff0c;将会审核不通过&#xff0c;幸好官方提供了API&#xff0c;方便了很多&#xff0c;废话不多说&#xff0c;干&#xff01; 本文只有文字过滤 本文采用…

企业微信又更新了!聊天敏感词、下载直播回放视频、聊天文件支持10GB...

企业微信版本已更新至3.0.36&#xff0c;还没有更新的速速去升级啦&#xff01; 一、客户联系功能增强 企业可设置聊天敏感词&#xff0c;设置后将下载到成员的企业微信。当成员发送给客户的消息包含敏感词时&#xff0c;将予以提示或发送失败。 登录企业微信管理后台在客户联…

Java实现微信小程序文本内容敏感词检查

1.背景2.策略3.实现1. 调用auth.getAccessToken&#xff0c;获取接口调用凭证2. 调用security.msgSecCheck检测文本内容 4.遇到的问题5.工具类完整代码6.使用方式 1.背景 发布小程序的时候&#xff0c;没有通过审核&#xff0c;审核结果为 提示要完善内容审核机制。 2.策略 …

普通微信如何设置敏感词监控?以及企业微信敏感词监控拦截

微信作为一个广泛使用的社交平台&#xff0c;拥有庞大的用户群体&#xff0c;这使得微信营销在企业的市场推广中扮演着重要的角色。通过微信营销&#xff0c;企业可以获得一定程度的业绩增长。然而&#xff0c;随着企业规模的扩大&#xff0c;微信营销也面临着一些挑战和盲区。…

微信小程序安全系列——文本内容安全识别

前言 相信很多朋友跟我遇到过相同的问题&#xff0c;就是在开发一些笔记或者博客的时候&#xff0c;会遇到一些过滤敏感、时政、黄、赌、毒这类词汇、句子等这种棘手问题。 今天我们看一下微信小程序提供的文本安全内容识别&#xff0c;也可以减少一些我们的工作量。通过微信…

常用的文本去重代码:

常用的文本去重代码&#xff1a; 本代码用到了simhash库&#xff08;https://github.com/yanyiwu/simhash&#xff09; import re import os from pathlib import Path import json from simhash import Simhashdef droplike(lines):def distance(v1, v2, f64):x (v1 ^ v2) …

simhash海量文本去重的工程化

https://yuerblog.cc/2018/05/30/simhash-text-unique-arch/ simhash算法是google发明的&#xff0c;专门用于海量文本去重的需求&#xff0c;所以在这里记录一下simhash工程化落地问题。 下面我说的都是工程化落地步骤&#xff0c;不仅仅是理论。 背景 互联网上&#xff0…