Nginx 如何实现请求的缓存过期策略?

news2024/12/29 18:45:38
  • 🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!

Nginx

文章目录

  • Nginx 如何实现请求的缓存过期策略?
    • 一、缓存的重要性与基本概念
    • 二、Nginx 缓存过期策略的原理
    • 三、设置 Nginx 缓存过期时间
    • 四、基于变量的动态缓存过期策略
    • 五、使用第三方模块增强缓存功能
    • 六、缓存的更新与失效机制
    • 七、缓存命中率与性能监控
    • 八、实际应用中的注意事项

line

Nginx 如何实现请求的缓存过期策略?

在当今快节奏的互联网世界中,网站和应用的性能优化至关重要。就好比在一场激烈的赛车比赛中,每一秒的提速都可能决定胜负,而 Nginx 就像是赛车的引擎优化器,能让您的网站在网络赛道上飞驰。其中,Nginx 的请求缓存过期策略就是一项关键的性能优化手段,它能够有效地减少服务器的负载,提高响应速度,为用户带来更流畅的体验。接下来,让我们一起深入探讨 Nginx 是如何实现这一神奇策略的。

一、缓存的重要性与基本概念

缓存,简单来说,就像是一个临时的“仓库”,把经常用到的数据或者结果存起来,下次需要的时候直接拿,不用再重新计算或者从远处获取。这就好比你把经常穿的鞋子放在门口,出门的时候直接穿上,而不用跑到房间里的鞋柜去翻找。

对于网站和应用来说,缓存可以大大减少数据的获取时间和服务器的处理压力。想象一下,如果每次用户访问一个网页,服务器都要重新生成所有的内容,那得多慢啊!而且服务器也会累得够呛。但是有了缓存,就像给服务器装上了“减负器”,让它能轻松应对大量的请求。

Nginx 中的缓存主要分为两种:静态缓存和动态缓存。静态缓存通常是指那些不经常变化的文件,比如图片、CSS、JavaScript 等;动态缓存则是针对那些需要根据不同请求参数生成的内容,比如动态页面或者 API 接口的响应。

二、Nginx 缓存过期策略的原理

Nginx 的缓存过期策略就像是一个聪明的“管理员”,它知道什么时候该把缓存中的数据扔掉,什么时候该保留。其原理主要基于时间和一些特定的条件来判断缓存是否有效。

打个比方,这就像你家里的食品,有个保质期。在保质期内,你放心吃;过了保质期,就得扔掉。Nginx 也是根据设定的时间或者其他条件来决定缓存的“保质期”。

Nginx 可以通过设置不同的指令来控制缓存的过期时间。常见的有 expires 指令,它可以根据文件的类型或者 URL 规则来设置缓存的有效时间。还有 Cache-Control 头信息,这个就更灵活了,可以设置更详细的缓存策略,比如 max-age 表示缓存的最大有效时间。

三、设置 Nginx 缓存过期时间

接下来,咱们通过实际的例子来看看怎么设置 Nginx 的缓存过期时间。

假设我们有一个网站,里面有图片、CSS 文件和动态页面。我们希望图片和 CSS 文件能缓存比较长的时间,比如一个月,而动态页面只缓存 5 分钟。

首先,在 Nginx 的配置文件中,找到对应的 location 块。对于图片(比如 .jpg.png 等格式)和 CSS 文件(.css 格式),可以这样设置:

location ~* \.(jpg|png|css)$ {
    expires 30d;
}

这里的 expires 30d 表示这些文件的缓存有效期是 30 天。

对于动态页面,比如 .php 文件,我们可以这样设置:

location ~* \.php$ {
    add_header Cache-Control "max-age=300";
}

这里的 Cache-Control: max-age=300 表示缓存的最大有效时间是 300 秒,也就是 5 分钟。

通过这样的设置,Nginx 就会根据不同的文件类型和需求来管理缓存的过期时间,实现了对资源的合理利用和优化。

四、基于变量的动态缓存过期策略

有时候,我们的缓存过期策略可能不是那么简单,需要根据一些动态的条件来决定。这时候,Nginx 的变量就派上用场了。

比如说,我们有一个电商网站,对于热门商品的页面,我们希望缓存时间长一点,而对于冷门商品的页面,缓存时间短一些。我们可以通过获取商品的热度值作为变量,来动态设置缓存过期时间。

在 Nginx 的配置文件中,我们可以这样做:

map $arg_product_hotness $cache_expiry {
    default 300;
    hot 3600;
    very_hot 86400;
}

location /product {
    add_header Cache-Control "max-age=$cache_expiry";
}

在上面的例子中,我们首先通过 map 指令定义了一个根据商品热度值($arg_product_hotness)来确定缓存过期时间($cache_expiry)的映射关系。然后,在 location 块中,通过 add_header 指令将这个动态计算出来的过期时间添加到 Cache-Control 头中。

这样,Nginx 就能根据商品的热度灵活地调整缓存策略,实现更精细化的缓存管理。

五、使用第三方模块增强缓存功能

Nginx 本身的缓存功能已经很强大了,但是有时候为了满足更复杂的需求,我们还可以借助第三方模块来进一步增强。

比如说,nginx-cache-purge 模块可以让我们手动清除指定的缓存。这就好比你有一个超级遥控器,可以随时把不想要的东西从“仓库”里扔出去。

安装并启用这个模块后,我们就可以通过发送特定的请求来清除缓存。比如,发送一个 PURGE 请求到指定的 URL,Nginx 就会把对应的缓存删除。

location /purge {
    allow 127.0.0.1;
    deny all;

    if ($request_method = PURGE) {
        # 清除缓存的逻辑
        ngx_cache_purge...
    }
}

通过这样的方式,我们在必要的时候可以手动干预缓存,确保数据的及时性和准确性。

六、缓存的更新与失效机制

有了缓存,还得考虑它什么时候更新,不然用户看到的可能一直是旧数据。Nginx 提供了几种方式来处理缓存的更新和失效。

一种常见的方式是通过设置 Last-ModifiedETag 头信息。服务器在响应请求时,会把资源的最后修改时间(Last-Modified)或者唯一标识(ETag)返回给客户端。当客户端再次请求时,会带上这些信息。Nginx 会根据这些信息来判断缓存是否有效,如果无效,就重新获取最新的资源。

比如说,服务器返回的响应头中有 Last-Modified: Thu, 01 Jan 2023 00:00:00 GMT,客户端下次请求时带上 If-Modified-Since: Thu, 01 Jan 2023 00:00:00 GMT,Nginx 就会比较这两个时间,如果资源没有在这之后修改,就直接返回 304 状态码,使用缓存;否则,返回新的资源。

另一种方式是通过后端服务器的通知。如果后端服务器在数据更新时能够通知 Nginx,那么 Nginx 就可以及时地使相关缓存失效。

这就好比你有一个消息灵通的朋友,一旦有新的消息,他马上告诉你,让你能及时做出反应。

七、缓存命中率与性能监控

设置好了缓存过期策略,我们还得看看效果怎么样,这就需要关注缓存的命中率和性能监控。

缓存命中率就像是投篮的命中率,越高说明我们的缓存策略越有效。我们可以通过 Nginx 的日志或者一些监控工具来获取缓存命中率的信息。

如果缓存命中率低,那可能是我们的过期时间设置不合理,或者缓存的策略不够精细。这时候就需要我们重新审视和调整策略,就像调整投篮的姿势和力度一样,找到最佳的方式。

同时,还要监控服务器的性能指标,比如响应时间、吞吐量等,看看缓存是否真的起到了减轻服务器压力、提高性能的作用。

八、实际应用中的注意事项

在实际应用 Nginx 的缓存过期策略时,还有一些需要注意的地方。

首先,要充分考虑业务的特点和用户的需求。不同的网站和应用,对数据的及时性要求是不一样的。比如新闻网站可能要求数据更新非常及时,缓存时间就要短;而一些静态的文档类网站,缓存时间可以长一些。

其次,要注意缓存的一致性。如果多个用户同时访问同一个资源,并且其中一个用户的操作导致资源更新,要确保其他用户能够及时获取到最新的数据,避免出现数据不一致的情况。

最后,测试是必不可少的。在上线新的缓存策略之前,一定要在测试环境中进行充分的测试,确保不会出现意外的问题。

总之,Nginx 的缓存过期策略是一项强大的工具,但要用好它,需要我们深入理解业务需求,精心设计策略,并不断地监控和优化。就像驾驭一辆高性能的汽车,只有熟悉它的性能,掌握好驾驶技巧,才能在道路上跑得又快又稳。

希望通过本文的介绍,您对 Nginx 的缓存过期策略有了更深入的了解,能够在实际应用中发挥它的最大作用,为您的网站和应用带来更出色的性能表现。

line

🎉相关推荐

  • 🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!
  • 📘Nginx 技术专栏
  • 🍅CSDN-技术社区

Nginx

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

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

相关文章

rv1126利用rkmedia、opencv、rockx……完成人脸识别

一、总体框架 视频采集、处理使用rkmedia:vi模块进行视频输入、rga模块进行视频处理 人脸识别:先获取rga输出码流,再调用rkmedia的模型对人脸进行推理(线程1) 打框框:opencv(线程2&#xff0…

go-kratos 学习笔记(2) 创建api

proto 声明SayHi 先删除go.mod 从新初始化一下 go mod init xgs_kratosgo mod tidy 编辑 api/helloword/v1/greeter.proto 新声明一个方法 rpc SayHi (HelloHiRequest) returns (HelloHiReply) {option (google.api.http) {post: "/hi"body: "*"};} …

Leetcode之string

目录 前言1. 字符串相加2. 仅仅反转字母3. 字符串中的第一个唯一字符4. 字符串最后一个单词的长度5. 验证回文串6. 反转字符串Ⅱ7. 反转字符串的单词Ⅲ8. 字符串相乘9. 打印日期 前言 本篇整理了一些关于string类题目的练习, 希望能够学以巩固. 博客主页: 酷酷学!!! 点击关注…

llama 2 改进之 RMSNorm

RMSNorm 论文:https://openreview.net/pdf?idSygkZ3MTJE Github:https://github.com/bzhangGo/rmsnorm?tabreadme-ov-file 论文假设LayerNorm中的重新居中不变性是可有可无的,并提出了均方根层归一化(RMSNorm)。RMSNorm根据均方根(RMS)将…

DolphinScheduler安装教程

DolphinScheduler安装教程 前期准备工作 jdk 1.8mysql 5zookeeper 3.4.6hadoop 2.6psmisc yum -y install psmisc 解压安装包 # 将安装包apache-dolphinscheduler-2.0.8-bin.tar.gz放置/opt/download目录下 # 解压缩 tar -zxvf apache-dolphinscheduler-2.0.8-bin.tar.gz -C …

MYSQL 第二次作业

要求: mysgl>create database mydb8 worker; mysq> use mydb8 worker; mysgl>create table t worker( department id int(11)not null comment部门号, worker id int(11)primary key not null comment职工号, worker date date not null comment工作时间,…

使用wireshark第一次捕获数据包

打开wireshark: 点击捕获,选项。 这里我选择以太网,然后点开始: 然后就成这样了: 点击左上角那个红色的按钮,可以暂停捕获,就变成了下面的样子: 这三个框有自己的名字&…

Nginx 怎样处理请求的重试机制?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会! 文章目录 Nginx 怎样处理请求的重试机制?一、为何需要重试机制?二、Nginx 中的重试机制原理三、Nginx 重试机制的配置参数四、Nginx 重试机制的实际…

【MySQL进阶之路 | 高级篇】范式概述与第一范式

1. 范式简介 在关系型数据库中,关于数据表的设计的基本原则,规则就称为范式。可以理解为,一张数据表的设计结果需要满足的某种设计标准的级别。要想设计一个结构合理的关系型数据库,必须满足一定的范式。 范式的英文名是Normal …

MongoDB教程(十八):MongoDB MapReduce

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言一、MapRed…

阿里云ubuntu宝塔面板部署uni-app-flask-websocket前后端项目

1.下载宝塔面板 wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh ed8484bec 然后去安全组开放对应的端口 面板账户登录信息 【云服务器】请在安全组放行 29725 端口 进入控制面板后修改默认用户名和密码 2. …

Flask 框架 redirect() url_for()

url_for url_for 函数根据传入的端点名称(即路由函数名)生成对应的 URL。 1. url_for() url_for 函数根据传入的端点名称(即路由函数名)生成对应的 URL。 它接受一个或多个参数,其中第一个参数是路由的名称&#x…

antdesgin table 组件下载成excel

文章目录 发现宝藏一、需求二、报错 发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【宝藏入口】。 一、需求 原组件如下,需要添加下载功能 import React, { useState } from rea…

学习测试10-3自动化 web自动化

web自动化 chrome驱动下载地址: https://registry.npmmirror.com/binary.html?pathchromedriver/ https://googlechromelabs.github.io/chrome-for-testing/#stable观察Google版本,下相应的驱动 运行代码试试,成功Google就会弹出 from se…

记录|C#+winform创建扁平化风格界面

本项目的C#内容是自己跟做的,自己做的内容已经打包,可以通过自己跟做写的Dashboard界面,C#下的winform模式下载获得,但是需要花费3个积分 目录 前言一、左边设置和步骤界面步骤Step1.Step2.Step3.Step4Step5 二、右边属性和步骤属…

【PyTorch】基于LSTM网络的气温预测模型实现

假设CSV文件名为temperature_data.csv,其前五行和标题如下: 这里,我们只使用Temperature列进行单步预测。以下是整合的代码示例: import pandas as pd import numpy as np import torch import torch.nn as nn import torch.op…

【深度学习】yolov8-seg分割训练,拼接图的分割复原

文章目录 项目背景造数据训练 项目背景 在日常开发中,经常会遇到一些图片是由多个图片拼接来的,如下图就是三个图片横向拼接来的。是否可以利用yolov8-seg模型来识别出这张图片的三张子图区域呢,这是文本要做的事情。 造数据 假设拼接方式有…

Qt+OpenCascade开发笔记(一):occ的windows开发环境搭建(一):OpenCascade介绍、下载和安装过程

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/140604141 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

OpenStack Yoga版安装笔记(八)glance练习补充2

1、openstack image list数据流回顾 OpenStack Yoga版安装笔记(七)通过Wireshark抓包、Mermaid绘图,解析了执行openstack image list的数据流,图示如下: 数据流1-4:user admin认证,并获得admin…

ros2--中间件--rmw

rmw robot middleware 什么是中间件 一套位于操作系统之上,引用程序之下的软件。 在ros2中理解就是:中间件就是介于某两个或者多个节点中间的组件 中间件的作用 就是提供多个节点中间通信用的。 教程 ROS2中间件DDS架构 ros2从入门到精通