Nginx缓存配置实现CDN加速

Nginx缓存配置实现CDN加速

  • 1. 前言
  • 2. 配置介绍
    • 2.1 proxy_cache_path
    • 2.2 proxy_cache
    • 2.3 proxy_cache_key
    • 2.4 proxy_cache_lock
    • 2.5 proxy_cache_lock_timeout
    • 2.6 proxy_cache_lock_age
    • 2.7 proxy_cache_min_uses
    • 2.8 proxy_cache_purge
    • 2.9 proxy_cache_valid
  • 3. 强制分片
  • 4. 配置示例
  • 5. 参考

1. 前言

Nginx缓存可以作为作为 CDN 节点实现访问文件的加速,可以极大减轻后端服务的带宽和机器负载。

本文介绍如何配置Nginx作为一个文件访问的缓存服务。

2. 配置介绍

2.1 proxy_cache_path

定义: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];

设置缓存的路径和其他参数,缓存数据存储在文件中。
缓存中的文件名是对 proxy_cache_key MD5计算而来。

  • path 定义缓存的路径
  • levels 定义缓存目录的深度,最多3层,例如:levels=1:2:2, 定义每层目录使用的字母长度;cache_key计算的MD5是 c/29/b7/f54b2df7773722d382f4809d65029c,则缓存文件的相对路径是:c/29/b7/f54b2df7773722d382f4809d65029c
  • use_temp_path 是否使用临时目录
  • keys_zone 活动密钥和数据信息都存储在一个共享内存区域中,name为名称,size为个数限制;
  • inactive 在参数指定的时间内未访问的缓存数据将从缓存中删除。默认为10分钟;
  • max_size 特殊的“缓存加载器”进程,设置的最大缓存大小,当超过该大小或可用空间不足时,它会删除最近最少使用的数据;
  • min_free 最小可用空间量
  • loader_files 启动一分钟后,特殊的“缓存加载器”进程被激活。它将有关文件系统上存储的先前缓存数据的信息加载到缓存区域中。加载也是以迭代方式完成的。在一次迭代中,最多loader_files加载 100 个项目(默认情况下为 100 个)
  • loader_threshold 一次迭代的持续时间受参数限制 loader_threshold(默认情况下为 200 毫秒);

注意:该参数需要定义在 http 模块下,能定义在 location 中。
以下其他参数可以定义在location。

2.2 proxy_cache

Syntax:  proxy_cache zone | off;
Default: proxy_cache off;

其中zone就是用于缓存的共享内存区域,在 proxy_cache_path中由keys_zone的name定义,同一个区域可以在多个地方使用。

2.3 proxy_cache_key

Syntax:  proxy_cache_key string;
Default: proxy_cache_key $scheme$proxy_host$request_uri;

定义缓存的键,例如:
proxy_cache_key "$host$request_uri $cookie_user";

默认情况下,该指令的值接近字符串:
proxy_cache_key $scheme$proxy_host$uri$is_args$args;

2.4 proxy_cache_lock

Syntax:  proxy_cache_lock on | off;
Default: proxy_cache_lock off;

启用后,每次只允许一个请求通过将请求传递到代理服务器,同一缓存元素的其他请求将等待响应出现在缓存中或释放此元素的缓存锁,最长不超过 proxy_cache_lock_timeout 指令设置的时间 。

2.5 proxy_cache_lock_timeout

Syntax:	 proxy_cache_lock_timeout time;
Default: proxy_cache_lock_timeout 5s;

超时后,请求将被传递给代理服务器,但响应不会被缓存。

2.6 proxy_cache_lock_age

Syntax:  proxy_cache_lock_age time;
Default: proxy_cache_lock_age 5s;

设置的时间内,如果传递给代理服务器以填充新缓存元素的最后一个请求尚未完成,则可能会向代理服务器传递另一个请求。一般设置 <= proxy_cache_lock_timeout 。

2.7 proxy_cache_min_uses

Syntax:  proxy_cache_min_uses number;
Default: proxy_cache_min_uses 1;

设置请求的数量达到一定次数之后响应将被缓存。

2.8 proxy_cache_purge

Syntax:  proxy_cache_purge string ...;

定义请求在何种条件下将被视为缓存清除请求,例如:
proxy_cache_purge PURGE

可通过 curl -X PURGE 进行对文件清除缓存。

2.9 proxy_cache_valid

Syntax:  proxy_cache_valid [code ...] time;

为不同的响应代码设置缓存时间,例如:

proxy_cache_valid 200 304 10m;
proxy_cache_valid 404      1m;

3. 强制分片

在以下场景下:

  • 若是请求的文件大小1G,失败重试的代价稍微较大;
  • 若是请求header使用了 Range: bytes=1024-2048 获取片段的场景;

可以在缓存的基础上,增加分片缓存,优势有:

  • 当大文件缓存时,失败后减少重试的流量,只需要重试分片到后端服务;
  • 也能解决后端代码框架 max_body_size 等类似的配置限制,通过分片从后端服务获取文件;
  • 请求header携带Range时,不用获取整个原文件大小,减少对后端的请求;

若是支持强制分片,需要 ngx_http_slice_module 模块的支持。

该模块不是默认构建的,需要通过 --with-http_slice_module 配置参数启用。

示例:

location / {slice             1m;proxy_cache       cache;proxy_cache_key   $uri$is_args$args$slice_range;proxy_set_header  Range $slice_range;proxy_cache_valid 200 206 1h;proxy_pass        http://localhost:8000;
}

注意:有如下配置是必须的:

  • proxy_cache_key 必须带上 $slice_range
  • proxy_cache_valid 状态码缓存需要加上 206
  • proxy_set_header 新增或者改变,到后端的Range统一为slice的大小;

增加了 slice 也有一定的缺点

当使用 curl -X PURGE 请求文件地址清除缓存的时候,默认只清除第一个分片的缓存,需要前端增加 curl -X PURGE -r 1048576-2097151 按照Range清除缓存。

其中Range 1048576-2097151 表示范围 1m-2m ,必须是 slice 值的倍数。

4. 配置示例

http {# ...# 定义缓存路径、zone等proxy_cache_path /data/proxycache levels=1:2:2 keys_zone=cache-hdd:1024m max_size=1024g inactive=48h use_temp_path=off;server {# 定义缓存使用的zone空间proxy_cache cache-hdd;location / {# 强制启用 Accept-Rangesproxy_force_ranges on;# 强制分片slice 100m;proxy_set_header Range $slice_range;# 缓存的key需要带上分片的rangeproxy_cache_key "$uri$slice_range";# 定义可以清除缓存proxy_cache_purge PURGE;# 文件访问了3次才将响应缓存下来proxy_cache_min_uses 3;# 对并发的请求,设置时间段内只发一个请求到后端proxy_cache_lock on;proxy_cache_lock_age 60s;proxy_cache_lock_timeout 60s;# 对不同状态码定义缓存时间proxy_cache_valid 200 206 304 48h;proxy_cache_valid 404 1s;# 在header中增加 MISS/HIT 标识add_header X-Cache-Status $upstream_cache_status;# 代理到后端proxy_pass http://domain;}}
}

5. 参考

  • NGINX Content Caching
  • Module ngx_http_proxy_module
  • Module ngx_http_slice_module
  • Nginx缓存配置

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

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

相关文章

【2024最新】 服务器安装Ubuntu20.04 (安装教程、常用命令、故障排查)持续更新中.....

安装教程&#xff08;系统、NVIDIA驱动、CUDA、CUDNN、Pytorch、Timeshift、ToDesk、花生壳&#xff09; 制作U盘启动盘&#xff0c;并安装系统 在MSDN i tell you下载Ubuntu20.04 Desktop 版本&#xff0c;并使用Rufus制作UEFI启动盘&#xff0c;参考UEFI安装Ubuntu使用GPTU…

mysql 的MHA

mysql 的MHA 什么是MHA 高可用模式下的故障切换&#xff0c;基于主从复制。 单点故障和主从复制不能切换的问题。 至少需要3台。 故障切换过程0-30秒。 vip地址&#xff0c;根据vip地址所在的主机&#xff0c;确定主备。 主 vip 备 vip 主和备不是优先确定的&#xff…

文件内容查找-Windows Linux

findstr /s /i /m /c:^huggingface.co^ *.js C盘的js文件内容包含huggingface.co 的文件名 grep "keyword" -r filename

InternLM Linux 基础知识

完成SSH连接与端口映射并运行hello_world.py 创建并运行test.sh文件 使用 VSCODE 远程连接开发机并创建一个conda环境

“pandas”的坑

参考&#xff1a;百度安全验证 本文基于python第三方数据分析库pandas&#xff0c;分享这几天所遇到的3个爬坑的案例&#xff0c;希望对也在爬坑的同学们尽一份绵薄之力&#xff0c;如有错误或者写得不好的地方&#xff0c;烦请指正&#xff0c;谢谢。 01df中startswith的坑 …

led灯什么牌子的质量好?led灯护眼效果好的五款爆品分享

大家在选择led灯的时候&#xff0c;最关心的就是“led灯什么牌子的质量好&#xff1f;”市面上商家推出来的led灯品牌众多&#xff0c;型号以及功能也是令人眼花缭乱的&#xff0c;既然如此&#xff0c;那我们应该如何买到质量过关又好用的led灯呢&#xff1f;接下来我将为大家…

敏感信息泄露wp

1.右键查看网页源代码 2.前台JS绕过&#xff0c;ctrlU绕过JS查看源码 3.开发者工具&#xff0c;网络&#xff0c;查看协议 4.后台地址在robots,拼接目录/robots.txt 5.用dirsearch扫描&#xff0c;看到index.phps,phps中有源码&#xff0c;拼接目录&#xff0c;下载index.phps …

网页封装app:如何将网站转换为移动应用程序?(网页封装app)

随着移动互联网的普及&#xff0c;越来越多的企业开始关注移动应用程序的开发。但是&#xff0c;对于一些小型企业或个人&#xff0c;开发一款移动应用程序可能需要投入大量的时间和金钱。这时&#xff0c;网页封装app就成了一个不错的选择。 app在线封装www,ppzhu.net 什么是…

【AI人工智能】文心智能体,00后疯感工牌生成器,低代码工作流的简单应用以及图片快速响应解决方案,干货满满,不容错过哦

背景 文心智能体平台&#xff0c;开启新一轮活动&#xff0c;超级创造营持续百日活动。 在AI 浪潮席卷的今天&#xff0c;如雨后春笋般丛生的 AI 应用&#xff0c;昭告着时代风口显然已随之到来。 如何能把握住时代红利&#xff0c;占据风口&#xff0c;甚至打造新风向&#x…

探索 Kubernetes 持久化存储之 Longhorn 初窥门径

作者&#xff1a;运维有术星主 在 Kubernetes 生态系统中&#xff0c;持久化存储扮演着至关重要的角色&#xff0c;它是支撑业务应用稳定运行的基石。对于那些选择自建 Kubernetes 集群的运维架构师而言&#xff0c;选择合适的后端持久化存储解决方案是一项至关重要的选型决策。…

React Native 开发项目初体验

引言 React Native 是 Facebook 推出的一款用于构建原生移动应用的框架&#xff0c;它允许开发者使用 JavaScript 和 React 来编写应用&#xff0c;同时可以访问设备的原生功能。本文将带你体验如何从零开始搭建一个 React Native 项目&#xff0c;并实现一些基本功能。 1. 环…

会员购项目面试题解析:高效数据抓取与异常处理

会员购项目 亮点 日志记录信息协程异步抓取数据&#xff0c;大大提高抓取速度捕获异常&#xff0c;并添加重试机制 源码 import logging import timeimport requests import asyncio import aiohttp from aiohttp import ContentTypeError import csv# 配置日志 logging.ba…

因为媳妇的一句话,我做了一个AI画图软件

因为媳妇的一句话&#xff0c;我做了一个AI画图软件 T恤的配图 前些天媳妇参加了一个创业比赛&#xff0c;其中一个比赛任务是参赛成员需要穿主题队服&#xff0c;队服的图案完全需要自己设计&#xff0c;需要独一无二还得漂亮。 问我&#xff1a;“能不能用AI做一张图&#…

Python酷库之旅-第三方库Pandas(052)

目录 一、用法精讲 191、pandas.Series.drop方法 191-1、语法 191-2、参数 191-3、功能 191-4、返回值 191-5、说明 191-6、用法 191-6-1、数据准备 191-6-2、代码示例 191-6-3、结果输出 192、pandas.Series.droplevel方法 192-1、语法 192-2、参数 192-3、功能…

C# 介绍

文章目录 一. 一个简单的helloworld二. 程序结构三. 类型和变量四. 表达式1. f(x)2. []3. typeof4. default5. new6. checked和unchecked7. sizeof8. 移位9. is和as10. null合并 五. 语句六. 类和对象1. 可访问性2. 类型参数3. 基类和派生类4. 字段5. 方法6. 参数7. 扩展方法&a…

【算法】离散化与区间合并

离散化 有些情况下&#xff0c;数字的值的绝对大小并不重要&#xff0c;而相对大小很重要。“离散化”是用数字的相对值代替它们的绝对值。 把分布广而稀疏的数据转化为密集分布&#xff0c;从而能够让算法更快速&#xff0c;更省空间地处理。 离散化三步骤&#xff1a; 排…

53.综合实验:UART接收图像、写入RAM、通过TFT显示

&#xff08;1&#xff09;设计定义&#xff1a;UART_RX模块接收数据&#xff0c;通过写入逻辑写入RAM存储器中&#xff0c;然后通过读取逻辑&#xff0c;从RAM中读出数据&#xff0c;发送给TFT显示屏。 &#xff08;2&#xff09;FPGA逻辑资源有限&#xff0c;因此设置128 * 1…

go包管理

golang包管理的方式有哪些&#xff1f; Golang包发展历史 官方推荐的有很多包管理方式&#xff1a; 主要有几种&#xff1a; GOPATH、Godep、Glide、Govendor、GOModules 记住这几种 GOPATH < GO1.5 GOVendor >GO1.5 GOModules >GO1.11 GOPATH模式 go语言诞生就有 2…

新生报到系统2024((代码+论文+ppt)

下载在最后 技术栈: ssmmysqljsp 展示: 下载地址: CSDN现在上传有问题,有兴趣的朋友先收藏.正常了贴上下载地址 备注:

docker安装部署elasticsearch7.15.2

docker安装部署elasticsearch7.15.2 1.拉取es镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.15.2如果不想下载或者镜像拉去太慢可以直接下载文章上面的镜像压缩包 使用镜像解压命令 docker load -i elasticsearch-7-15-2.tar如下图所示就表示镜像解压成…