百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Nginx 备忘录 - 08. 缓冲区与缓存

off999 2025-01-05 19:30 11 浏览 0 评论

一、代理缓冲区

当我们增加了 Nginx 代理层时,请求流程为:客户端 → Nginx → 服务端,在这个过程中存在两个连接:客户端 → Nginx(外网)、Nginx → 服务端(内网),由于这两个连接所处的网路环境不同,他们的连接速度也是不一致的。

而 Nginx 代理缓冲区的用途就是来解决两个连接之间速度不匹配造成的问题,有了缓冲后,Nginx 代理可暂存后端的响应,然后按需供给数据给客户端。

# 启用或禁用服务端的响应缓冲
Syntax:	 proxy_buffering on | off;
Default: proxy_buffering on;
Context: http, server, location

# 设置从服务端读取第一部分响应所使用的缓冲区大小。
# 这部分通常包含了一个小的响应头。
# 该参数始终都是生效的,
# 并不受 proxy_buffering 的影响。
Syntax:	 proxy_buffer_size size;
Default: proxy_buffer_size 4k|8k;
Context: http, server, location

# 设置从服务端读取响应所使用的缓冲区个数和大小
Syntax:	 proxy_buffers number size;
Default: proxy_buffers 8 4k|8k;
Context: http, server, location

# 设置当还未从服务端读取到完整响应时,
# 允许给客户端发送响应的缓冲区大小(进入 busy 状态)。
# 缓冲区进入 busy 状态后将无法从服务端读取响应并写入。
Syntax:	 proxy_busy_buffers_size size;
Default: proxy_busy_buffers_size 8k|16k;
Context: http, server, location

# 设置磁盘临时文件的位置
Syntax:	 proxy_temp_path path [level1 [level2 [level3]]];
Default: proxy_temp_path proxy_temp;
Context: http, server, location

# 设置磁盘临时文件的最大空间
Syntax:	 proxy_max_temp_file_size size;
Default: proxy_max_temp_file_size 1024m;
Context: http, server, location

# 设置每次写入磁盘临时文件的大小。
Syntax:	 proxy_temp_file_write_size size;
Default: proxy_temp_file_write_size 8k|16k;
Context: http, server, location

当开启代理缓冲区时,nginx 会尽快的从服务端读取响应并缓存在内存分配的缓冲区中。代理缓冲区的大小由 proxy_buffer_size 和 proxy_buffers 参数指定。

当响应大小超出内存缓冲区时,一部分响应体可以保存在磁盘临时文件中。磁盘临时文件的大小由 proxy_max_temp_file_size 和 proxy_temp_file_write_size 参数指定。

所有的缓冲区参数是作用到每一个请求的。每一个请求会安按照参数的配置获得自己的缓冲区。

http {
  # ... ...
  
  server {
    proxy_buffering on;
    proxy_buffer_size 8k;
    proxy_buffers 8 8k;
    proxy_busy_buffers_size 16k;
    proxy_max_temp_file_size 1024m;
    proxy_temp_file_write_size 16k;
    
    # ... ...
  }
}

二、服务端缓存

当我们要构建一个高性能的 Web 应用时,服务端缓存扮演着关键的角色。Nginx 的 proxy_cache 模块提供了强大且灵活的缓存功能,对于优化网站性能,减轻服务端的负担,提高响应速度具有显著的效果。

# 设置缓存的路径和其他参数,缓存数据存储在文件中。
Syntax:  proxy_cache_path path [levels=levels] 
         [use_temp_path=on|off] keys_zone=name:size 
         [inactive=time] [max_size=size] 
         [min_free=size] [manager_files=number] 
         [manager_sleep=time] [manager_threshold=time] 
         [loader_files=number] [loader_sleep=time] 
         [loader_threshold=time] [purger=on|off] 
         [purger_files=number] [purger_sleep=time] 
         [purger_threshold=time];
Default: —
Context: http
  • path:缓存文件目录。缓存文件名是 proxy_cache_key 的 MD5 值,如:/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c
  • levels:缓存文件目录的层次结构,如 levels=1:2,表示有两级子目录,第一个目录名取 md5 值的倒数第一个值,第二个目录名取 md5 值的倒数第 2 和 3 个值;层次结构最多 3 层,每层目录名长度为 1 或 2。
  • keys_zone:定义共享内存区的名称和大小。所有 key 和有关数据的信息都存储在共享内存区域中。1MB 的区域可以存储大约 8000 个 key。
  • inactive:在该参数指定的时间内未访问的缓存数据将从缓存中删除。默认10分钟。
  • max_size:缓存区最大尺寸。当超过大小或没有足够的可用空间时,它会删除最近使用最少的数据。
# 开启或关闭代理缓存功能,并指定共享内存区域。
# 共享内存区域在 proxy_cache_path 中定义。
Syntax:  proxy_cache zone | off;
Default: proxy_cache off;
Context: http, server, location

# 定义缓存的键,用于区分不同的缓存项。
Syntax:  proxy_cache_key string;
Default: proxy_cache_key $scheme$proxy_host$request_uri;
Context: http, server, location

# 设置对于哪些 HTTP Method 开启缓存。
Syntax:  proxy_cache_methods GET | HEAD | POST ...;
Default: proxy_cache_methods GET HEAD;
Context: http, server, location

# 定义不同 HTTP 响应码的缓存有效期。
Syntax:  proxy_cache_valid [code ...] time;
Default: —
Context: http, server, location

# 设置资源被请求多少次后被缓存
Syntax:  proxy_cache_min_uses number;
Default: proxy_cache_min_uses 1;
Context: http, server, location

# 哪些情况下可以使用过时的缓存响应
# 即指定服务端特定异常时使用缓存返回给客户端
Syntax:  proxy_cache_use_stale error | timeout 
         | invalid_header | updating | http_500 
         | http_502 | http_503 | http_504 
         | http_403 | http_404 | http_429 | off ...;
Default: proxy_cache_use_stale off;
Context: http, server, location

# 定义响应不会保存到缓存的条件
Syntax:  proxy_no_cache string ...;
Default: —
Context: http, server, location

# 定义不从缓存中获取响应的条件
Syntax:  proxy_cache_bypass string ...;
Default: —
Context: http, server, location

Nginx 缓存配置示例:

http{
  proxy_cache_path /opt/nginx/cache
                   levels=1:2 
                   keys_zone=liwy_cache:10m 
                   inactive=1d 
                   max_size=10g;
  upstream liwy_server {
    server 192.168.2.13:8081;
    server 192.168.2.13:8082;
  }
  server {
    listen 80;
    server_name www.liwy-nginx.com;
    
    location / {
      proxy_cache liwy_cache;
      proxy_cache_key $scheme$proxy_host$uri$is_args$args;
      proxy_cache_min_uses 3;
      proxy_cache_valid 200 302 10m;
      proxy_cache_valid 301 1h;
      proxy_cache_valid any 1m;
      proxy_no_cache $cookie_nocache $arg_nocache$arg_comment;
      # 响应头中添加缓存是否命中的状态,便于调试
      add_header X-Proxy-Cache $upstream_cache_status;
      
      proxy_pass http://liwy_server;
    }
  }
}

相关推荐

Python如何操作Excel,xlrd和xlwt类库的使用

xlrd和xlwt类库简介xlrd和xlwt是Python中两个用于处理Excel文件的类库。xlrd用于读取Excel文件,xlwt用于写入Excel文件。这两个类库可以在Python中方便地处理E...

操作Excel,Python根本打不过VBA

很开心今天把一个与财务有关的Excel取数计算方面的项目收尾了。这次项目使用的是ExcelVBA语言开发。作为一名Python语言使用者,经历过这次项目开发后,更加坚定了Python根本不可能动摇V...

个人用户将Excel接入DeepSeek的详细步骤指南

个人用户将Excel接入DeepSeek的详细步骤指南,无需复杂编程基础,提供多种实现方式:一、准备工作:获取DeepSeekAPI密钥1.注册DeepSeek账号-访问[DeepSeek官网...

Python通过win32库操控Excel实战指南

Python通过win32库操控Excel实战指南。同学们,我是张老师。今天给大家讲的是Python通过win32库操控Excel实战指南。今天课的主要内容有:易开发、环境配置、二Excel基础操作实...

如何在Excel中直接使用DeepSeek的功能

在Excel中直接使用DeepSeek的功能(如AI模型能力),目前需通过间接集成方式实现,因为DeepSeek并未提供官方的Excel插件。以下是两种常用方法:方法1:通过API调用集成(推荐)若D...

Python自动化:xlrd读取excel

#pipinstallxlrd工作簿、工作表相关操作:importxlrd#打开工作簿people=xlrd.open_workbook('people1.xls')...

Python自动化:openpyxl读取excel,补充了些内容

打开工作簿,选择工作表importopenpyxl#打开已有工作簿wb=openpyxl.load_workbook('example1.xlsx')#sheetna...

Python自动化:openpyxl读取excel

#pipinstallopenpyxl工作簿、工作表相关操作:importopenpyxl#打开已有工作簿wb=openpyxl.load_workbook('example...

Java的优势:跨平台只是一部分

以下讨论只针对PC端和移动端。Java最大的优势真的在于跨平台吗?以前是,但现在已经不是了。有跨平台需求的仅仅是客户端应用,而不是服务端。例如桌面应用,你的客户可能是Windows用户,也可能是Lin...

都2023年了,为什么大家还都在吹捧 Python?

2023年,Python还可学吗?答案当然是可。近些年间,Python的火热有目共睹,作为一种功能强大的高级编程语言,在2018年的时候它的流行程度就得到了大幅提高。入门人工智能有很多种选择...

Python编程语言的优势有哪些?

1.简单易学:Python采用极简主义设计思想,语法简单优雅,不需要很复杂的代码和逻辑,即可实现强大的功能。这使得Python很适合初学者学习,可以帮助初学者快速入门。2.开源免费:Python所有内...

Python操作Excel库xlrd与xlwt常用操作详解

来源:早起Python作者:刘早起大家好,我是早起。在之前的Python办公自动化系列文章中,我们已经相信介绍了openyxl、xlsxwriter等Python操作Excel库。openpyxl操作...

python处理Excel,从此爱上python

python能干的事情太多,对于小白来说,只能望洋生叹,不过不要灰心,看看我是如何使用python处理Excel的,你就能理解python的简单和高效。一、Excel文件1、文件路径F:/...

软件测试|Python操作Excel制作报表,不要太方便

前言今天我们介绍的是Python操作Excel制作报表,我们需要用到的库是openpyxl,我们主要使用的功能有下列几个功能插入与查询数据分类数据统计数据可视化字体颜色修改基本操作表格初始数据如下图所...

python笔记52:python操作excel

主要内容:小目标:掌握excel模块主要内容:excel相关模块,openpyxl安装使用如果看完这篇文章,你还是弄不明excel相关操作;你来找我,我保证不打你,我给你发100的大红包。1.ex...

取消回复欢迎 发表评论: