504错误源于nginx代理超时,必须同步调大nginx的proxy_read_timeout、php-fpm的request_terminate_timeout、phpmyadmin的$cfg['exectimelimit']及php的max_execution_time和post_max_size,任一环节限制过严都会导致504。
504 不是 phpmyadmin 卡住,而是 nginx 在等后端响应时主动放弃了——必须同步调大 nginx、php-fpm 和 phpmyadmin 三层的超时限制,缺一不可。
为什么改了 Nginx 的 proxy_read_timeout 还是 504?
因为 PHP-FPM 的 request_terminate_timeout 默认是 30 秒,它比 Nginx 更早杀死进程。Nginx 等到 300 秒才放弃,但 PHP-FPM 在第 31 秒就把脚本干掉了,Nginx 最终收不到任何响应,只能返回 504。
- 检查
/etc/php/{version}/fpm/pool.d/www.conf,确认request_terminate_timeout已取消注释,设为300或0(禁用) - 若同时设置了
request_slowlog_timeout,别和它设成一样值,否则会误触发慢日志干扰判断 - 改完必须执行
sudo systemctl restart php{version}-fpm,否则不生效
phpMyAdmin 自己还有个“软超时”:$cfg['ExecTimeLimit']
这个配置在 phpMyAdmin 的 config.inc.php 里,和 PHP 或 Nginx 无关,是它自己用 set_time_limit() 实现的。默认 300 秒,如果比 PHP-FPM 的限制还小,前面全白调。
- 添加或修改这一行:
$cfg['ExecTimeLimit'] = 0;(注意:只接受整数,false或空字符串无效) - 该设置只影响导入、导出、搜索等 phpMyAdmin 内部操作,不影响其他 PHP 脚本
- 如果你用的是 Docker 镜像,需挂载自定义配置文件覆盖默认值,直接进容器改可能重启即丢
别漏掉 PHP 底层的 max_execution_time 和 post_max_size
长 SQL 执行本身要时间,而提交大 SQL 文本(比如粘贴 10MB 的语句)会先撞上 POST 大小限制——这时根本到不了执行阶段,Nginx 可能直接返回 413,或静默截断请求体导致语法错误,继而引发后续超时连锁反应。
- 在
php.ini中设:max_execution_time = 300、post_max_size = 128M、upload_max_filesize = 128M -
post_max_size必须 ≥upload_max_filesize,否则 PHP 启动阶段就拒绝解析请求 - Apache 用户(如 XAMPP)还要确认
LimitRequestBody指令没在虚拟主机里设得太小
真正难处理的不是参数数字,而是长 SQL 本身是否可优化:一个没加索引的 SELECT * FROM huge_table WHERE text_column LIKE '%xxx%' 即使超时调到 1 小时也跑不完。调参只是争取排查时间,不是替代 SQL 审计和索引优化。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











