504错误源于nginx与php-fpm三段超时未对齐,须同步调大fastcgi_connect_timeout、send_timeout、read_timeout至300秒,同步放开php-fpm的request_terminate_timeout,并增大fastcgi缓冲区、确保tmp目录www用户可写。

TP6.0 项目在 Nginx + PHP-FPM 环境下上传大文件时频繁返回 504 Gateway Timeout,不是框架本身限制,而是 Nginx 与 PHP-FPM 协同超时机制未对齐导致请求在某一段通信中被强制中断——比如上传 200MB 文件卡在发送阶段,Nginx 其实根本没等到读响应就已放弃。
修改 Nginx 站点配置,同步收紧三段超时
进入宝塔面板 → 网站 → 对应站点 → 配置文件,在 location ~ \.php(.*)$ 块内、fastcgi_pass 行正下方插入三行:
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
三个值必须完全一致,【不能只改 fastcgi_read_timeout】。Nginx 与 PHP-FPM 的握手分 connect→send→read 三步,任一环节超时都会直接 504;宝塔默认仅暴露 read 项,前两项仍为 60 秒,大文件上传极易卡在 send 阶段。
改完点击右上角「重载配置」,不是「重启 Nginx」。
放开 PHP-FPM 层的 request_terminate_timeout
打开 /www/server/php/81/etc/php-fpm.d/www.conf(版本号按你实际使用的 PHP 版本替换,如 80、82):
执行命令查看当前值:grep request_terminate_timeout /www/server/php/81/etc/php-fpm.d/www.conf
若输出为 request_terminate_timeout = 60,将其改为 request_terminate_timeout = 300 或直接注释掉该行(注释后以全局默认为准);【若为 0 则跳过此步】。
保存后执行:service php-fpm-81 restart(版本号必须与 conf 路径严格一致)。
注意:TP6 中 ini_set('max_execution_time', '300') 或 php.ini 的 max_execution_time 无效——它被 request_terminate_timeout 包裹,后者不放宽,前者再大也没用。
增大 Nginx fastcgi 缓冲区并确认 tmp 目录权限
仍在站点配置的同一 location ~ \.php(.*)$ 块内,添加或修正以下四行:
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 512k;
fastcgi_temp_file_write_size 512k;
缓冲区太小会导致 Nginx 尝试写临时文件,而 /www/wwwroot/你的站点/tmp 若对 www 用户不可写,就会阻塞并最终超时。执行:chown -R www:www /www/wwwroot/你的站点/tmp 并确认目录存在且非只读。
若错误日志持续出现 upstream buffer is too small 提示,再逐步调高数值,不要盲目设为 1M。
补充:TP6 框架层需显式允许大文件上传
打开 config/filesystem.php,确保 'upload' => ['max_size' => 0](0 表示不限制);
在控制器接收逻辑中,使用 $file->getSize() 前先检查 $file->isValid(),避免因底层超时导致文件对象为空却继续执行;
TP6 默认不拦截上传中断,但若业务需强一致性,应在上传完成后校验文件 MD5 或大小是否匹配客户端传入值。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











