【09】Nginx之缓存集成

2023-11-07

Nginx缓存集成

缓存的概念

缓存就是数据交换的缓冲区(称作:Cache),当用户要获取数据的时候,会先从缓存中去查询获取数据,如果缓存中有就会直接返回给用户,如果缓存中没有,则会发请求从服务器重新查询数据,将数据返回给用户的同时将数据放入缓存,下次用户就会直接从缓存中获取数据。缓存其实在很多场景中都有用到,比如:

场景 作用
操作系统磁盘缓存 减少磁盘机械操作
数据库缓存 减少文件系统的IO操作
应用程序缓存 减少对数据库的查询
Web服务器缓存 减少对应用服务器请求次数
浏览器缓存 减少与后台的交互次数

缓存的优点

  1. 减少数据传输,节省网络流量,加快响应速度,提升用户体验;
  2. 减轻服务器压力;
  3. 提供服务端的高可用性;

缓存的缺点

  1. 数据的不一致
  2. 增加成本

Nginx的web缓存服务

Nginx是从0.7.48版开始提供缓存功能。Nginx是基于Proxy Store来实现的,其原理是把URL及相关组合当做Key,在使用MD5算法对Key进行哈希,得到硬盘上对应的哈希目录路径,从而将缓存内容保存在该目录中。它可以支持任意URL连接,同时也支持404/301/302这样的非200状态码。Nginx即可以支持对指定URL或者状态码设置过期时间,也可以使用purge命令来手动清除指定URL的缓存。

Nginx缓存设置的相关指令

Nginx的web缓存服务主要是使用ngx_http_proxy_module模块相关指令集来完成,接下来我们把常用的指令来进行介绍下。

proxy_cache_path

该指定用于设置缓存文件的存放路径

语法 proxy_cache_path path [levels=number] keys_zone=zone_name:zone_size [inactive=time][max_size=size];
默认值
位置 http

path:缓存路径地址,如:

/usr/local/proxy_cache

levels: 指定该缓存空间对应的目录,最多可以设置3层,每层取值为1|2如 :

levels=1:2   缓存空间有两层目录,第一次是1个字母,第二次是2个字母
举例说明:
itheima[key]通过MD5加密以后的值为 43c8233266edce38c2c9af0694e2107d
levels=1:2   最终的存储路径为/usr/local/proxy_cache/d/07
levels=2:1:2 最终的存储路径为/usr/local/proxy_cache/7d/0/21
levels=2:2:2 最终的存储路径为??/usr/local/proxy_cache/7d/10/e2

keys_zone:用来为这个缓存区设置名称和指定大小,如:

keys_zone=itcast:200m  缓存区的名称是itcast,大小为200M,1M大概能存储8000个keys

inactive:指定缓存的数据多次时间未被访问就将被删除,如:

inactive=1d   缓存数据在1天内没有被访问就会被删除

max_size:设置最大缓存空间,如果缓存空间存满,默认会覆盖缓存时间最长的资源,如:

max_size=20g

配置实例:

http{
	proxy_cache_path /usr/local/proxy_cache keys_zone=itcast:200m  levels=1:2:1 inactive=1d max_size=20g;
}

proxy_cache

该指令用来开启或关闭代理缓存,如果是开启则自定使用哪个缓存区来进行缓存。

语法 proxy_cache zone_name|off;
默认值 proxy_cache off;
位置 http、server、location

zone_name:指定使用缓存区的名称

proxy_cache_key

该指令用来设置web缓存的key值,Nginx会根据key值MD5哈希存缓存。

语法 proxy_cache_key key;
默认值 proxy_cache_key $scheme$proxy_host$request_uri;
位置 http、server、location

proxy_cache_valid

该指令用来对不同返回状态码的URL设置不同的缓存时间

语法 proxy_cache_valid [code …] time;
默认值
位置 http、server、location

如:

proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
为200和302的响应URL设置10分钟缓存,为404的响应URL设置1分钟缓存
proxy_cache_valid any 1m;
对所有响应状态码的URL都设置1分钟缓存

proxy_cache_min_uses

该指令用来设置资源被访问多少次后被缓存

语法 proxy_cache_min_uses number;
默认值 proxy_cache_min_uses 1;
位置 http、server、location

proxy_cache_methods

该指令用户设置缓存哪些HTTP方法

语法 proxy_cache_methods GET|HEAD|POST;
默认值 proxy_cache_methods GET HEAD;
位置 http、server、location

默认缓存HTTP的GET和HEAD方法,不缓存POST方法。

Nginx缓存设置案例

需求分析
步骤实现

1.环境准备
应用服务器的环境准备

  1. 在192.168.200.146服务器上的tomcat的webapps下面添加一个js目录,并在js目录中添加一个jquery.js文件
  2. 启动tomcat
  3. 访问测试
http://192.168.10.141:8080/js/jquery.js

Nginx的环境准备

(1)完成Nginx反向代理配置

http{
	upstream backend{
		server 192.168.10.141:8080;
	}
	server {
		listen       8080;
        server_name  localhost;
        location / {
        	proxy_pass http://backend/js/;
        }
	}
}

(2)完成Nginx缓存配置

4.添加缓存配置

http{
	proxy_cache_path /usr/local/proxy_cache levels=2:1 keys_zone=itcast:200m inactive=1d max_size=20g;
	upstream backend{
		server 192.168.200.146:8080;
	}
	server {
		listen       8080;
        server_name  localhost;
        location / {
        	proxy_cache itcast;
            proxy_cache_key itheima;
            proxy_cache_min_uses 5;
            proxy_cache_valid 200 5d;
            proxy_cache_valid 404 30s;
            proxy_cache_valid any 1m;
            add_header nginx-cache "$upstream_cache_status";
        	proxy_pass http://backend/js/;
        }
	}
}

Nginx缓存的清除

方式一:删除对应的缓存目录

rm -rf /usr/local/proxy_cache/......

方式二:使用第三方扩展模块

ngx_cache_purge

(1)下载ngx_cache_purge模块对应的资源包,并上传到服务器上。

ngx_cache_purge-2.3.tar.gz

(2)对资源文件进行解压缩

tar -zxf ngx_cache_purge-2.3.tar.gz

(3)修改文件夹名称,方便后期配置

mv ngx_cache_purge-2.3 purge

(4)查询Nginx的配置参数

nginx -V

(5)进入Nginx的安装目录,使用./configure进行参数配置

./configure --add-module=/root/nginx/module/purge

(6)使用make进行编译

make

(7)将nginx安装目录的nginx二级制可执行文件备份

mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginxold

(8)将编译后的objs中的nginx拷贝到nginx的sbin目录下

cp objs/nginx /usr/local/nginx/sbin

(9)使用make进行升级

make upgrade

(10)在nginx配置文件中进行如下配置

server{
	location ~/purge(/.*) {
		proxy_cache_purge itcast itheima;
	}
}

Nginx设置资源不缓存

前面咱们已经完成了Nginx作为web缓存服务器的使用。但是我们得思考一个问题就是不是所有的数据都适合进行缓存。比如说对于一些经常发生变化的数据。如果进行缓存的话,就很容易出现用户访问到的数据不是服务器真实的数据。所以对于这些资源我们在缓存的过程中就需要进行过滤,不进行缓存。

Nginx也提供了这块的功能设置,需要使用到如下两个指令

proxy_no_cache

该指令是用来定义不将数据进行缓存的条件。

语法 proxy_no_cache string …;
默认值
位置 http、server、location

配置实例

proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;

proxy_cache_bypass

该指令是用来设置不从缓存中获取数据的条件。

语法 proxy_cache_bypass string …;
默认值
位置 http、server、location

配置实例

proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment;

上述两个指令都有一个指定的条件,这个条件可以是多个,并且多个条件中至少有一个不为空且不等于"0",则条件满足成立。上面给的配置实例是从官方网站获取的,里面使用到了三个变量,分别是$cookie_nocache、$arg_nocache、$arg_comment

$cookie_nocache、$arg_nocache、$arg_comment

这三个参数分别代表的含义是:

$cookie_nocache
指的是当前请求的cookie中键的名称为nocache对应的值
$arg_nocache$arg_comment
指的是当前请求的参数中属性名为nocache和comment对应的属性值

案例演示下:

log_format params $cookie_nocache | $arg_nocache | $arg_comment;
server{
	listen	8081;
	server_name localhost;
	location /{
		access_log logs/access_params.log params;
		add_header Set-Cookie 'nocache=999';
		root html;
		index index.html;
	}
}

案例实现

设置不缓存资源的配置方案

server{
	listen	8080;
	server_name localhost;
	location / {
		if ($request_uri ~ /.*\.js$){
           set $nocache 1;
        }
		proxy_no_cache $nocache $cookie_nocache $arg_nocache $arg_comment;
        proxy_cache_bypass $nocache $cookie_nocache $arg_nocache $arg_comment;
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【09】Nginx之缓存集成 的相关文章

  • 如何在Python中在后台运行长时间运行的作业

    我有一个运行长时间运行的作业 大约几个小时 的网络服务 我正在使用 Flask Gunicorn 和 nginx 来开发它 我想做的是让需要很长时间才能完成的路线 调用创建线程的函数 然后 该函数将向路由返回一个 guid 并且路由将返回一
  • 为从 nginx 反向代理转发的请求添加唯一 id

    我们运行 nginx 作为反向代理 将请求转发到运行 Compojure 的 Clojure 应用程序 Compojure 是一个封装 Jetty 的库 为我们的应用程序提供服务 Web 请求的能力 目前 我们捕获 nginx 和 Cloj
  • 验证来自两个不同 URL 的 Keycloak 令牌

    我有一个Docker compose具有后端和前端组件的基于系统 后端写的是Python Flask并在多个 docker 容器中运行 前端编写为TypeScript with Angular 前端通过Restful API与后端进行通信
  • 为什么在生产中得到空 CSS 文件?

    我在文件中放入了很多css文件active admin css scss Active Admin s got SASS import active admin mixins import active admin base import
  • 使用 client_body_in_file_only 进行 nginx 文件上传

    晚上好 我需要将静态内容上传到 nginx 服务器 1 9 因此上传模块不适用于此版本 我读过这篇文章 Nginx 直接文件上传 无需通过后端传递 https coderwall com p swgfvw nginx direct file
  • Docker 与 nginx 组合不断显示欢迎页面

    我是新来的docker并尝试使用最简单的 docker compose yml 显示一个 hello world 页面 并在此基础上构建最终完整的LEMP堆栈它将与我的服务器具有相同的配置 然而大多数教程已经过时 并且有很多使用方法dock
  • 通过 nginx 入口控制器进行基本身份验证

    我正在使用 nginx 入口控制器 https kubernetes github io ingress nginx deploy https kubernetes github io ingress nginx deploy 在 AWS
  • 我怎样才能重写这个nginx“if”语句?

    例如 我想这样做 if http user agent MSIE 6 0 http user agent MSIE 7 0 etc etc rewrite ROOT ROOT ancient last break 而不是这个 if http
  • Nginx 中 uwsgi_pass 和 proxy_pass 的区别?

    我在 Nginx 后面运行 uWSGI 并一直在使用proxy pass让 Nginx 访问 uWSGI 切换到有什么好处吗uwsgi pass 如果是这样 那是什么 uwsgi pass使用一个uwsgi协议 proxy pass使用普通
  • 如何在位置中使用 Nginx Regexp

    Web 项目将静态内容放入 some content img 文件夹中 url规则为 img some md5 但文件夹中的位置 content img 前两位数字 Example url example com img fe5afe048
  • 如何正确链接 php-fpm 和 Nginx Docker 容器?

    我正在尝试链接 2 个单独的容器 nginx 最新 https registry hub docker com nginx php fpm https registry hub docker com php 问题是 php 脚本不起作用 也
  • 我可以在 Nginx Conf 中添加多少个服务器块

    知道我可以在 Nginx 配置中添加多少个服务器块吗 我需要将它用于具有多个子域的反向代理 每个客户端一个子域 它能成功支持 10 000 个服务器块吗 有没有相关的基准研究 这实际上并不是一个你有多少人的问题can但你有多少 能够妥善处理
  • Django + uwsgi + ngnix + 调试关闭 = 服务器错误(500)

    我正在尝试设置一个由 Django uwsgi Nginx 组成的生产服务器 我正在关注的教程位于此处http www panta info blog 3 how to install and configure nginx uwsgi a
  • 为什么 opcache 没有刷新?

    我用guzzlehttp guzzle封装在拉拉维尔 8 升级到后PHP 8 I get Symfony Component ErrorHandler Error FatalError Invalid opcode 117 2 0 in f
  • nginx 和 uwsgi 非常大的文件上传(>3Gb)

    也许有人知道该怎么做 我正在尝试上传大于 3Gb 的文件 没问题 如果我使用以下配置上传高达 2Gb 的文件 Nginx client max body size 5g client body in file only clean clie
  • 连接到上游时 Nginx 错误:(13:权限被拒绝)

    我在我的中收到此错误nginx error log file 2014 02 17 03 42 20 crit 5455 0 1 connect to unix tmp uwsgi sock failed 13 Permission den
  • 抑制 nginx 访问被拒绝错误日志

    我在 nginx 中设置了一些规则来拒绝 IP 访问 这很有效 但对于来自被拒绝 IP 的每个请求 都会记录以下开头的错误 error 7325 0 5761 access forbidden by rule client 有没有办法抑制这
  • Nginx merge_slashes 重定向

    我在我的 Java 应用程序中使用 nginx 我的问题是 nginx 正在合并斜杠 我无法将我的网站重定向到正确的版本 例如 http goout cz cs koncerty praha 被合并到 http goout cz cs ko
  • nginx 上的多个网站和可用网站

    通过 nginx 的基本安装 您的sites available文件夹只有一个文件 default 怎么样sites available文件夹的工作原理以及如何使用它来托管多个 单独的 网站 只是为了添加另一种方法 您可以为您托管的每个虚拟
  • 上游太大 - nginx + codeigniter

    我从 Nginx 收到此错误 但似乎无法弄清楚 我正在使用 codeigniter 并使用数据库进行会话 所以我想知道标题怎么会太大 有没有办法检查标题是什么 或者看看我能做些什么来修复这个错误 如果您需要我提供任何conf文件或其他文件

随机推荐

  • 射雕英雄传ol显示服务器断开,射雕英雄传OL5月28日维护更新内容

    为带来更好的游戏体验 射雕英雄传OL 全体服务器将于5月28日上午9 00 12 00期间进行例行停机维护与版本升级 今天小编就给大家带来 射雕英雄传OL 5月28日维护更新内容 此次版本升级详细内容如下 一 新增装备部位 翅膀 1 玩家升
  • 在线瓦片地图服务资源 总结

    常见的公开在线瓦片地图服务汇总 https www cnblogs com amadoGrowers p 13631127 html
  • Android O中修改NotificationChannel 属性,升级app后该修改不生效,必须卸载app重新安装才能生效

    Android 8 0中修改NotificationChannel 属性 升级app后该修改不生效 必须卸载app重新安装才能生效 原代码如下 public void notifyDownloading long progress long
  • 基于centos7的Openssh版本升级

    一 环境准备 yum y install wget tar gcc make 二 上传升级的软件包 zlib 1 2 11 tar gz openssl 1 1 1d tar gz openssh 9 0p1 tar gz 下载地址 zli
  • angular4-X知识点汇总

    1 生成新项目 ng new my app 生成过程会有点长 主要是需要下载很多的包 2 启动开发服务器 npm run start ng serve open ng serve o 3 NgModule是一个装饰器函数 它接收一个用来描述
  • 数星星(树状数组的理解与应用)

    数星星问题 文章目录 数星星问题 前导 问题详情 问题分析 关键语句分析 方法判断 代码 总结 前导 树状数组的原理详见如下链接 链接 https blog csdn net 2302 77698668 article details 13
  • Leptonica PIX 与 Qt QImage 的相互转换

    最近有个项目需要用到 OCR 功能 研究了一下 感觉 Tesseract 还不错 准备在项目中试试 但是发现 Tesseract 底层图像数据用到了 Leptonica 而我的程序准备用 Qt C 来写 这里就涉及一个问题 如何把 QIma
  • 提示Cannot resolve symbol xxx的解决办法

    今天有读者反映在spring boot项目中 已经导入了所有需要的包 但是提示如下错误 Cannot resolve symbol xxx 该错误的解决办法是 1 单击IDEA开发工具的File gt Invalidate Caches R
  • 数据结构视频教程 -《(东南大学 王茜)数据结构 (64讲)》

    整个视频打包下载地址 史上最全的数据结构视频教程系列分享之 东南大学 王茜 数据结构 64讲 转载请保留出处和链接 更多优秀资源请访问 我是码农 数据结构对于从事计算机系统软件和应用软件设计与开发人员非常重要 程序设计语言为数据结构的描述提
  • 基于Spring Boot开发的社区物业管理系统

    文章目录 项目介绍 主要功能截图 登录 车位收费管理 物业收费管理 投诉信息管理 车位管理 保修统计分析 部分代码展示 设计总结 项目获取方式 作者主页 Java韩立 简介 Java领域优质创作者 简历模板 学习资料 面试题库 关注我 都给
  • 【python教程入门学习】学习Python爬虫前的准备工作

    在使用 Python 编写爬虫程序之前 您需要提前做一些准备工作 这样在后续学习过程中才会得心应手 知识准备 1 Python语言 Python 爬虫作为 Python 编程的进阶知识 要求学习者具备较好的 Python 编程基础 对于没有
  • 浏览器输入url后发生了什么?

    在浏览器输入url后会发生的过程 1 DNS对域名进行解析 2 建立TCP连接 三次握手 3 发送HTTP请求 4 服务器处理请求 5 返回响应结果 6 关闭TCP连接 四次挥手 7 浏览器解析HTML 8 浏览器布局渲染 1 浏览器对输入
  • Flink流和表的转换

    流 表的转换 1 这种方式后续要进行tableSql的操作 推荐 tableEnv createTemporaryView tableName dataStream 2 这种方式后续要进行tableApi的操作不常用 Table table
  • Linux文件权限管理 chmod 读、写、可执行

    使用 ls l 查看文件权限 左侧第一列 rw r r 这些就是文件的权限信息 文件的权限分为三种 三种权限可相互叠加 最高权限为7 权限 字母 对应的二进制 对应的八进制 读 r 100 4 写 w 010 2 可执行 x 001 1 嗯
  • ajax传参数json对象到后台获取

    var data data name pxxx paramData dataSource a1 table t1 field f1 r name1 01 p name2 02 p 10 100 name2 01 p dataSource a
  • 输入若干个整数,当输入0时表示结束,统计每个输入整数的出现次数。

    描述 输入若干个整数 当输入0时表示结束 统计每个输入整数的出现次数 输入 输入若干个整数 整数之间以空格间隔 当输入0时表示结束 输出 分行输出每个整数出现的次数 行末不能有多余空格 输入示例 11 22 35 68 97 63 22 6
  • 内存分页、进程分页、页表长度

    内存分页 进程分页 页表长度 内存分页 内存空间分成一个个大小相等的分区 页框号或物理块号从0开始 每一个分区称作页框 一般大小为 4KB 进程分页 将用户进程的地址空间分为与页框大小相等的一个个区域 页号一般从0开始 每一个分区称作页 一
  • 设计模式:装饰者模式

    定义 动态给一个对象添加一些额外的职责 就象在墙上刷油漆 使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活 设计初衷 通常可以使用继承来实现功能的拓展 如果这些需要拓展的功能的种类很繁多 那么势必生成很多子类 增加系统
  • Latex写文章时插入单栏图片和双栏图片方法

    环境 WinEdt7 0 前言 使用latex写文章 经常需要插入图片 有时插入的图片需要单栏排版 有时插入的图片需要双栏排版 下面汇总单双栏图片插入方法 1 单栏图片 插入单栏图片很简单 许多文章的latex模板里面都有例子 即以下代码
  • 【09】Nginx之缓存集成

    Nginx缓存集成 缓存的概念 缓存就是数据交换的缓冲区 称作 Cache 当用户要获取数据的时候 会先从缓存中去查询获取数据 如果缓存中有就会直接返回给用户 如果缓存中没有 则会发请求从服务器重新查询数据 将数据返回给用户的同时将数据放入