nginx 缓存配置详解都是干货

article/2025/5/6 20:01:13

一、缓存类型

1、服务端缓存

2、代理缓存

3、客户端缓存

4、代理缓存的工作流程:

 二、代理缓存配置语法

1、代理缓存路径

配置语法

复制代码

Syntax:    proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
Default:    —
Context:    http

复制代码

 定义缓存目录空间大小和名字。

 可参考 http_proxy_module中proxy_cache官网文档:Module ngx_http_proxy_module

 2、配置代理缓存

配置语法:

Syntax:    proxy_cache zone | off;
Default:    
proxy_cache off;
Context:    http, server, location

 zone : 就是上一步所配置的 proxy_cache_path 中 path 的名字。表示缓存存入哪个路径。

 3、缓存过期时间

配置语法:

Syntax:    proxy_cache_valid [code ...] time;
Default:    —
Context:    http, server, location

code : http 状态码。

例如配置 proxy_cache_valid 200 12h 意思是状态码为 200 的 缓存 12个小时。

4、缓存的维度

Syntax:    proxy_cache_key string;
Default: proxy_cache_key $scheme$proxy_host$request_uri;
Context: http, server, location
proxy_cache_key $scheme$proxy_host$request_uri : http协议 + 主机名 + uri 把这三个作为一个单独的key来缓存。

如何还需要缓存别的,就按照这种格式来设置。

示例:

a、负载均衡缓存服务配置(/etc/nginx/conf.d/cache_test.conf)如下:

复制代码

upstream chrdai {server 192.168.0.133:8001;server 192.168.0.133:8002;server 192.168.0.133:8003;
}proxy_cache_path /opt/app/cache levels=1:2 keys_zone=chrdai_cache:10m max_size=10g inactive=60m use_temp_path=off;

server {listen       80;server_name  localhost;#charset koi8-r;#access_log  /var/log/nginx/host.access.log  main;location / {       proxy_cache chrdai_cache;proxy_pass http://chrdai;proxy_cache_valid 200 304 12h;proxy_cache_valid any 10m;proxy_cache_key $host$uri$is_args$args;add_header Nginx-Cache "$upstream_cache_status"; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;include conf.d/proxy_params; //proxy_params请参考我上一章的内容}
}

复制代码

 配置说明:

proxy_cache_path /opt/app/cache

存放缓存文件的目录

levels=1:2

目录分级,按照两层目录的方式来进行分级。

keys_zone=chrdai_cache:10m

zone空间的名字,后面配置 proxy_cache 后面配的就是这个名字。10m表示开辟key空间的大小,一般1m大概能存放8000个key。

max_size=10g

表示缓存目录最大是多大,不能让缓存无限增长占满整个磁盘。当缓存空间满了后,Nginx就会触发淘汰规则,把不常访问的就会淘汰掉。

inactive=60m

这个60m是时间单位,表示60分钟,表示如果在60分钟内如果某个缓存没有被访问过,就会把它清理掉。

use_temp_path=off

这个是用来存放临时文件的,建议关闭,如果打开的话,Nginx会另外建立一个目录和cache目录两个目录在更新缓存时容易出现一些性能方面的损耗。

proxy_cache chrdai_cache

表示我们已经开启了代理缓存,该值是proxy_cache_path中的 keys_zone 的值,如果不想使用代理缓存,将该值配置成 off。

proxy_pass http://chrdai

代理的地址

proxy_cache_valid 200 304 12h;

状态码为200,304的响应过期时间为 12h。

proxy_cache_valid any 10m;

除了200和304状态码的其它状态码的缓存时间为10分钟。

proxy_cache_key $host$uri$is_args$args;

设置默认缓存的key。

$is_args表示请求中的URL是否带参数,如果带参数,$is_args值为"?"。如果不带参数,则是空字符串。

$args表示HTTP请求中的参数。

add_header Nginx-Cache "$upstream_cache_status";

增加一个http响应头信息,Nginx-Cache,告诉客户端是否已经命中代理缓存。

proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;

当我们的后端其中一台服务器出现错误,超时,或者500,502,503,504等不正常的头返回时,就跳过这一台,去访问下一台。避免因为单台服务器的异常对前端产生影响。

b、 另外三台真实服务器的配置如下:

第一台(/etc/nginx/conf.d/realserver1.conf):

第二台(/etc/nginx/conf.d/realserver2.conf):

 

第三台(/etc/nginx/conf.d/realserver3.conf):

c、分别在三台真实服务器(当然我这里是在一台服务器中用三个端口模拟的)的项目目录下建立index.html文件。

第一台(/opt/app/code1):

复制代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>proxy_cache test</title>
</head>
<body><p>Test proxy_cache1</p>
</body>
</html>

复制代码

 第二台(/opt/app/code2):

复制代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>proxy_cache test</title>
</head>
<body><p>Test proxy_cache2</p>
</body>
</html>

复制代码

 第三台(/opt/app/code3):

复制代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>proxy_cache test</title>
</head>
<body><p>Test proxy_cache3</p>
</body>
</html>

复制代码

c、先在代理服务器中将缓存关闭 (proxy_cache off),刷新页面,发现页面可以在三个站点间轮询显示。‘

d、然后在把代理缓存打开,发现页面不在轮询了,请求头多了缓存头(这是头我们配置的)。

刷新第一遍的时候,请求头 Nginx-Cache : MISS

第二遍刷新的时候就命中了代理缓存。

 同时也会在我们配置的缓存目录(/opt/app/cache)生成缓存目录

三、清理指定缓存

方法一

m -rf 缓存目录内容

这样会把所有的缓存都给清空掉。

方法二

第三方拓展模块 ngx_cache_purge

四、如何让部分页面不缓存

配置语法

Syntax:proxy_no_cache string...;
Default:-;
Context:http,server,location;

配置示例:

复制代码

upstream chrdai {server 192.168.0.133:8001;server 192.168.0.133:8002;server 192.168.0.133:8003;
}proxy_cache_path /opt/app/cache levels=1:2 keys_zone=chrdai_cache:10m max_size=10g inactive=60m use_temp_path=off;server {listen       80;server_name  localhost;#charset koi8-r;#access_log  /var/log/nginx/host.access.log  main;if ($request_uri ~ ^/(index.html|login|register|password|\/reset)) {set $cookie_nocache 1;}location / {proxy_cache chrdai_cache;proxy_pass http://chrdai;proxy_cache_valid 200 304 12h;proxy_cache_valid any 10m;proxy_cache_key $host$uri$is_args$args;proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;proxy_no_cache $http_pragma $http_authorization;add_header Nginx-Cache "$upstream_cache_status";proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;include conf.d/proxy_params;}
}

复制代码

这里配置的意思就是当url中匹配到了 index.html , login, register, password 和 reset 时,不缓存该url所对应的页面。

五、缓存命中分析

方式一

通过设置 response 的头信息 Nginx-Cache

add_header Nginx-Cache "$upstream_cache_status";

方式二

通过设置 log_format,打印日志进行分析。(打印 $upstream_cache_status 这个Nginx默认的变量)

$upstream_cache_status 这个变量有以下几种值:

状态含义
MISS未命中,请求被传送到后台处理
HIT缓存命中
EXPIRED缓存已经过期,请求被传送到后台处理
UPDATING正在更新缓存,将使用旧的应答
STALE后端得到过期的应答

缓存命中率 = HIT次数 / 总请求次数。

示例:

首先在 /etc/nginx/nginx.conf 中的 logformat 中加入 $upstream_cache_status 这个变量。

然后配置缓存代理的 access_log 的路径

然后使用linux 的awk 命分析日志 。

awk '{if($NF=="\"HIT\""){hit++}}END{printf "%.2f", hit/NR}' /var/log/nginx/proxy_cache_access.log

命令解释:

$NF :  日志每行的最后一个参数。

hit我们自定义的一个变量,用来记录被命中的次数。

NR:AWK的内置变量,表示本次分析所扫描日志的总行数。

命令执行结果:

说明我们的缓存命中率为 58%。

六、大文件的分片请求

http_slice_module

配置语法

Syntax:slice size;
Default:slice 0;
Context:http,server,location;

 size 是一个大小,表示是大文件被分割后,小文件的大小。

实现原理

会根据 Range 的值分割成小的请求去请求后端,返回回来的就是一个一个小的缓存文件, 

优势:

每个子请求收到的数据都会形成一个独立文件,一个请求断了,其它请求不受影响。

缺点:

当文件很大或者 slice 很小的时候,可能会导致文件描述符耗尽等情况。


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

相关文章

微信那些词语发不出去

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

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

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

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

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

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

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

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

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

微信小程序发布需要校验敏感信息(内容、图片)-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…

自然语言处理学习笔记5:去重处理之使用SimHash进行海量文本去重

摘要: 传统的Hash算法只负责将原始内容尽量均匀随机地映射为一个签名值&#xff0c;原理上仅相当于伪随机数产生算法。传统的hash算法产生的两个签名&#xff0c;如果原始内容在一定概率下是相等的&#xff1b;如果不相等&#xff0c;除了说明原始内容不相等外&#xff0c;不再…

python编写url文本去重和url探测存活一体化工具

因为项目需要&#xff0c;长时间使用360的quake和奇安信的hunter进行资产收集。但是收集到的资产很多无法访问&#xff0c;hunter的都是200。所以写了一个简单的脚本&#xff0c;让quake和hunter进行对比&#xff0c;去掉重复部分&#xff0c;然后再探测存活&#xff0c;存活ur…

使用NotePad++快速实现字符串统计/抽取,以及使用Notepad进行文本去重

软件测试技术交流群 : 1、QQ交流群&#xff1a;群号 429183023 2、添加JeongJinWin&#xff0c;或者扫描头像二维码 背景&#xff1a;日常工作中&#xff0c;可能在Windows下需要对一些文本进行解析&#xff0c;抽取出某种类型的字段、或者特定字符串&#xff0c;在Linux下可…

在线文本去重统计工具

在线文本去重统计工具 在线文本去重统计工具 本工具可以统计文本列表的重复项以及统计每个重复项出现的次数。 本工具可以统计文本列表的重复项以及统计每个重复项出现的次数。 本工具可以统计文本列表的重复项以及统计每个重复项出现的次数。 https://tooltt.com/unique/