分布式 - 服务器Nginx:一小时入门系列之代理缓冲与缓存
官方文档:https://nginx.org/en/docs/http/ngx_http_proxy_module.html
1. 代理缓冲 proxy_buffer
代理缓冲用于临时存储从后端服务器返回的响应数据。通过使用代理缓冲,Nginx可以在接收完整的响应后再将其发送给客户端,从而提高性能和效率。
① 客户端往往是用户网络,情况复杂,可能出现网络不稳定,速度较慢的情况。而nginx到后端server一般处于同一个机房或者区域,网速稳定且速度极快。
② 如果禁用了缓冲,则在客户端从代理服务器接收响应时,响应将同步发送到客户端。对于需要尽快开始接收响应的快速交互式客户端,此行为可能是可取的。这就会带来一个问题:因为客户端到 nginx 的网速过慢,导致 nginx 只能以一个较慢的速度将响应传给客户端;进而导致后端server也只能以同样较慢的速度传递响应给nginx,造成一次请求连接耗时过长。
③ 启用缓冲后,nginx先将后端的请求响应放入缓冲区中,等到整个响应完成后,再发给客户端。

开启代理缓冲后,nginx 可以用较快的速度尽可能将响应体读取并缓冲到本地内存或磁盘中,同时根据客户端的网络质量以合适的网速将响应传递给客户端。这样既解决了server端连接过多的问题,也保证了能持续稳定的像客户端传递响应。
1. proxy_buffering 指令
当 proxy_buffering 设置为 off 时,Nginx 将禁用代理缓冲。这意味着当 Nginx 作为代理服务器转发请求时,它将立即将响应从上游服务器传递给客户端,而不会先将响应缓存到 Nginx 服务器上。
使用 proxy_buffering 启用和禁用缓冲,nginx默认为 on 启用缓冲,若要关闭,设置为 off 。
proxy_buffering off;
禁用代理缓冲可以提高实时性和响应速度,特别适用于实时通信、流媒体或需要立即将数据传递给客户端的应用程序。然而,禁用代理缓冲也可能增加上游服务器的负载,因为它们需要即时响应每个请求。
禁用代理缓冲可以提高实时性和响应速度,特别适用于实时通信、流媒体或需要立即将数据传递给客户端的应用程序。然而,禁用代理缓冲也可能增加上游服务器的负载,因为它们需要即时响应每个请求。
2. proxy_buffers 与 proxy_buffer_size 指令
proxy_buffers 指令用于设置代理服务器缓存响应的缓冲区大小和数量。它的语法如下:
proxy_buffers number size;
其中,number 表示缓冲区的数量,size 表示每个缓冲区的大小。例如,如果设置为 proxy_buffers 4 32k; 则会为每个客户端连接分配 4 个缓冲区,每个缓冲区的大小为 32KB。
通常情况下,来自后端服务器响应的第一部分存储在单独的缓冲区中,这个缓冲区存储的是相对较小的响应头部信息,大小通过 proxy_buffer_size 指令进行设置 ,建议将 proxy_buffer_size 设置为小于默认值。默认情况下,proxy_buffer_size 的大小为4k,但可以根据实际需求进行调整。
location / {proxy_buffers 16 4k;proxy_buffer_size 2k;proxy_pass http://localhost:8088;
}
2. 代理缓存
启用缓存后,nginx将响应保存在磁盘中,返回给客户端的数据首先从缓存中获取,这样子相同的请求不用每次都发送给后端服务器,减少到后端请求的数量。

1. proxy_cache_path 指令
proxy_cache_path 指令用于指定缓存文件存储的路径、缓存文件的格式、缓存文件的最大大小等参数。以下是 proxy_cache_path 的常用参数:
- path: 缓存文件存储的路径。
- levels: 缓存文件存储的目录层数。
- keys_zone: 缓存文件的键值对存储区域。
- inactive: 缓存文件的过期时间,单位为秒。
- max_size: 缓存文件的最大大小。
- use_temp_path: 是否使用临时文件夹存储缓存文件。
例如,以下配置将缓存文件存储在 /var/cache/nginx 目录下,缓存文件的键值对存储区域为 my_cache,缓存文件的过期时间为 10 分钟,缓存文件的最大大小为 1GB:
proxy_cache_path /var/cache/nginx keys_zone=my_cache:10m inactive=10m max_size=1g;
在配置反向代理时,可以使用 proxy_cache 指令启用缓存,例如:
location / {proxy_pass http://backend;proxy_cache my_cache;proxy_cache_valid 200 10m;
}
以上配置将启用缓存,并设置缓存文件的过期时间为 10 分钟。当 Nginx 收到客户端请求时,如果缓存中存在对应的响应,Nginx 将直接返回缓存中的响应,而不是向后端服务器发起请求。
2. proxy_cache_valid 指令
proxy_cache_valid 指令用于设置缓存的有效期。
proxy_cache_valid [code ...] time;
其中,code是HTTP响应状态码,可以是一个或多个,用空格分隔。如果省略code参数,则表示适用于所有状态码。time是缓存的有效期,可以是一个时间段,也可以是一个时间戳。
如果要设置不同状态码的不同缓存时间,可以使用多个proxy_cache_valid指令,例如:
proxy_cache_valid 200 10m;
proxy_cache_valid 404 1m;
这样就表示缓存200状态码的响应10分钟,缓存404状态码的响应1分钟。
3. proxy_cache_min_uses 指令
可以使用 proxy_cache_min_uses 设置相同的key的请求,访问次数超过指定数量才会被缓存。
proxy_cache_min_uses 指令用于设置在缓存服务器中缓存一个响应所需的最小请求数。当一个请求被代理到后端服务器时,如果该请求的响应已经被缓存,Nginx 会将缓存的响应返回给客户端,而不是将请求转发到后端服务器。proxy_cache_min_uses 指令可以控制在缓存服务器中缓存一个响应所需的最小请求数,以避免缓存不必要的响应。当一个响应被缓存时,Nginx 会记录该响应被缓存的时间,并在一定时间后将其从缓存中删除。如果一个响应被缓存的时间太短,那么它可能会被频繁地从缓存中删除和重新缓存,这会浪费缓存服务器的资源。因此,通过设置 proxy_cache_min_uses 指令,可以确保只有经过多次访问的响应才会被缓存,从而提高缓存服务器的效率。
proxy_cache_min_uses 5;
默认情况下,响应无限期地保留在缓存中。仅当缓存超过最大配置大小时,按照时间删除最旧的数据。
3. 应用
proxy_cache_path /var/cache/nginx/data keys_zone=mycache:10m;server {listen 8001;server_name ruoyi.localhost;location / {#设置bufferproxy_buffers 16 4k;proxy_buffer_size 2k;proxy_pass http://localhost:8088; }location ~ \.(js|css|png|jpg|gif|ico) {#设置cacheproxy_cache mycache;proxy_cache_valid 200 302 10m;proxy_cache_valid 404 1m;proxy_cache_valid any 5m;proxy_pass http://localhost:8088; }location = /html/ie.html {proxy_cache mycache;proxy_cache_valid 200 302 10m;proxy_cache_valid 404 1m;proxy_cache_valid any 5m;proxy_pass http://localhost:8088; }location ^~ /fonts/ {proxy_cache mycache;proxy_cache_valid 200 302 10m;proxy_cache_valid 404 1m;proxy_cache_valid any 5m;proxy_pass http://localhost:8088; }
}
相关文章:
分布式 - 服务器Nginx:一小时入门系列之代理缓冲与缓存
官方文档:https://nginx.org/en/docs/http/ngx_http_proxy_module.html 1. 代理缓冲 proxy_buffer 代理缓冲用于临时存储从后端服务器返回的响应数据。通过使用代理缓冲,Nginx可以在接收完整的响应后再将其发送给客户端,从而提高性能和效率…...
什么是集成学习算法
目录 什么是集成学习算法 集成学习发展史 集成学习组织方式 1) 并联组织关系...
springboot多模块打包方式
明确子父模块结构 父目录是带modules 大致结构如下: <modules><module>ruoyi-admin</module><module>ruoyi-framework</module><module>ruoyi-system</module><module>ruoyi-quartz</module><module>…...
【爬虫】Urllib让我们的 python 假装是浏览器
在 Python 这个内置的 Urllib 库中,有这么 4 个模块: request,request模块是我们用的比较多的,就是用它来发起请求,所以我们重点说说这个模块。error,error模块呢,就是当我们在使用 request 模…...
java基础面试
java深拷贝和浅拷贝的区别 深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。 假设B复制了A,修改A的时候,看B是否发生变化: 如果B跟着也变了,说明是浅拷贝,拿人手短ÿ…...
C++ 动态规划经典案例解析之最长公共子序列(LCS)_窥探递归和动态规划的一致性
1. 前言 动态规划处理字符相关案例中,求最长公共子序列以及求最短编辑距离,算是经典中的经典案例。 讲解此类问题的算法在网上一抓应用一大把,即便如此,还是忍不住有写此文的想法。毕竟理解、看懂都不算是真正掌握,唯…...
接口测试自动化:简化测试流程,提升效率
接口测试自动化:简化测试流程,提升效率 什么是接口测试自动化? 接口测试自动化是指使用特定的工具和技术来自动化执行接口测试的过程。通过编写脚本,自动化工具可以模拟用户与软件系统的交互,验证接口的功能和性能。…...
LoRA微调方法详解
本文要介绍的是大模型的微调训练方法之一----LoRA。 0 背景 现在大模型非常火爆,大家都在想方设法应用大模型。 当前很多大模型虽说可以zero-shot直接使用, 但是在具体应用上一般还是微调一下效果更好, 也就是常说的finetune。 在小模型时代…...
redis-数据类型及样例
一.string 类型数据的基本操作 1.添加/修改数据 set key value2.获取数据 get key3.删除数据 del key4.添加/修改多个数据 mset key1 value1 key2 value25.获取多个数据 mget key1 key2二.list类型的基本操作 数据存储需求:存储多个数据,并对数据…...
公司电脑三维图纸加密、机械图挡加密软件
机械图纸加密软件的问世,让很多的网络公司都大受其带来的工作中的便利。在安装了机械图纸加密软件后,不仅可以很好的管理员工在工作时的上网娱乐,在对整个公司员工的工作效率上也有着明显的提高,那么对于机械图纸加密软件的具体特…...
安装使用IDEA,修改样式,配置服务,构建Maven项目(超级详细版)
目录 前言: 一,安装 1.1打开官网JetBrains: Essential tools for software developers and teams点击 Developer Tools,再点击 Intellij IDEA 2.点击下载编辑 3.选择对应的版本,左边的 Ultimate 版本为旗舰版,需要…...
Apache Dubbo 云原生可观测性的探索与实践
作者:宋小生 - 平安壹钱包中间件资深工程师 Dubbo3 可观测能力速览 Apache Dubbo3 在云原生可观测性方面完成重磅升级,使用 Dubbo3 最新版本,你只需要引入 dubbo-spring-boot-observability-starter 依赖,微服务集群即原生具备以…...
DaVinci Resolve Studio 18 for Mac 达芬奇调色
DaVinci Resolve Studio 18是一款专业的视频编辑和调色软件,适用于电影、电视节目、广告等各种视觉媒体的制作。它具有完整的后期制作功能,包括剪辑、调色、特效、音频处理等。 以下是DaVinci Resolve Studio 18的主要特点: - 提供了全面的视…...
Excelize Go语言操作 Office Excel文档基础库
Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的电子表格文档。支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多种文档格式…...
SpringBoot、Java 使用 Jsoup 解析 HTML 页面
使用 Jsoup 解析 HTML 页面 什么是 Jsoup? Jsoup 是一个用于处理 HTML 页面的 Java 库,它提供了简单的 API,使得从 HTML 中提取数据变得非常容易。无论是获取特定标签的内容还是遍历整个页面的元素,Jsoup 都能轻松胜任。 如何使…...
C# 随心记
#region 批量保存到数据库 public bool InsertDB(DataTable dt) { bool bResult true; LogInfo.WriteTextToFile("使用Bulk插入的实现方式"); Stopwatch sw new Stopwatch(); using (SqlConnecti…...
华为OD机试-字符串分割
题目描述 给定一个非空字符串S,其被N个‘-’分隔成N1的子串,给定正整数K,要求除第一个子串外,其余的子串每K个字符组成新的子串,并用‘-’分隔。对于新组成的每一个子串,如果它含有的小写字母比大写字母多…...
element-ui的el-dialog,简单的封装。
el-dialog是使用率很高的组件 使用el-dialog很多都是按照文档的例子,用一个变量控制是否显示,再来一个变量控制标题。 如果我这个对话框多个地方使用的话还要创建多个变量,甚至关闭之后还要清空一些变量,应该可以简化一点。我写…...
SpringBoot引入外部jar打包失败解决,SpringBoot手动引入jar打包war后报错问题
前言 使用外部手动添加的jar到项目,打包时出现jar找不到问题解决 处理 例如项目结构如下 引入方式换成这种 <!-- 除了一下这两种引入外部jar,还是可以将外部jar包添加到maven中(百度查)--><!-- pdf转word --><…...
HTTP基础:学习HTTP协议的基本知识,了解请求和响应的过程
HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种用于传输超媒体文档(如HTML)的应用层协议,它是Web中最基本的协议。 HTTP请求和响应都是由客户端和服务器之间进行的。 一个完整的HTTP请求由以下几…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...
用js实现常见排序算法
以下是几种常见排序算法的 JS实现,包括选择排序、冒泡排序、插入排序、快速排序和归并排序,以及每种算法的特点和复杂度分析 1. 选择排序(Selection Sort) 核心思想:每次从未排序部分选择最小元素,与未排…...
spring boot使用HttpServletResponse实现sse后端流式输出消息
1.以前只是看过SSE的相关文章,没有具体实践,这次接入AI大模型使用到了流式输出,涉及到给前端流式返回,所以记录一下。 2.resp要设置为text/event-stream resp.setContentType("text/event-stream"); resp.setCharacter…...
