
处理 Nginx + PHP-FPM 环境下文件上传与下载中断,关键不是单点调大某个超时值,而是让请求接收、转发、执行、响应四个环节的限制全部对齐,并兼顾临时路径、缓冲区和链路头信息。中断常表现为 413、502、504、空白页或 $_FILES 为空,多数情况是某一层提前“放弃”,而非程序真正卡死。
上传中断:三层大小与三段超时必须同步放开
上传失败(如 413 Request Entity Too Large 或上传中途断连)本质是 Nginx、PHP、PHP-FPM 三者在不同阶段各自拦截:
-
Nginx 层:用
client_max_body_size拦截整个 HTTP 请求体(含文件 + 表单字段 + multipart boundary),必须设在location ~ \.php$或具体上传路径(如location /upload)内,且 ≥ PHP 的post_max_size。例如:client_max_body_size 512M; -
PHP 层:
upload_max_filesize(单文件上限)和post_max_size(整段 POST 数据)必须同时调大,后者需略大于前者(预留字段开销),例如:upload_max_filesize = 512M,post_max_size = 520M。仅改一个,PHP 会静默丢弃整个请求。 -
PHP-FPM 层:
request_terminate_timeout(在www.conf中)控制进程级生命周期,它包裹max_execution_time。若该值为 60 秒,即使 PHP 内部设了 600 秒也无效。建议设为与 Nginx 超时一致或略小,例如request_terminate_timeout = 300。
上传中断:Nginx 与 PHP-FPM 的三段通信超时要严格一致
504 Gateway Timeout 多数不是 PHP 执行慢,而是 Nginx 在某次交互中主动断开连接。必须同步配置以下三项,且数值完全相同:
-
fastcgi_connect_timeout:建连阶段超时(如 Unix socket 连接),建议 5~10 秒 -
fastcgi_send_timeout:Nginx 向 PHP-FPM 发送完整请求体(含大文件流)的最大等待时间 -
fastcgi_read_timeout:Nginx 等待 PHP-FPM 返回响应的最长时间
三者缺一或不等,大文件上传极易卡在 send 阶段就返回 504。宝塔等面板默认只暴露 read 项,前两项仍为 60 秒,务必手动补全。
下载中断:重点保障 Range 支持与传输稳定性
大文件下载中断(如视频播放卡顿、PDF 下载失败)多因 Nginx 主动切断长连接或不支持断点续传:
- 启用
Accept-Ranges: bytes:确保静态 location 中未禁用max_ranges,且不使用rewrite或auth_basic拦截 Range 请求 - 透传 Range 头:若走
proxy_pass,需显式添加proxy_set_header Range $http_range;和proxy_set_header If-Range $http_if_range; - 调高传输超时:对下载路径单独设
send_timeout 300;(直供文件)或proxy_read_timeout 300;(代理场景),避免网络抖动触发断连 - 关闭干扰项:大文件下载 location 中加
gzip off;(防压缩破坏 Range)、tcp_nodelay off;(减少小包)、慎用sendfile on;(某些内核下与断点续传冲突)
共性支撑:缓冲区、临时目录与权限不能忽略
即使大小和超时都设对,上传下载仍可能卡死或报 upstream buffer is too small:
-
缓冲区扩容:在 PHP location 块中添加:
fastcgi_buffer_size 128k;fastcgi_buffers 4 256k;fastcgi_busy_buffers_size 512k;fastcgi_temp_file_write_size 512k;
-
临时目录保障:PHP 的
upload_tmp_dir(如/var/www/uploads/tmp)和 Nginx 的fastcgi_temp_path必须存在、空间充足、且对www用户可写。执行chown -R www:www /path/to/tmp并确认。 -
全链路检查:CDN、API 网关、负载均衡器前端同样需设置
client_max_body_size;后端框架(如 TP6、Spring Boot)的 multipart 限制也要同步放开。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











