Nginx代理缓存静态资源

问题描述

有两台服务器,一台是外网的网关服务器,一台是内网的资源服务器,但是两台服务器距离很远(跨省),页面中依赖大量插件资源,加载耗时久,本章重点讲解Nginx代理缓存静态资源。

解决思路

  • CDN
  • 开启gzip压缩
  • 图片格式优化,找到大图片
  • 外网服务器进行静态资源缓存

proxy_cache工作原理

Nginx 的 proxy_cache 模块允许 Nginx 作为反向代理服务器时缓存后端服务器的响应。以下是 proxy_cache 模块的工作原理:

  1. 请求到达:客户端向 Nginx 发送请求。
  2. 缓存查找:Nginx 首先检查请求是否命中缓存。这是通过查找共享内存中的缓存键(由 proxy_cache_key 定义)来完成的。
  3. 缓存命中:如果请求命中缓存,Nginx 直接从缓存中读取响应并返回给客户端。
  4. 缓存未命中:如果请求未命中缓存,Nginx 将请求转发到后端服务器。
  5. 后端响应:后端服务器处理请求并返回响应给 Nginx。
  6. 缓存存储:Nginx 将后端服务器的响应存储在本地文件系统中,同时在共享内存中更新缓存键和元数据。
  7. 返回响应:Nginx 将后端服务器的响应返回给客户端,并根据 proxy_cache_valid 指令设置的规则决定缓存时间。

配置

# 设置日志格式,$upstream_cache_status代表是否命中缓存
# $upstream_cache_status的返回值有7个:
# HIT表示缓存命中
# MISS表示未命中,请求被传送到后端
# EXPIRED表示缓存已经过期,请求被传送到后端
# UPDATING表示正在更新缓存,将使用旧的应答
# STALE表示无法从后端服务器更新缓存时,返回了旧的缓存内容
# BYPASS表示缓存被绕过了
# REVALIDATED表示启用proxy_cache_revalidate指令后,当缓存内容过期时,Nginx通过一次If-Modified-Since的请求头去验证缓存内容是否过期,此时会返回该状态
log_format  main  '$remote_addr - $remote_user [$request_time] [$time_local] "$request" ''$upstream_cache_status '                      '$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';
# 打开日志格式化功能,如果这里不打开的话,上面的格式化不生效
access_log  logs/access.log  main;# 设置缓存区信息
# levels:指定该缓存空间对应的目录,最多可以设置3层,每层取值为1|2;例如:levels=1:2   缓存空间有两层目录,第一次是1个字母,第二次是2个字母
proxy_cache_path /app/nginx/js_cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;# --------------以下为server中的配置---------------
location / {proxy_pass http://ip:端口;
}
# 启用缓存
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ioc|ico|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma|css|js)$ {proxy_pass http://ip:端口;proxy_cache my_cache;# proxy_cache_valid设置不同响应码的缓存过期时间# HTTP 206 Partial Content(部分内容)状态码表示服务器成功处理了客户端‌请求资源部分内容‌的GET请求,主要应用于支持范围请求(Range Request)的场景,比如文件断点下载proxy_cache_valid 200 304 206 60m; # 缓存200, 304, 206响应3600秒(1小时)proxy_cache_key $uri; # 缓存键的生成方式# add_header X-Cache '$upstream_cache_status from $host'; # 在请求的http响应头中返回,判断是否命中缓存
}

proxy_cache_path与proxy_cache_valid中超时时间同时设置,生效控制问题

inactive时间到了,数据删除。proxy_cache_valid时间到了不会被删除,但是会认为失效,再次请求时会重新下载。有请求,inactive就刷新计时,valid不变。没请求,inactive和valid都不变。
分析各种情况:

  1. inactive设置1m,valid设置1h
    首先,请求进来,cache出现,两个时间开始倒计时。
    情况一:不断请求这个cache,inactive不断刷新1m倒计时,直到到达1h,valid过期。这时你去请求了一次,nginx重新去读取服务器数据,刷新valid倒计时。期间数据一直在缓存里。不请求,就再过1m删掉。
    情况二:两次请求间隔超过了1min,inactive生效,删除了这个cache数据,没了。你再请求,相当于重新去服务器拿了一次数据,inactive和valid倒计时都会重新刷新,不请求,cache里就没有这份数据了

  2. inactive设置1m,valid设置1m
    首先,请求进来,cache出现,两个时间开始倒计时。
    情况一:1m内不请求,最后inactive生效删掉。不请求就没缓存了,请求了一次,重新从服务器读取一份,两个计时刷新。
    情况二:1m内请求了一次,inactive时间刷新,但是valid还在计时,所以1m到了后,缓存过期了。你再请求就重新从服务器读取一份,刷新计时。不请求,就等待1m,由inactive生效删除了缓存

  3. inactive设置1h,valid设置了1m
    首先,请求进来,cache出现,两个时间开始倒计时。
    过了1m,缓存过期,数据在没删掉。不请求,直到1h到,inactive删掉缓存。请求了一次,重新从服务器读取,刷新两个计时。

所以,通常inactive应该需要设置的比valid中时间长,inactive和valid是配合使用,不是谁时间短覆盖谁的关系。

缓存清理

清除缓存,直接删除缓存文件夹,下次请求的时候会重新生成

外网缓存失败,内网不允许缓存

在生产环境出现过一个问题,在外网服务器nginx配置了缓存信息,日志配置生效,缓存目录也生成,但是始终没有生成缓存文件,最后排查发现,在内网的nginx配置了如下禁止缓存的信息,应该将此段内容从内网服务器移到外网上或者使用proxy_ignore_headers

add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0";
add_header Pragma no-cache;
add_header Expires 0;

private:专用于个人的缓存,中间代理、CDN 等不能缓存此响应
public:响应可以被中间代理、CDN 等缓存

参考

nginx proxy_cache缓存详解(强烈推荐)
nginx配置proxy_cache_path之inactive和proxy_cache_valid对比
Nginx 缓存系统 proxy_cache详解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/909841.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/909841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Blender 转换为 STP:软件操作与迪威模型网在线转换全指南

在三维设计与工程制造领域,不同格式的文件承担着各自的使命。Blender 作为一款功能强大且开源的三维建模软件,被众多设计师、艺术家以及学生广泛使用,能够创作出风格多样、细节丰富的三维模型。而 STP 格式作为制造业通用的数据交换标准&…

WebFuture:PDF页面去掉下载按钮

问题描述:客户要求pdf页面不显示下载按钮 解决办法:WF15.2版本开始会在内容管理配置增加“允许下载 PDF“开关;之前的版本需要替换文件来处理 1.备份网站下的base文件夹,路径为/wwwroot/content/_common/base/,然后覆…

【JVM】- 类加载与字节码结构2

编译期处理(语法糖) java编译器把.java源码编译成.class字节码的过程,自动生成和转换的一些代码。 默认构造器 public class Candy01 { }编译成class后的代码 public class Candy1 {public Candy1(){super();} }自动拆装箱(jd…

WSL2 中安装 cuDNN​​ 的完整指南

以下是关于 ​​cuDNN​​ 的详细介绍及在 ​​WSL2 中安装 cuDNN​​ 的完整指南,结合权威资料整理而成: 📚 ​​一、cuDNN 深度解析​​ ​​1. 定义与作用​​ ​​cuDNN​​(CUDA Deep Neural Network Library)是…

Apache Doris FE 问题排查与故障分析全景指南

前言: FE(Frontend)是 Apache Doris 集群架构中的“大脑”,负责元数据管理、查询解析和调度等关键任务。一旦 FE 出现问题,整个集群的稳定性和可用性将受到严重影响。因此,掌握 FE 故障定位与排查方法对于保…

RK AndroidFramework 内置应用可,卸载,恢复出厂设置恢复安装

device/rockchip/rk356x/rk3568_r/preinstall_del/Android.mkdevice/rockchip/rk356x/rk3568_r/preinstall_del/Android.mk include $(call all-subdir-makefiles) 拿内置LoyversePos应用做例子 device/rockchip/rk356x/rk3568_r/preinstall_del/preinstall.mk PRODUCT_PACK…

一文了解Blob文件格式,前端必备技能之一

文章目录 前言一、什么是Blob?二、Blob的基本特性三、Blob的构造函数四、常见使用场景1. 文件下载2. 图片预览3. 大文件分片上传 四、Blob与其他API的关系1. File API2. FileReader3. URL.createObjectURL()4. Response 五、性能与内存管理六、实际案例:…

LLMs 系列实操科普(4)

六、deep research 这是 chatgpt 推出的功能,但我这里是免费用户,一个月才有 5 次使用机会,而且使用的是轻量化模型版本,相对体验上比较鸡肋一些。 那这个深度思考研究是个什么东西呢? 根据 openai 对其的解释是&…

若依框架前端调用后台服务报跨域错误

背景:使用若依框架的前后端分离项目,前后端开发在同一个办公室情况下前端调用后端服务提示如下报错:Access to XMLHttpRequest at http://ip1:8089/online/layer/dataType from origin http://ip2:6090 has been blocked by CORS policy: Res…

PHP商城源码:构建高效电商平台的利器

一、PHP商城源码的核心优势 1. **开源免费,降低成本** PHP作为开源语言,拥有庞大的开发者社区,成熟的商城源码(如EcShop、OpenCart)可免费获取,大幅降低企业的技术投入成本。 2. **开发效率高** PHP语法…

【学习笔记】C++代码规范整理

【学习笔记】C代码规范整理 一、匿名空间namespace 匿名命名空间(Anonymous Namespace)是一种特殊的命名空间声明方式,其作用是将声明的成员限定在当前编译单元(源文件)内可见,类似于使用 static 关键字修…

数学复习笔记 29 不定积分

前言 复习的时候时常复习一下以前复习的高数,温故而知新,可以为师矣。现实生活中有非常多让我难受的事情,贤者模式的时候也会对一些自己的行为嗤之以鼻,复习考研对其他三门科目都没有学出来正反馈,只能从数学这儿找一…

微软因安全漏洞禁用黑暗环境下的Windows Hello面部识别功能

面部识别技术在各种场景中的应用日益广泛,但身份欺诈事件仍时有发生,这表明即使面部识别也并非万无一失。在某些情况下,这些系统可能被攻击者利用。 漏洞发现与应对措施 近期,微软在Windows 10和11系统中禁用了黑暗环境下使用Wi…

产品经理课程(十五)实战点评(3)

(一)复习 需求文档是产品的说明书 需求文档包含:修订记录、背景、主要流程、详细功能逻辑、数据上报,发布策略 bug也是需求文档的一部分 (二)案例讲解 案例一: 一个版本里面的4-5个功能点就比…

大模型量化与剪枝

大模型量化,剪枝 量化有助于减少显存使用并加速推理 GPTQ 等后训练量化方法(Post Training Quantization)是一种在训练后对预训练模型进行量化的方法。 ### model model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct template: llama3### export export_di…

Oracle 数据库数据操作:精通 INSERT, UPDATE, DELETE

作者:IvanCodes 日期:2025年6月18日 专栏:Oracle教程 在 Oracle 数据库中,对表内数据进行增加、修改和删除操作是通过数据操作语言 (DML - Data Manipulation Language) 来完成的。核心的DML语句包括 INSERT (插入新数据), UPDATE…

推荐使用的Unity插件(InputSystem)

本文将提供更简洁的步骤和常见问题解决。 一、极简入门步骤: 安装:Package Manager中安装Input System(确保Unity版本在2019.4) 创建Input Actions: 在Project窗口右键 -> Create -> Input Actions 双击打开…

清理 Docker 容器日志文件方法

操作总结与问题解析 一、操作目的与背景 用户旨在清理 Docker 容器日志文件以释放服务器存储空间,主要通过以下命令组合完成操作: 查看容器日志空间占用清空指定容器的日志文件验证容器运行状态与日志清理效果二、关键命令与输出解析 1. 查看 Docker 容器日志空间占用 du…

图片压缩工具 | 按指定高度垂直切割图片

OPEN-IMAGE-TINY,一个基于 Electron VUE3 的图片压缩工具,项目开源地址:https://github.com/0604hx/open-image-tiny ℹ️ 需求描述 在上一篇文章一段代码利用 snapdom 将 CSDN 博文转化为长图片(PNG/JPG/PDF)中&…

山东大学软件学院创新项目实训开发日志——第十七周(二)

目录 1.优化前端日历页面显示,增加鼠标悬停显示当日会议基本信息的效果。 2.优化会议计划生成与会议PPT生成功能,使得能够加载多页docx文件与PDF文件 3.优化了会议PPT生成功能,使得可以上传多个文件并根据多个文件生成会议PPT 4.修改了识…