用 Spring Boot 静态资源映射 vs 用 Nginx 提供静态文件服务总结
【1】Spring Boot 静态资源映射 vs 用 Nginx 提供静态文件服务
✅ 简短回答:
在性能、并发能力、缓存控制、安全性等方面,Nginx 完胜。
所以:如果你只是提供静态文件下载(如图片、PDF、Excel 等),强烈推荐使用 Nginx;如果需要权限校验、日志记录等业务逻辑,再考虑 Spring Boot。
🧠 一、两种方案的详细对比
对比维度 | Spring Boot ResourceHandler | Nginx location + alias |
---|---|---|
⚡ 性能 | 较低,受限于 JVM 和线程池 | 极高,专为高性能设计 |
🔁 并发支持 | 中等,受线程数限制 | 高,并发能力强 |
📦 文件大小支持 | 小到中等(需流式处理) | 支持大文件,支持 Range 请求 |
🧼 权限控制 | ✅ 可做鉴权、Token 校验 | ❌ 原生不支持,需配合 Lua/脚本 |
🧩 缓存控制 | 可配置,但较麻烦 | ✅ 易配置(Cache-Control、Expires) |
📡 CDN 加速 | ❌ 不易集成 | ✅ 天然适合 |
💾 日志记录 | ✅ 可记录访问日志、用户信息 | ❌ 默认只记录 IP,无业务上下文 |
🛠️ 配置复杂度 | 简单 | 中等 |
🔄 维护成本 | 低 | 略高(需运维 Nginx) |
📈 二、性能对比(典型场景)
场景 A:小文件(<1MB),并发不高
- ✅ 两者都可用
- 推荐:Spring Boot(开发简单)
场景 B:中大文件(>5MB),并发高
- ✅ Nginx 更优(支持断点续传、高效 IO)
- ❌ Spring Boot 容易导致内存压力或响应慢
场景 C:带权限控制的私有文件
- ✅ Spring Boot(可结合 Token、Session、JWT)
- ❌ Nginx 原生不支持,需 Lua 模块或反向代理
场景 D:公开文件,频繁访问
- ✅ Nginx(+ CDN)更合适
- ❌ Spring Boot 效率低,浪费后端资源
🧱 三、架构建议(推荐组合方式)
你可以采用 混合架构,兼顾安全与性能:
前端请求 --> Nginx(静态文件) or Spring Boot(带权限的文件)
示例:
✅ 公共文件走 Nginx:
location /study/file/download/ {alias /data/files/public/;add_header Accept-Ranges bytes;expires 7d;add_header Cache-Control "public";
}
访问:
http://yourdomain.com/study/file/download/abc.png
✅ 私有文件走 Spring Boot:
@GetMapping("/file/private/{id}")
public void downloadPrivateFile(@PathVariable String id, HttpServletResponse response) {// 鉴权逻辑// 流式返回文件
}
访问:
http://yourdomain.com/file/private/abc123.png
🛠️ 四、Nginx 配置示例(完整推荐版)
location /study/file/download/ {alias /data/files/public/;# 支持断点续传add_header Accept-Ranges bytes;# 缓存策略(7天)expires 7d;add_header Cache-Control "public";# 防盗链(可选)valid_referers none blocked yourdomain.com *.yourdomain.com;if ($invalid_referer) {return 403;}
}
🧪 五、如何测试哪个更快?
你可以使用以下工具快速测试:
1. Chrome DevTools → Network 查看加载时间
指标 | 说明 |
---|---|
Waiting (TTFB) | 后端处理速度 |
Receiving | 下载速度 |
2. 使用 curl 命令行测试
time curl -o /dev/null http://localhost:8080/file/xxx.png # Spring Boot
time curl -o /dev/null http://localhost/study/file/download/xxx.png # Nginx
💡 六、结论总结
场景 | 推荐方案 |
---|---|
公共文件、频繁访问、大并发 | ✅ Nginx |
私有文件、需要鉴权、审计日志 | ✅ Spring Boot |
需要 CDN 加速、跨区域访问 | ✅ Nginx + CDN |
开发调试阶段、并发不大 | ✅ Spring Boot |
混合场景(公有+私有) | ✅ 推荐组合使用 |
💬 最佳实践建议
如果你现在是:
- 初期项目 ➜ 用 Spring Boot 快速搭建
- 上线后流量变大 ➜ 把公共文件迁移到 Nginx 或对象存储(OSS/COS/S3)
- 有权限控制需求 ➜ 在 Spring Boot 中实现私有文件下载接口
【2】Nginx 如何实现防盗链和缓存控制?
✅ 一、Nginx 实现防盗链(防止外部网站盗用你的资源)
🎯 目标:
防止其他网站通过 <img src="http://yourdomain.com/xxx.jpg">
的方式引用你的图片或资源。
✅ 实现方法:使用 valid_referers
指令
🔐 示例配置:
location ~ \.(gif|jpg|jpeg|png|css|js|ico|mp4|pdf)$ {# 允许的 Referer 列表valid_referers none blocked yourdomain.com *.yourdomain.com;# 如果 $invalid_referer 不为 0(即非法来源),返回 403if ($invalid_referer) {return 403;}# 缓存控制(后面讲)expires 7d;add_header Cache-Control "public";
}
🔍 参数说明:
参数 | 含义 |
---|---|
none | 允许无 Referer 请求访问 |
blocked | 允许被防火墙或代理屏蔽了 Referer 的请求 |
yourdomain.com | 允许自己的域名访问 |
*.yourdomain.com | 支持子域名 |
🧪 测试方法:
- 在第三方网页中写:
<img src="http://yourdomain.com/images/test.png" />
- 如果 Nginx 配置生效,浏览器会显示 403 Forbidden(无法加载)
✅ 二、Nginx 实现缓存控制(提升性能)
🎯 目标:
- 让浏览器缓存静态资源,减少重复请求
- 控制 CDN 或代理服务器是否缓存资源
✅ 实现方法:使用 expires
和 Cache-Control
🔒 示例配置:
location ~ \.(gif|jpg|jpeg|png|css|js|ico|mp4|pdf)$ {expires 7d; # 设置缓存时间为 7 天add_header Cache-Control "public"; # 表示该资源可以被 CDN、浏览器缓存
}
🧠 可选参数说明:
指令 | 示例值 | 含义 |
---|---|---|
expires | 7d / 24h / +30s | 设置缓存过期时间(支持 s 秒、m 分钟、h 小时、d 天) |
Cache-Control | public , private , no-cache , max-age=... | 控制缓存行为 |
add_header Pragma | "public" | HTTP 1.0 兼容性设置 |
📈 推荐组合配置(含防盗链 + 缓存):
location ~ \.(gif|jpg|jpeg|png|css|js|ico|mp4|pdf)$ {# 防盗链valid_referers none blocked yourdomain.com *.yourdomain.com;if ($invalid_referer) {return 403;}# 缓存控制expires 7d;add_header Cache-Control "public";add_header Pragma "public";# 开启高效文件传输(可选)sendfile on;tcp_nopush on;tcp_nodelay off;
}
🧪 如何测试缓存是否生效?
方法一:Chrome DevTools 查看响应头
打开开发者工具 → Network → 找到一个图片或 JS 文件 → 查看 Response Headers:
Cache-Control: public
Expires: Sat, 07 Jun 2025 12:34:56 GMT
表示缓存已生效。
方法二:curl 命令查看头信息
curl -I http://yourdomain.com/images/test.png
输出应包含:
HTTP/1.1 200 OK
Server: nginx
Content-Type: image/png
Content-Length: 123456
Expires: Sat, 07 Jun 2025 12:34:56 GMT
Cache-Control: public
💡 三、高级技巧(可选)
1. 使用 ETag 控制缓存刷新
默认情况下 Nginx 会自动生成 ETag,你可以关闭它:
location ~ \.(gif|jpg|jpeg|png|css|js|ico|mp4|pdf)$ {etag off;
}
这样浏览器就不会做 304 Not Modified 缓存校验。
2. 根据文件名版本控制缓存(推荐做法)
例如:
logo-v1.2.3.png
当内容更新时改名为:
logo-v1.2.4.png
这样浏览器就会重新下载新文件,避免缓存问题。
🧱 四、结合 CDN 使用建议
如果你用了 CDN(如阿里云 CDN、腾讯云 CDN、Cloudflare),可以在 Nginx 中加上这些配置以配合 CDN 缓存:
location ~ \.(gif|jpg|jpeg|png|css|js|ico|mp4|pdf)$ {expires 30d;add_header Cache-Control "public, max-age=2592000"; # 30天add_header Pragma "public";add_header Access-Control-Allow-Origin "*"; # 跨域访问 CDN
}
📌 总结对比表
功能 | 是否推荐启用 | 配置方式 |
---|---|---|
防盗链 | ✅ 强烈推荐 | valid_referers + if ($invalid_referer) |
缓存控制 | ✅ 必须开启 | expires + Cache-Control |
CDN 加速 | ✅ 强烈推荐 | 配合缓存头 + 版本号文件名 |
ETag 控制 | ⚠️ 可选 | etag on/off |
跨域支持 | ⚠️ CDN 场景需要 | Access-Control-Allow-Origin |
相关文章:
用 Spring Boot 静态资源映射 vs 用 Nginx 提供静态文件服务总结
【1】Spring Boot 静态资源映射 vs 用 Nginx 提供静态文件服务 ✅ 简短回答: 在性能、并发能力、缓存控制、安全性等方面,Nginx 完胜。 所以:如果你只是提供静态文件下载(如图片、PDF、Excel 等),强烈推荐…...

openssl-aes-ctr使用openmp加速
openssl-aes-ctr使用openmp加速 openssl-aes-ctropenmp omp for openssl-aes-ctr 本文采用openssl-1.1.1w进行开发验证开发;因为aes-ctr加解密模式中,不依赖与上一个模块的加/解密的内容,所以对于aes-ctr加解密模式是比较适合进行并行加速的…...

PHP+MySQL开发语言 在线下单订水送水小程序源码及搭建指南
随着互联网技术的不断发展,在线下单订水送水服务为人们所需要。分享一款 PHP 和 MySQL 搭建一个功能完善的在线订水送水小程序源码及搭建教程。这个系统将包含用户端和管理端两部分,用户可以在线下单、查询订单状态,管理员可以处理订单、管理…...

计算机网络第1章(上):网络组成与三种交换方式全解析
目录 一、计算机网络的概念二、计算机网络的组成和功能2.1 计算机网络的组成2.2 计算机网络的功能 三、电路交换、报文交换、分组交换3.1 电路交换(Circuit Switching)3.2 报文交换(Message Switching)3.3 分组交换(Pa…...

Android studio进阶开发(七)---做一个完整的登录系统(前后端连接)
我们已经讲过了okhttp和登录系统的使用,我们今天做一个完整的登录系统,后端用springmybatis去做 数据库内容 -- 创建学生信息表 CREATE TABLE student_info (id SERIAL PRIMARY KEY, -- 添加自增主键name VARCHAR(255) NOT NULL,number INT NOT NULL,…...

计算机网络第1章(下):网络性能指标与分层模型全面解析
目录 一、计算机网络的性能指标1.1 性能指标1:速率1.2 性能指标2:带宽1.3 性能指标3:吞吐量1.4 性能指标4:时延1.5 性能指标5:时延带宽积1.6 性能指标6:往返时延1.7 性能指标7:信道利用率 二、计…...

恶意软件清理工具,让Mac电脑安全更简单
你的Mac最近是不是开始表演"电子迷惑行为"?浏览器主页突然变成澳门赌场,风扇转得比直升机螺旋桨还猛......恭喜你!可能中奖获得"恶意软件大礼包"!别慌,今天就教你用恶意软件清理工具化身数字特工…...

HackMyVM-Jabita
信息搜集 主机发现 ┌──(kali㉿kali)-[~] └─$ nmap -sn 192.168.43.0/24 Starting Nmap 7.95 ( https://nmap.org ) at 2025-06-01 05:20 EDT Nmap scan report for 192.168.43.1 Host is up (0.020s latency). MAC Address: C6:45:66:05:91:88 (Unknown) Nmap scan repo…...

112 Gbps 及以上串行链路的有效链路均衡
通道均衡已成为当今高速串行链路的关键机制。目前有许多均衡方案,例如发射机加重均衡、接收机CTLE(连续时间线性均衡器)、FFE(前馈均衡器)、DFE(判决反馈均衡器)和FEC(前向纠错&…...
Mac 版不能连接华为 GaussDB 吗?我看 Windows 版可以连接?
🧑💻 GaussDB 用户 Mac 版不能连接华为 GaussDB 吗?我看Windows 版可以连接。 🧑🔧 官方技术中心 由于 GaussDB 数据库本身未支持 macOS 系统,所以在 macOS 上的 Navicat 中也未支持该数据库。 &…...

Python-13(永久存储)
创建并打开文件 open(file,mode)函数 该函数用于打开一个文件并返回对应的文件对象。 file参数指定的是文件路径和文件名,如果没有添加路径,那么默认将文件创建在python的主文件夹里面。mode参数指定的是打开的模式,r表示读取(…...
《关于有序推动绿电直连发展有关事项的通知》核心内容
《关于有序推动绿电直连发展有关事项的通知》(发改能源〔2025〕650 号)由国家发展改革委和国家能源局于 2025 年 5 月 21 日联合印发,旨在明确绿电直连项目的适用范围、规划引导、运行管理、交易与价格机制以及组织保障等内容。 适用范围与原…...
数据结构-排序(1)
一,排序的基本概念 1.排序的定义 核心概念: 给定一个包含 n 个元素的序列 (R1, R2, ..., Rn) 和一个关键码 Ki(通常是记录 Ri 的一个属性),排序的目标是找到一个排列 (p1, p2, ..., pn),使得关键码序列 (K…...

记录一次session安装应用recyclerview更新数据的bug
首先抛出异常日志,在 先说结论:因为session安装监听是在点击事件里面,所以会保留旧的对象数据 直接上代码,原有的逻辑是点击时执行session安装,并注册监听回调 private fun installApk(position: Int) {val packageIns…...

大数据-274 Spark MLib - 基础介绍 机器学习算法 剪枝 后剪枝 ID3 C4.5 CART
点一下关注吧!!!非常感谢!!持续更新!!! 大模型篇章已经开始! 目前已经更新到了第 22 篇:大语言模型 22 - MCP 自动操作 FigmaCursor 自动设计原型 Java篇开…...

力扣面试150题--二叉树的锯齿形层序遍历
Day 56 题目描述 思路 锯齿形就是一层是从左向右,一层是从右向左,那么我们可以分析样例,对于第奇数层是从左向右,第偶数层是从右向左,于是可以采取一个计数器,采取链表方式,从左向右就是正常插…...

如何在 CentOS / RHEL 上修改 MySQL 默认数据目录 ?
MySQL 是一个广泛使用的开源关系数据库管理系统(RDBMS),为无数的 web 应用程序和服务提供支持。默认情况下,MySQL 将其数据存储在预定义的目录中,这可能并不总是适合您的需求。您可能希望将数据目录移动到另一个位置以获得更好的性能和安全性…...
网页前端开发(基础进阶2)
前面学习了html与css,接下来学习JS(JavaScript与Java无关)。 web标准(网页标准)分为3个部分: 1.html主要负责网页的结构(页面的元素和内容) 2.css主要负责网页的表现(…...

简历制作要精而不简
不得不说,不管是春招,还是秋招,我们在求职时,第一步便是制作一份简历。不得不承认,好的简历,就像一块敲门砖,能让面试官眼前一亮,让应聘成功的概率增添一分。 对于一个初次求职者来…...

SPA-RL:通过Stepwise Progress Attribution训练LLM智能体
SPA-RL:通过Stepwise Progress Attribution训练LLM智能体 在大语言模型(LLM)驱动智能体发展的浪潮中,强化学习(RL)面临着延迟奖励这一关键挑战。本文提出的SPA-RL框架,通过创新的分步进度归因机…...

【深度学习】9. CNN性能提升-轻量化模型专辑:SqueezeNet / MobileNet / ShuffleNet / EfficientNet
SqueezeNet / MobileNet / ShuffleNet / EfficientNet 一、背景与动机 随着深度神经网络在图像识别任务上取得巨大成功,它们的结构越来越深、参数越来越多。然而在移动端或嵌入式设备中: 存储资源有限推理计算能力弱能耗受限 因此,研究者…...

Relational Algebra(数据库关系代数)
目录 What is an “Algebra” What is Relational Algebra? Core Relational Algebra Selection Projection Extended Projection Product(笛卡尔积) Theta-Join Natural Join Renaming Building Complex Expressions Sequences of Assignm…...
【C/C++】面试常考题目
面试中最常考的数据结构与算法题,适合作为刷题的第一阶段重点。 ✅ 分类 & 推荐题目列表(精选 70 道核心题) 一、数组 & 字符串(共 15 题) 题目类型LeetCode编号两数之和哈希表#1盛最多水的容器双指针#11三数…...

Chorme如何对于youtube视频进行画中画背景播放?
画中画可以让你小窗播放,然后浏览器放后台还可以做点别的事情。 B站直接可以选择小窗播放,游览器最小化就可以,但是youtube的小窗播放游览器一切换就不显示了。 其实是因为youtube的小窗播放不是真的小窗播放。要想真的实现需要在youtube视…...

017搜索之深度优先搜索——算法备赛
深度优先搜索 如果说广度优先搜索是逐层扩散,那深度优先搜索就是一条道走到黑。 深度优先遍历是用递归实现的,预定一条顺序规则(如上下左右顺序) ,一直往第一个方向搜索直到走到尽头或不满足要求后返回上一个叉路口按…...
从单机到集群,再到分布式,再到微服务
我会尽量详细讲解,从单机到集群,再到分布式和微服务每个层次的概念、特点和应用场景。同时也会探讨C是否适合做微服务项目。 一、从单机到集群,再到分布式,再到微服务——详细解析 1. 单机(Single Machine)…...
关于ios点击分享自动复制到粘贴板的问题
前言 Android 系统没有什么特别的要求,实现这个也比较容易。但ios在某些情况下就会出现问题。 如果ios是点击之后,请求接口,再把接口的内容赋值给粘贴板肯定行不通,会被ios系统拦截,导致赋值失败或者赋值为空。建议使…...
Hive的JOIN操作如何优化?
Hive的JOIN操作优化是提升查询性能的关键,尤其是在处理大数据量时。以下是详细的JOIN优化策略和实现方法: 一、MapJoin(小表广播优化) 核心原理 将小表全量加载到每个MapTask的内存中,避免Shuffle,直接在…...
React Native 实现抖音式图片滑动切换浏览组件-媲美抖音体验的滑动式流畅预览组件
写在前面 “如何让用户像刷抖音一样浏览我们的图片列表?” —— 这个需求背后隐藏着性能、体验和交互设计的多重挑战。本文将带你从零实现一个高性能的React Native图片浏览器,支持分页预加载、横向滑动预览、文字展示和缓存优化,打造媲美原…...

睿抗机器人开发者大赛CAIP-编程技能赛-历年真题 解题报告汇总 | 珂学家
前言 汇总 睿抗机器人开发者大赛CAIP-编程技能赛-历年真题 解题报告汇总 2024年 2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组 (国赛) 解题报告 2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(省赛)解题报告 2024 睿抗机器人开发者大赛CAI…...