跳转到内容

大文件与长请求:IIS、Nginx、应用三层里的 413/504

核验于 1 分钟阅读

在每一跳调整 body 限制、超时和缓冲,并选择流式/异步而不是 30 分钟 HTTP 请求。

测试环境Standard / Datacenter · 版本号 26100.33650 · x64
E1
版本号
26100.33650
版本
Standard / Datacenter
架构
x64
支持
文档(E1)
证据
E1官方文档
核验日期
2026-10-29
页面类型
任务

一次大上传跨多个限制:

跳 限制
浏览器/应用 自己的 body 上限
IIS maxAllowedContentLength(字节)
Nginx client_max_body_size
代理 ARR/proxy body 限制
应用 框架 body 限制
时间 HTTP.sys requestTimeout、Nginx client_body_timeout、代理读超时

先加最小的那个,不要全部设无限。

<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="524288000" />
</requestFiltering>
</security>
</system.webServer>

524288000 = 500MB。还要查处理器/应用限制(ASP.NET maxRequestLength、ANCM body 限制)和 serverRuntime requestTimeout。

上传时 uploadReadAheadSize 可能影响客户端证书/大请求头;不要盲目加大。

client_max_body_size 500m;
client_body_timeout 300s;
proxy_read_timeout 300s;
proxy_send_timeout 300s;

client_body_temp_path 要有磁盘空间。大文件流式上传可 proxy_request_buffering off,直接传给应用(代价:应用要处理慢客户端)。

框架限制也要改:

  • ASP.NET Core:RequestSizeLimit/Kestrel MaxRequestBodySize;
  • Express:express.json({ limit: '...' }) / multer;
  • Flask:MAX_CONTENT_LENGTH;
  • Tomcat:maxPostSize/connector。

应用限制更低,代理放行后应用仍会 413。

2GB 上传或 30 分钟导出不该是一个同步 HTTP 请求:

  • 对象存储预签名直传;
  • 分片/可续传;
  • 导出走后台任务 + 状态端点;
  • 下载用签名 URL/流,超时有界。
终端窗口
curl.exe -I -H "Content-Length: 600000000" https://lab.example/upload
curl.exe --limit-rate 100k -T big.bin https://lab.example/upload

看每一跳状态和 IIS/Nginx 日志。413 是 body 限制;504 是超时;502 是上游。

E1。实验室没有把大上传推过 IIS/Nginx;限制是 Server 2025 的跨跳检查表。

来源