服务器上Laravel简单查询耗时超30秒返回504但本地正常,该如何排查?
偶发504超时问题排查方向
1. Nginx反向代理层
- 核对Nginx超时配置项:
proxy_connect_timeout、proxy_send_timeout、proxy_read_timeout,默认60s的阈值很容易被后端偶发阻塞触发504,若存在上层CDN、WAF也需同步核对其超时规则,避免上层服务先掐断连接 - 查看Nginx错误日志
/var/log/nginx/error.log,定位504发生时的日志条目,区分是连接上游PHP-FPM超时、还是读取上游返回结果超时,缩小问题范围 - 检查Nginx的
worker_processes、worker_connections配置,偶发高并发下worker进程/连接数占满时,新请求会排队等待导致超时
2. PHP-FPM运行层
- 核对PHP-FPM进程配置:
pm.max_children、pm.start_servers、pm.min_spare_servers、pm.max_spare_servers,若进程数配置过低,高并发下请求会排队等待空闲进程,即便是简单查询接口也会被拖慢超时 - 开启PHP-FPM慢日志:配置
slowlog路径和request_slowlog_timeout(建议设为1s),超时请求会打印完整调用栈,可直接定位阻塞点是在数据库连接、缓存连接还是应用中间件逻辑 - 检查PHP Session存储逻辑:若Session存储在文件、远端存储等介质,偶发存储响应慢时,即便是不需要Session的接口如果配置了自动开启Session,也会被阻塞
3. 数据存储层(数据库、缓存)
- 检查MySQL/PostgreSQL等数据库的最大连接数配置,以及504发生时的活跃连接数,连接数打满时新请求会排队等待数据库连接,简单查询也无法执行
- 排查数据库慢查询日志,简单查询也可能因为表锁、行锁、大事务抢占IO导致执行阻塞,不要仅通过查询本身的复杂度判断执行效率
- 检查Redis等缓存服务的连接配置,若存在连接超时重试逻辑不合理、连接池耗尽的问题,Laravel读缓存的逻辑会直接卡住整个请求
4. 服务器系统层
- 用
top、iostat、iftop等工具持续监控服务器CPU、内存、磁盘IO、网络IO指标,确认504发生时是否有定时任务(如数据库备份、日志切割)、其他进程抢占系统资源 - 检查服务器DNS配置,若Laravel用域名连接数据库、缓存或第三方服务,DNS解析偶发超时会直接阻塞请求
- 核对防火墙、安全组的连接数限制,偶发连接数超过阈值时会被丢弃数据包,导致连接超时
5. Laravel应用层
- 排查全局中间件逻辑:若存在全局的请求上报、权限校验等调用外部服务的逻辑,外部服务偶发超时会拖累所有接口响应
- 检查日志写入配置:生产环境若使用同步写入磁盘的日志驱动,磁盘IO占用高时日志写入会卡住请求,建议切换为异步日志驱动或调整日志等级
- 确认OPcache已正确开启配置,未开启OPcache时PHP每次请求都需要重新编译Laravel代码,高并发下响应速度会大幅下降
内容的提问来源于stack exchange,提问作者Behnam Aminazad
相关产品推荐
相关产品推荐

