Ningx配置前端http缓存

在构建高性能的网站或Web应用程序时,优化前端资源的加载速度是至关重要的。一个有效的方法是利用HTTP缓存机制,通过缓存静态资源来减少网络请求,降低服务器负载,并提升用户体验。本文将介绍如何使用Nginx配置前端HTTP缓存,以加速网站的加载速度。

什么是HTTP缓存?

HTTP缓存是一种在客户端(浏览器)和服务器之间缓存HTTP响应的机制。当浏览器首次请求一个资源时,服务器会返回响应,并在响应中包含缓存指令。这些缓存指令告诉浏览器如何处理该资源以及何时再次请求该资源。

Nginx缓存基础

在Nginx中,缓存是通过proxy_cache_path和proxy_cache指令来配置的。proxy_cache_path定义了缓存的存储路径和相关参数,而proxy_cache指令则用于指定哪些请求应该被缓存。

Nginx中的缓存机制

Nginx提供了两种主要的缓存机制:代理缓存和浏览器缓存。代理缓存是指Nginx作为代理服务器,将请求的响应存储在自身的缓存中,当再次收到相同请求时,可以直接从缓存中提供响应。而浏览器缓存则是通过设置HTTP响应头来指示浏览器存储资源副本。

配置Nginx实现前端HTTP缓存

server {# 其他配置项...location ~* .(html)$ {access_log off;add_header  Cache-Control  max-age=no-cache;}location ~* .(css|js|png|jpg|jpeg|gif|gz|svg|mp4|ogg|ogv|webm|htc|xml|woff)$ {access_log off;add_header    Cache-Control  max-age=360000;}# 其他资源类型的配置...
}

在上述配置中,我们使用location指令结合正则表达式匹配不同类型的资源。对于以.html结尾的资源,我们设置了Cache-Control头部为max-age=no-cache,这告诉浏览器不要缓存该资源。而对于以.css、.js、.png等结尾的资源,我们设置了Cache-Control头部为max-age=360000,这表示浏览器可以缓存该资源,并在360000秒(约为100小时)后再次请求。
通过这样的配置,可以根据不同的资源类型灵活地控制缓存策略,以满足网站的需求。
下面对Cache-Control中的这两个参数进行分析一下:

add_header Cache-Control max-age=no-cache; 的含义:html文件不设置强制缓存时间,协商缓存,使用 Last-Modified。no-cache 会发起往返通信来验证缓存的响应,但如果资源未发生变化,则不会下载,返回304。

add_header Cache-Control max-age=360000; 的含义给上面匹配后缀的文件设置强制缓存,且缓存的时间是360000秒,第一次访问的时候,从服务器请求,当除了第一次以外,再次刷新浏览器,会从浏览器缓存读取,那么强制缓存一般是从内存里面先读取,如果内存没有,再从硬盘读取。

缓存时间的选择

缓存时间的选择取决于资源的更新频率。对于不经常变动的资源,如库文件或图标,可以设置较长的缓存时间。而对于经常更新的资源,如HTML页面,可能需要设置较短的缓存时间或不缓存。
浏览器中关于Cache的3属性:

1. Cache-Control:

设置相对过期时间, max-age指明以秒为单位的缓存时间. 若对静态资源只缓存一次, 可以设置max-age的值为315360000000 (一万年). 比如对于提交的订单,为了防止浏览器回退重新提交,可以使用Cache-Control之no-store绝对禁止缓存,即便浏览器回退依然请求的是服务器,进而判断订单的状态给出相应的提示信息!

Http协议的cache-control的常见取值及其组合释义:
no-cache: 数据内容不能被缓存, 每次请求都重新访问服务器, 若有max-age, 则缓存期间不访问服务器.
no-store: 不仅不能缓存, 连暂存也不可以(即: 临时文件夹中不能暂存该资源).
private(默认): 只能在浏览器中缓存, 只有在第一次请求的时候才访问服务器, 若有max-age, 则缓存期间不访问服务器.
public: 可以被任何缓存区缓存, 如: 浏览器、服务器、代理服务器等.
max-age: 相对过期时间, 即以秒为单位的缓存时间.
no-cache, private: 打开新窗口时候重新访问服务器, 若设置max-age, 则缓存期间不访问服务器.
-  private, 正数的max-age: 后退时候不会访问服务器.
-  no-cache, 正数的max-age: 后退时会访问服务器.

2. Expires:

设置以分钟为单位的绝对过期时间, 优先级比Cache-Control低, 同时设置Expires和Cache-Control则后者生效. 也就是说要注意一点: Cache-Control的优先级高于Expires
expires起到控制页面缓存的作用,合理配置expires可以减少很多服务器的请求, expires的配置可以在http段中或者server段中或者location段中. 比如控制图片等过期时间为30天, 可以配置如下:

location ~ .(gif|jpg|jpeg|png|bmp|ico)$ {root /var/www/img/`;`expires 30d;
}
再比如:
location ~ .(wma|wmv|asf|mp3|mmf|zip|rar|swf|flv)$ {root /var/www/upload/`;`expires max;
}

3. Last-Modified:

该资源的最后修改时间, 在浏览器下一次请求资源时, 浏览器将先发送一个请求到服务器上, 并附上If-Unmodified-Since头来说明浏览器所缓存资源的最后修改时间, 如果服务器发现没有修改, 则直接返回304(Not Modified)回应信息给浏览器(内容很少), 如果服务器对比时间发现修改了, 则照常返回所请求的资源.
需要注意:

  1. Last-Modified属性通常和Expires或Cache-Control属性配合使用, 因为即使浏览器设置缓存, 当用户点击”刷新”按钮时, 浏览器会忽略缓存继续向服务器发送请求, 这时Last-Modified将能够很好的减小回应开销.
  2. ETag将返回给浏览器一个资源ID, 如果有了新版本则正常发送并附上新ID, 否则返回304, 但是在服务器集群情况下, 每个服务器将返回不同的ID, 因此不建议使用ETag.
    以上描述的客户端浏览器缓存是指存储位置在客户端浏览器, 但是对客户端浏览器缓存的实际设置工作是在服务器上的资源中完成的. 虽然上面介绍了有关于客户端浏览器缓存的属性, 但是实际上对这些属性的设置工作都需要在服务器的资源中做设置. 通常有两种操作手段对浏览器缓存进行设置, 一个是通过页面指令声明来设置, 另外一个是通过编程方式来设置.
    下面是相关页面设置Cache-Control头信息的几个简单配置:
    例一:
if ($request_uri ~* "^/$|^/search/.+/|^/company/.+/"`) {`add_header    Cache-Control  max-age=3600;
}

个人理解的max-age意思是:客户端本地的缓存,在配置的生存时间内的,客户端可以直接使用,超出生存时间的,到服务器上取新数据。当然这些还要看客户端浏览器的设置。
例二:

location ~ .*.(css|js|swf|php|htm|html )$ {add_header Cache-Control no-store;
}

例三:

location ~ .*.(js|css)$ {expires 10d;
}

例四: 将html结尾的请求加上no-cache

location / {access_log /data/nginx/log/xxx`.log api;`root /home/www/html`;`if ($request_filename ~ .*.(htm|html)$)
{add_header Cache-Control no-cache;}
}

注意事项

确保缓存策略不适用于所有资源。例如,对于用户个人信息或动态内容,应该始终设置为不缓存。
使用ETag或Last-Modified头部可以进一步提高缓存效率,这些头部可以帮助浏览器识别资源的更新情况。

结论

通过合理配置Nginx的客户端缓存策略,我们可以有效地提升前端资源的加载速度,减少服务器负载,从而提升整个Web应用的性能,可以显著提高Web应用的性能和用户体验。在配置缓存时,我们需要根据资源的更新频率和重要性来调整缓存时间,确保用户总是获取到最新的内容,同时减少不必要的服务器请求。通过细致的配置和优化,Nginx可以成为提升Web应用性能的强大工具。

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

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

相关文章

业务需求方面

S 最爱小组件引导弱,需要在用户操作的关键路径上增加引导。用户在直播间点击关注并且设为我的最爱后,首次会出现直播间引导条;若首次未点击引导条,之后观看满30s,出现引导条。写了去添加和区桌面添加两个UI。其中&…

linux学习笔记整理: 关于linux系统操作/安装软件 2024/7/16;

安装软件 安装方式: 二进制安装。---只需要解压就可以。 只针对特殊平台。 比如jdk tomcat RPM: 按照一定的规范就可以按照该软件。 无法安装依赖的文件。 mysql yum 远程安装 基于RPM 帮你把依赖的文件安装上去。 必须联网。 安装源码安装。 查看端口插件: 下载…

数据库:redis练习题

1、安装redis,启动客户端、验证。 redis-server redis-cli 2、string类型数据的命令操作: (1) 设置键值: set mykey "haha" (2) 读取键值: get mykey (3&…

08_TypeScript 中的类(静态属性、静态方法、抽象类、继承多态)

静态属性、静态方法、抽象类、继承多态 一、静态属性和静态方法1、回顾ES5中的静态方法2、TS 中定义静态方法和静态属性 二、多态1、定义:父类定义一个方法不去实现,让继承它的子类去实现,每一个子类有不同的表现。多态属于继承 三、 抽象方法…

Halcon与C++之间的数据转换

HALCON的HTuple类型(元组)功能很强大,可以表示INT、double、string等多种类型数据。当元组中只有一个成员时,HTuple也可表示原子类型 1. haclon -> C //HTuple转int HTuple hTuple 1; int data1 hTuple[0].I(); // data1 1//HTuple转do…

MSSQL Server运维常用SQL命令

1、数据库连接数 select name, state, state_desc from sys.databases; 查询结果: 2、数据库状态 select name, state, state_desc from sys.databases; 查询结果: 3、数据文件状态 select a.name, b.physical_name, b.state, b.state_desc from sy…

TCP连接如何确保可靠性

TCP通过序列号、确认应答、超时重传、数据校验、流量控制、拥塞控制等机制,确保了数据传输的可靠性和效率。 序列号:每个TCP段都有一个序列号,代表了数据流中的字节位置。 通过序列号,接收方可以检测数据包是否丢失或重复&#…

03MFC画笔/画刷/画椭圆/圆/(延时)文字

文章目录 画实心矩形自定义画布设计及使用连续画线及自定义定义变量扇形画椭圆/圆输出颜色文本定时器与定时事件画实心矩形 自定义画布设计及使用 连续画线及自定义定义变量 扇形 画椭圆/圆 输出颜色文本

【图像】图像识别经典算法

图像识别经典算法 一、图像识别基础二、经典图像识别算法1. Haar-like Features AdaBoost (Viola-Jones)2. SIFT (Scale-Invariant Feature Transform)3. SURF (Speeded-Up Robust Features)4. HOG (Histogram of Oriented Gradients)5. CNN (Convolutional Neural Networks) …

尚品汇-(十六)

目录 商品详情功能开发 (1)搭建service-item (2)获取sku基本信息与图片信息 (3)获取分类信息(查看三级分类) 商品详情功能开发 (1)搭建service-item 点…

「UCD」浅谈蓝湖Figma交互设计对齐

在现代数字产品的设计和开发过程中,选择合适的工具对于提高团队效率和保证产品质量至关重要。本文将从开发和设计两个不同的角度,探讨蓝湖和Figma两款流行工具的优势与不足,并提出结论和建议。 开发研发视角:蓝湖 优点: 清晰的设计规范:蓝湖为开发工程师提供了清晰的设计…

Gradio:快速构建机器学习Web应用的神奇工具

文章目录 引言官网链接原理基础使用安装 Gradio创建一个简单的 Gradio 应用 高级使用自定义界面集成到现有Web应用中 优缺点优点缺点 总结 引言 Gradio 是一个基于 Python 的库,它极大地简化了将机器学习模型转化为交互式Web应用的过程。无需深入了解Web开发或后端…

状态管理的艺术:探索Flutter的Provider库

状态管理的艺术:探索Flutter的Provider库 前言 上一篇文章中,我们详细介绍了 Flutter 应用中的状态管理,以及 StatefulWidget 和 setState 的使用。 本篇我们继续介绍另一个实现状态管理的方式:Provider。 Provider优缺点 基…

【阶乘】个人练习-Leetcode-LCP 22. 黑白方格画

题目链接:https://leetcode.cn/problems/ccw6C7/description/ 题目大意:给出一块白方格面积为n*n,给出一个数字k,每一次操作可以把方格的某一整行或者某一整列涂黑,求使得黑色格子数字为k的【最终图案】的个数。 思路…

MySQL 分库分表

分表 分表 将表按照某种规则拆分成多个表。 分表的使用原因 当数据量超大的时候,B-Tree索引效果很变差。 垂直分区 切分原则:把不常用或存储内容比较多的字段分到新的表中可使表存储更多数据。 原因,Innodb主索引叶子节点存储着当前行的所有信…

Linux抽象套接字

在UNIX和类UNIX系统中,socket编程提供了一种机制,允许进程之间进行通信。其中,UNIX域套接字(UNIX domain socket)是一种特殊的套接字,用于同一台机器上的进程间通信(IPC)。UNIX域套接字可以使用两种类型的地址:路径名套接字(pathname socket)和抽象套接字(abstract…

笔记 2 : 课本第 3 章开始,记录 arm 的汇编指令的格式

(13) 介绍 arm 中的第一个汇编指令的用法 mov : (14)立即数的概念: (15) 汇编中的移位写法: 举例 : (16) 学习一个新的指令 cmp &a…

网络监控工具推荐与对比

网络监控工具在确保网络安全、性能和可用性方面发挥着关键作用。以下是几款流行的网络监控工具的推荐与对比: 1. Nagios 特点: 开放源代码:提供免费的社区版本和付费的企业版本。可扩展性:拥有大量插件,可以监控各种…

芯课堂 | Synwit_UI_Creator(ugui)平台之PC端界面设计篇

​今天小编给大家介绍的是华芯微特面向小尺寸TFT-LCD屏驱市场量身打造的Synwit_UI_Creator(ugui)自研开发套件。 UI_Creator(ugui)开发套件分为上位机和下位机,以下如无特指,上位机即为PC端设计器/仿真器&…

虚拟机及其Debian(kali)安装

本机电脑为Windows10系统专业版,在此基础上安装VMware和系统(Kali) 步骤如下 一、安装 VMware Workstation Pro v16.2.4 安装步骤可参照网上博客,该步骤较简单,此处不做讲解。文件中共计两个,其中一个是激活…