上传大文件总是失败
发布时间:2026-02-28 20:01       
更新时间:2026-03-01 07:26
小图片传得动,几百 MB 的压缩包一传就断,上传失败通常不是网络一条原因,而是三处大小与时长限制叠加的结果。
## 网页服务器的体积上限
Nginx(常见的 Web 服务与反向代理软件)默认请求体上限只有 1MB,超了直接返回 413 错误。改 http 或 server 段:
client_max_body_size 500m;
改完 nginx -t 检查语法,再 systemctl reload nginx 平滑生效。Apache 对应 LimitRequestBody 指令。很多"传到一半秒断"的现象,根子就在这一行配置上。
确认改动有没有生效也有直接办法:curl -I 请求一次上传接口看返回码,配置改了却忘了 reload,参数永远停在旧值,413 也就照旧出现。
## 脚本层的时长与上限
PHP 站点还要动 php.ini 里的一组参数:
upload_max_filesize = 500m
post_max_size = 500m
max_execution_time = 300
memory_limit = 256m
注意 post_max_size 要大于等于 upload_max_filesize。改完 PHP-FPM(PHP 的进程管理服务)需要重启:systemctl restart php-fpm。另外 CLI 与 FPM 用的是两份配置:php -i 看的是命令行的,网页上传走的是 FPM 的,phpinfo() 输出里 Loaded Configuration File 一栏才是网页环境真正加载的文件,改错白改。用 php -i | grep upload_max_filesize 确认生效值,别只看网页管理工具里显示的数字,两者不一致的情况很常见。
## 超时与磁盘这两个暗坑
大文件传输时间长,反向代理的读超时若只有 60 秒也会中断,Nginx 侧对应 fastcgi_read_timeout 或 proxy_read_timeout,按文件大小和带宽估算后适当调大。PHP 侧还有两个独立的时长参数:max_input_time 管接收数据的耗时,PHP-FPM 的 request_terminate_timeout 会中途掐断长请求,大文件场景一并调大。
磁盘同样要检查两个位置:上传临时目录(PHP 的 upload_tmp_dir,默认 /tmp)所在分区要装得下一个完整文件,df -h 看一眼,磁盘接近满时上传会在中途失败。
排查思路是把链路拆开:看返回码对号入座,413 找体积上限,504 找超时,传输中断再看临时目录和磁盘。三处配置依次核对,比盲目把所有参数调大更有效。超过 1GB 的文件干脆绕开网页通道,改用分片上传方案,稳定性不在一个量级。还有个容易忽略的参数 client_body_buffer_size:缓冲太小时大请求体直接落临时文件,临时目录容量不足或路径异常,同样表现为上传怪异失败。