AWS Elastic Beanstalk上Tomcat 9部署的Spring Boot(Grails 3.1)应用触发FileCountLimitExceededException问题排查与解决
AWS Elastic Beanstalk上Tomcat 9部署的Spring Boot(Grails 3.1)应用触发FileCountLimitExceededException问题排查与解决
为什么突然出现这个错误?
首先,你提到没有修改代码或配置就触发了FileCountLimitExceededException,大概率是以下两个原因之一:
- AWS Elastic Beanstalk平台静默更新:AWS会定期为EB平台版本推送补丁,你使用的
Tomcat 9 with Corretto 8 running on 64bit Amazon Linux 2/4.9.1可能被更新了Tomcat的默认multipart配置——比如原本的fileCountLimit(文件上传数量限制)被调低,或者之前的计数逻辑bug被修复,导致原本不会触发的限制现在生效了。 - 请求结构隐性变化:可能你的前端表单新增了多个空的文件输入字段(比如用户没选择文件但表单里有多个
<input type="file">),或者近期此类请求的part数量(包括空文件part)超过了Tomcat的默认阈值——注意Tomcat会把空文件part也算入fileCountLimit的计数哦。
解决方法
针对你的Grails 3.1(基于Spring Boot 1.3.7)应用,有两种直接有效的修复方式:
方案1:通过Grails/Spring Boot配置调整(推荐)
在项目的application.yml或application.groovy中添加multipart配置,直接覆盖Tomcat的默认限制:
- 若使用YAML配置(
application.yml):
spring: http: multipart: max-file-size: 10MB # 单个文件最大大小,按需调整 max-request-size: 100MB # 整个请求的最大大小,按需调整 file-size-threshold: 0 # 超过此大小的文件会写入磁盘,0表示全部在内存处理 tomcat: max-file-count: 200 # 调高文件数量限制,比默认值(100)高即可
- 若使用Groovy配置(
application.groovy):
spring.http.multipart.maxFileSize = '10MB' spring.http.multipart.maxRequestSize = '100MB' spring.http.multipart.tomcat.maxFileCount = 200
配置完成后重新部署应用,Spring Boot会自动将这些参数传递给Tomcat的文件上传组件,覆盖默认限制。
方案2:通过Elastic Beanstalk配置文件修改Tomcat全局设置
如果方案1不生效,可以直接修改Tomcat的上下文配置。在项目根目录创建.ebextensions/01-tomcat-multipart.config文件,内容如下:
files: "/etc/tomcat9/conf/Catalina/localhost/ROOT.xml": mode: "000644" owner: root group: root content: | <Context> <MultipartConfig maxFileSize="10485760" # 对应10MB,单位为字节 maxRequestSize="104857600" # 对应100MB fileSizeThreshold="0" maxFileCount="200" # 调整文件数量限制 /> </Context>
这个配置会在EB部署过程中自动生成Tomcat的ROOT应用上下文配置,强制覆盖multipart参数。
额外排查步骤
- 检查EB平台历史:登录AWS控制台,进入你的Elastic Beanstalk环境,查看「平台版本历史」,确认最近是否有平台更新记录,这能帮你明确问题是否由平台变更导致。
- 分析请求结构:用浏览器开发者工具抓包,查看触发错误的请求的Form Data,统计其中文件类型的part数量,确认是否真的超过了Tomcat默认的
fileCountLimit(默认值为100)。 - 本地复现测试:在本地运行相同版本的应用,模拟生产环境的请求,看是否会触发相同错误,排除生产环境独有的配置差异。
内容来源于stack exchange
相关产品推荐
相关产品推荐

