Nginx | 解决 Spring Boot 与 Nginx 中的 “413 Request Entity Too Large“ 错误

关注:CodingTechWork

引言

  在 Web 开发中,413 Request Entity Too Large 是一种常见的 HTTP 错误,它指示客户端请求的实体(例如文件或数据)超出了服务器允许的最大大小。对于使用 Spring Boot 和 Nginx 的应用程序来说,处理和解决这一问题需要理解几个关键技术原理,包括 HTTP 协议、Spring Boot 配置、以及 Nginx 的上传限制。本文将深入探讨这一错误的原因,并提供基于 Spring Boot 和 Nginx 的解决方案。

什么是 413 Request Entity Too Large 错误?

介绍

  HTTP 状态码 413 Request Entity Too Large 表示请求的主体部分(如表单数据或文件)超出了服务器允许处理的大小限制。这通常发生在以下场景:

  • 客户端上传的文件或数据超过了服务器的最大接收限制。
  • 客户端请求的 HTTP 请求体(包括文件和其他数据)超过了服务器的最大限制。
  • 在开发文件上传、数据提交等功能时,遇到 413 错误较为常见,尤其是在处理大文件或批量数据时。

413 Request Entity Too Large 产生原因

413 错误通常由以下几种因素导致:

  1. Spring Boot 应用限制: Spring Boot 默认配置了文件上传和请求体大小的限制。如果上传的文件或数据超过了这个限制,Spring Boot 会返回 413 错误。
  2. Nginx 配置限制: 当 Spring Boot 后端与 Nginx 作为反向代理共同工作时,Nginx 也可能会设置上传体积的最大限制。如果请求体超出了该限制,Nginx 会拒绝该请求并返回 413 错误。
  3. 代理或负载均衡器: 如果请求经过了其他代理服务器(如 HAProxy、Cloudflare 等),它们也可能设置了上传大小的限制。

Spring Boot 中的上传限制

Spring Boot 默认对文件上传和请求体的大小进行了限制,通常会通过以下配置项来控制:

配置文件上传大小限制

在 Spring Boot 中,可以通过 application.properties 或 application.yml 来配置文件上传的大小限制:

  1. 使用 application.properties 配置
 # 限制单个文件最大为 10MB
spring.servlet.multipart.max-file-size=10MB   # 限制整个请求体最大为 10MB
spring.servlet.multipart.max-request-size=10MB 
  1. 使用 application.yml 配置
spring:servlet:multipart:max-file-size: 10MBmax-request-size: 10MB

这些配置项的含义:

  • max-file-size: 限制上传的单个文件大小。
  • max-request-size: 限制整个 HTTP 请求体的大小(如果上传多个文件,包含所有文件及其他表单数据)。

自定义上传限制

对于更复杂的场景,Spring Boot 允许开发者自定义文件上传的限制。例如,在 application.properties 中可以通过配置:

 # 启用文件上传功能
spring.servlet.multipart.enabled=true  # 设置临时文件存储目录
spring.servlet.multipart.location=/tmp/uploads 

当上传文件时,Spring Boot 会使用 MultipartResolver 来处理文件数据,这些配置会影响文件的上传过程。

Nginx 中的上传限制

  当 Spring Boot 应用部署在使用 Nginx 作为反向代理的环境中时,Nginx 会影响请求的处理。如果上传的文件或数据超过了 Nginx 的最大请求体大小,Nginx 会返回 413 Request Entity Too Large 错误。

配置 Nginx 的上传限制

  Nginx 使用 client_max_body_size 配置项来限制客户端请求体的大小。默认情况下,Nginx 的限制为 1MB,这对于大多数现代应用来说往往过小。
  找到 http、server 或 location 配置块,并在其中添加或修改 client_max_body_size 指令。这个指令定义了客户端可以上传的最大文件大小。例如,要允许上传最大为 100MB 的文件,可以这样设置:

http {client_max_body_size 100M;  # 设置最大上传文件为 100MB# 其他配置...
}

或者,如果你只想为特定的站点(server)或路径(location)设置,可以这样配置:

server {listen 80;server_name example.com;client_max_body_size 100M;  # 为这个站点设置最大上传文件为 100MB# 其他配置...
}

或者在某个特定路径下设置:

location /upload {client_max_body_size 100M;  # 只针对 /upload 路径设置
}
  • client_max_body_size: 用于设置 Nginx 接受的最大请求体大小。如果上传的请求体超过这个限制,Nginx 会返回 413 错误。

重新加载 Nginx 配置

修改 Nginx 配置后,需要重新加载配置文件以使改动生效:

sudo nginx -t    # 测试配置文件是否正确
sudo systemctl reload nginx  # 重新加载 Nginx 配置

Spring Boot 与 Nginx 配合时的常见问题

在 Spring Boot 与 Nginx 配合时,容易遇到以下问题:

请求体大小限制不一致

  如果 Nginx 和 Spring Boot 的上传限制设置不一致,可能导致请求在经过 Nginx 时被拒绝,甚至没有传递到 Spring Boot 应用程序。例如,如果 Nginx 的 client_max_body_size 限制为 10MB,而 Spring Boot 设置为 20MB,那么上传请求会在 Nginx 阶段被拦截,Spring Boot 不会收到该请求。
  解决方案:确保 Nginx 和 Spring Boot 的配置一致,尤其是在文件上传大小和请求体大小方面。

Nginx 配置的 client_max_body_size 设置过小

Nginx 默认的 client_max_body_size 设置可能过小,导致上传大文件时出现问题。根据实际需求,调整该值。

文件上传过程中的性能问题

在处理大文件上传时,不仅要关注请求体大小,还需要优化文件上传的性能。比如:

  • 在 Nginx 和 Spring Boot 中配置适当的缓冲区大小。
  • 在 Spring Boot 中使用异步处理文件上传,避免阻塞主线程。

进一步优化和解决方案

使用分片上传(Chunked Uploads)

对于大文件上传,分片上传是解决上传限制的一种常用技术。分片上传将文件分成多个小块逐个上传,每个块的数据量较小,能够绕过服务器的上传大小限制。Spring Boot 可以与前端库(如 Resumable.js 或 Fine Uploader)配合,提供高效的分片上传支持。

使用 Nginx 的代理缓存

对于频繁上传大文件的场景,使用 Nginx 的代理缓存可以提高上传的性能。Nginx 可以缓存文件上传的请求,从而避免每次都从头开始上传。

proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=upload_cache:10m max_size=1g;
location /upload/ {proxy_cache upload_cache;proxy_pass http://localhost:8080;
}

设置合理的客户端文件大小验证

在客户端进行文件大小验证,避免上传超大文件,提前在用户端进行筛查,可以有效减轻服务器的负担。

let fileInput = document.getElementById('fileInput');
fileInput.addEventListener('change', function () {let file = fileInput.files[0];// 限制文件大小为 100MBif (file.size > 100 * 1024 * 1024) {  alert("文件超过最大允许大小!");// 清空文件输入框fileInput.value = "";  }
});

总结

413 Request Entity Too Large 错误通常由上传大小限制引起,解决这一问题需要从多个方面入手:

  1. 调整 Spring Boot 配置:在 application.properties application.yml 中设置合适的文件上传和请求体大小。
  2. 配置 Nginx:通过 client_max_body_size 设置 Nginx 的上传限制,确保与 Spring Boot 配置一致。
  3. 使用分片上传技术:对于大文件上传,考虑使用分片上传技术,避免单个请求体过大。
  4. 优化客户端验证:在客户端对文件大小进行验证,减少不必要的上传请求。

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

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

相关文章

GB/T 19582.1-2008主要内容

标准背景与概述 GB/T 19582.1-2008是由中国国家标准化管理委员会发布的国家标准,旨在指导和规范基于Modbus协议的工业自动化网络的设计和实施。该标准由全国工业过程测量控制和自动化标准化技术委员会(TC124)归口,并由中国机械工…

Open FPV VTX开源之第一次出图

Open FPV VTX开源之第一次出图 1. 源由2. 连线2.1 飞控2.2 调试 3. serial3.1 启动log - uboot3.2 登录版本 - linux3.3 获取有线IP 4. ssh - linux5. PixelPilot出图6. 总结7. 参考资料 1. 源由 在《Open FPV VTX开源之硬件规格及组成》章节中,已经基本介绍了产品…

Apache Sedona和Spark将geojson瓦片化例子

Apache Sedona很方便读取geojson、ShapeFile、geopackage等文件&#xff0c;提供了很多spark sql函数和rdd算子。下面例子主要用于熟悉spark和sedona的使用。 引入的maven包 <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.or…

基于高斯混合模型的数据分析及其延伸应用(具体代码分析)

一、代码分析 &#xff08;一&#xff09;清除工作区和命令行窗口 clear; clc;clear;&#xff1a;该命令用于清除 MATLAB 工作区中的所有变量&#xff0c;确保代码运行环境的清洁&#xff0c;避免之前遗留的变量对当前代码运行产生干扰。例如&#xff0c;如果之前运行的代码中…

天气app的收获

天气app的收获 无论如何&#xff0c;是基于MVC模式&#xff0c;但都是从UI页面开始设计&#xff0c;然后根据输入的城市名称&#xff0c;将其传入到model层&#xff0c;进行相对应的处理。 对于controler层&#xff0c;需要通过一些协议完成一些输入的反馈&#xff0c;例如输…

PostgreSQL技术内幕22:vacuum full 和 vacuum

文章目录 0.简介1.概念及使用方式2.工作原理2.1 主要功能2.2 清理流程2.3 防止事务id环绕说明 3.使用建议 0.简介 在之前介绍MVCC文章中介绍过常见的MVCC实现的两种方式&#xff0c;一种是将旧数据放到回滚段&#xff0c;一种是直接生成一条新数据&#xff08;对于删除是不删除…

【面试】程序员 简历

一、简历整体结构 完整简历包含基本信息、教育背景、求职意向、工作经历、职业技能、项目经历、个人优势和个人荣誉八个部分。编写时&#xff0c;前几部分在保证真实的基础上可适当美化&#xff1b;个人优势和荣誉描述要突出难点亮点且避免夸张&#xff0c;可写入如马拉松参赛、…

WebGIS在应急灾害中对村庄、风景区、机场的影响范围应用-以日喀则市定日县地震为例

目录 前言 一、关于影响范围 1、震中距离5公里 2、震中20公里范围 3、20到80公里范围 二、空间查询知识 1、相关数据介绍 2、空间数据查询 三、前后端数据查询以及web可视化实现 1、后台API实现 2、WebGIS前端实现 四、Web成果展示 1、空间位置分析 2、包含风景区…

【UE5 C++课程系列笔记】27——多线程基础——ControlFlow插件的基本使用

目录 步骤 一、搭建基本同步框架 二、添加委托 三、添加蓝图互动框架 四、修改为异步框架 完整代码 通过一个游戏初始化流程的示例来介绍“ControlFlows”的基本使用。 步骤 一、搭建基本同步框架 1. 勾选“ControlFlows”插件 2. 新建一个空白C类&#xff0c;这里…

<C++> XlsxWriter写EXCEL

XlsxWriter XlsxWriter是一个用于创建和写入Excel 2007及以上版本&#xff08;.xlsx文件格式&#xff09;的C库。以下是对XlsxWriter的详细介绍&#xff1a; 主要功能 文本、数字和公式写入&#xff1a;可以向多个工作表中写入文本、数字和公式。格式设置&#xff1a;支持丰…

linux 设置mysql 外网访问

1、修改 MySQL 配置文件 找到并编辑配置文件&#xff1a;在Linux系统中&#xff0c;MySQL的配置文件通常是/etc/mysql/my.cnf&#xff0c;使用命令sudo vim /etc/mysql/my.cnf打开文件。 注释或修改 bindaddress&#xff1a;找到bindaddress 127.0.0.1&#xff0c;将其注释掉…

JavaEE之定时器及自我实现

在生活当中&#xff0c;有很多事情&#xff0c;我们不是立马就去做&#xff0c;而是在规定了时间之后&#xff0c;在到该时间时&#xff0c;再去执行&#xff0c;比如&#xff1a;闹钟、定时关机等等&#xff0c;在程序的世界中&#xff0c;有些代码也不是立刻执行&#xff0c;…

国产3D CAD将逐步取代国外软件

在工业软件的关键领域&#xff0c;计算机辅助设计&#xff08;CAD&#xff09;软件对于制造业的重要性不言而喻。近年来&#xff0c;国产 CAD 的发展态势迅猛&#xff0c;展现出巨大的潜力与机遇&#xff0c;正逐步改变着 CAD 市场长期由国外软件主导的格局。 国产CAD发展现状 …

【HarmonyOS Next NAPI 深度探索1】Node.js 和 CC++ 原生扩展简介

【HarmonyOS Next NAPI 深度探索1】Node.js 和 CC 原生扩展简介 如果你用过 Node.js&#xff0c;应该知道它强大的地方在于能处理各种场景&#xff0c;速度还很快。但你有没有想过&#xff0c;Node.js 的速度秘密是什么&#xff1f;今天我们来聊聊其中一个幕后英雄——原生扩展…

new[]创建对象数组会怎样?

当你使用 new[] 操作符来创建一个对象数组时&#xff0c;构造函数会被调用与数组大小相等的次数。每个数组元素都会通过构造函数进行初始化。 以下是一个例子&#xff1a; #include <iostream> class MyClass { public:MyClass() {std::cout << "MyClass con…

linux:文件的创建/删除/复制/移动/查看/查找/权限/类型/压缩/打包

关于文件的关键词 创建 touch 删除 rm 复制 cp 权限 chmod 移动 mv 查看内容 cat(全部); head(前10行); tail(末尾10行); more,less 查找 find 压缩 gzip ; bzip 打包 tar 编辑 sed 创建文件 格式&#xff1a; touch 文件名 删除文件 复制文件 移动文件 查看文…

数据结构C语言描述11(图文结合)--二叉搜索树(BST树)的实现(数据采用KV存储形式进行封装)

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法&#xff1b;有C基础即可跟着学习&#xff0c;代码均可运行&#xff1b;准备考研的也可跟着写&#xff0c;个人感觉&#xff0c;如果时间充裕&#xff0c;手写一遍比看书、刷题管用很多&#xff0c;这也是本人采用纯C语言…

Chrome_60.0.3112.113_x64 单文件版 下载

单文件&#xff0c;免安装&#xff0c;直接用~ Google Chrome, 免費下載. Google Chrome 60.0.3112.113: Chrome 是 Google 開發的網路瀏覽器。它的特點是速度快,功能多。 下载地址: https://blog.s3.sh.cn/thread-150-1-1.htmlhttps://blog.s3.sh.cn/thread-150-1-1.html

概率论与数理统计总复习

复习课本&#xff1a;中科大使用的教辅《概率论和数理统计》缪柏其、张伟平版本 目录 0.部分积分公式 1.容斥原理 2.条件概率 3.全概率公式 4.贝叶斯公式 5.独立性 6.伯努利分布&#xff08;两点分布&#xff09; 7.二项分布 8.帕斯卡分布&#xff08;负二项分布&am…

xml简介

目录 基本语法特点及应用场景一个简单示例 xml&#xff08;全称eXtensible Markup Language&#xff09;是一种用于存储和传输数据的标记语言&#xff0c;跨平台并且跨语言&#xff0c;xml内容较多&#xff0c;这篇文章会介绍一些基础的内容。 基本语法 xml文档通常以xml声明开…