上传卡在99%或报413错误,主因是Nginx默认client_max_body_size仅1m,需在站点配置中设为2048m并调高client_body_timeout;同时须同步调整PHP的upload_max_filesize、post_max_size及max_execution_time,并重启PHP服务。

上传卡在 99% 或直接 413 错误
这是最典型的症状,413 Request Entity Too Large 表示 Nginx 拒绝了超过限制的请求体,而“卡在 99%”往往是客户端(比如浏览器或宝塔上传组件)在等待后端响应时超时或被截断。根本原因不是带宽不够,而是 Nginx 默认只允许上传 1m 的单个请求体,远低于宝塔界面默认支持的几百 MB 文件。
实操建议:
- 修改宝塔管理面板里的 Nginx 配置:进入「网站」→ 选中站点 → 「配置文件」,在
server块内添加或修改这两行:
client_max_body_size 2048m; client_body_timeout 300;
-
client_max_body_size必须大于你要传的文件(单位可写m或g),设为0表示不限制(不推荐,有安全风险) -
client_body_timeout控制 Nginx 等待客户端发送完整 body 的时间(秒),大文件慢速上传容易触发超时,默认 60 秒明显不够 - 改完点「保存」,再点「重载配置」——注意不是「重启」,否则可能中断服务
宝塔后台上传仍失败,但 curl 测试正常
说明 Nginx 层面已通,问题出在宝塔自己的 PHP 或前端限制。宝塔用 PHP 处理文件上传逻辑(比如分片合并、校验),它会读取并受制于 PHP 的上传配置,和 Nginx 是两套独立限制。
实操建议:
- 进宝塔「软件商店」→ 找到你当前用的 PHP 版本 → 「设置」→ 「配置修改」
- 重点调这三项:
upload_max_filesize、post_max_size、max_execution_time -
upload_max_filesize要 ≥ 你目标文件大小(如2G) -
post_max_size必须 ≥upload_max_filesize,因为整个 POST 请求包含文件 + 表单字段 -
max_execution_time建议设为300或0(0 表示不限制执行时间),避免大文件处理中途被 PHP 中止 - 改完点「保存」,**必须重启对应 PHP 服务**(不是重载,是重启)
用了分片上传还是慢,甚至更卡
宝塔 7.7+ 启用了前端分片上传(webuploader),理论上能断点续传、规避超时,但实际反而更慢,常见原因是 Nginx 对每个分片都做一次完整校验和缓冲,加上默认的 client_body_buffer_size 过小,导致频繁写临时文件,磁盘 I/O 成瓶颈。
实操建议:
- 在 Nginx 配置的
http或server块里加一行:client_body_buffer_size 128k; - 这个值不宜过大(超过 512k 可能吃光内存),也不宜过小(太小会频繁刷盘);128k 是兼顾内存与 I/O 的常用值
- 确认你的上传目录(如
/www/wwwroot/xxx/uploads)所在磁盘不是高延迟的机械盘或满载 NAS - 如果服务器内存充足(≥8G),可顺带调高
fastcgi_buffers和fastcgi_buffer_size,避免 PHP-FPM 因缓冲不足降级为磁盘临时存储
上传成功但文件损坏或大小不对
典型表现是上传一个 1.2G 文件,结果 PHP 接收到的 $_FILES['file']['size'] 只有几 MB,或者文件打开报“损坏”。这不是网络问题,而是 Nginx 或 PHP 在接收过程中因超时、缓冲溢出或编码干扰丢包或截断。
实操建议:
- 检查 Nginx error 日志:
/www/wwwlogs/nginx_error.log,搜索client intended to send too large body或upstream prematurely closed connection - 确保
client_max_body_size和post_max_size数值完全一致且足够,二者不匹配是静默截断的主因 - 禁用宝塔的「上传进度条」功能试试(在网站配置 → 「PHP 设置」→ 关闭「显示上传进度」),某些旧版 JS 会在分片合并时引入字符编码污染
- 如用 HTTPS,确认没启用过于激进的 TLS 缓冲优化(如某些 CDN 的「HTTP/2 流控」或「Early Data」),它们可能干扰大 body 传输
真正卡住的地方,往往不是参数没设,而是 Nginx、PHP、前端三者限制没对齐,差一个字节或一秒,就可能让文件在某个环节被悄悄切掉。调的时候盯紧日志,别只看界面提示。











