> 技术文档 > 若依前端报错:Failed to load resource: the server responded with a status of 504 (Gateway Time-out)

若依前端报错:Failed to load resource: the server responded with a status of 504 (Gateway Time-out)


 报错页面:

报错信息:Failed to load resource: the server responded with a status of 504 (Gateway Time-out)

思考:

504 错误是网关超时,通常发生在客户端(如浏览器)向服务器发送请求时,作为中间代理的网关或负载均衡器无法及时从上游服务器获取响应。

初步排查步骤:

首先,网关超时可能是因为后端服务处理请求的时间过长,超过了网关设置的超时时间。比如,若依的网关可能用了 Nginx 或 Spring Cloud Gateway,默认超时时间可能较短,而某个接口处理耗时超过了这个时间。

其次,后端服务可能过载,比如 CPU 使用率过高、内存不足,导致无法及时响应请求。这时候需要检查服务器的资源使用情况,比如通过 top 命令查看 CPU 和内存,或者用监控工具如 Prometheus 查看服务状态。

另外,网络问题也可能导致 504 错误。比如,客户端到网关的网络延迟,或者网关到后端服务的网络连接不稳定。这时候需要检查网络链路,可能用 ping 或 traceroute 工具测试延迟和丢包情况。

还有可能是网关配置的问题。比如,Nginx 的 proxy_timeout 设置过小,或者 Spring Cloud Gateway 的超时参数需要调整。需要查看网关的配置文件,确认超时时间是否合适,是否需要增加。

另外,若依系统本身可能存在性能瓶颈,比如数据库查询缓慢,导致接口响应时间长。这时候需要排查慢 SQL,优化数据库查询,或者增加索引。

还有一种情况是并发请求过多,后端服务无法处理,导致请求堆积,最终超时。这时候可能需要增加服务实例,进行负载均衡,或者优化代码处理并发的能力。从网关配置、后端服务优化、网络检查到代码优化等方面。同时,要考虑到若依框架的特殊性,比如它使用微服务架构,可能需要检查各个服务的状态和配置。

如项目如我一样使用网关作为请求代理,出现报错:Failed to load resource: the server responded with a status of 504 (Gateway Time-out),无法在指定时间内从后端服务获取响应可以参考此贴。以下是我总结的排查步骤与解决方案:

具体解决方案:

一、错误本质与核心原因

504 错误的核心逻辑是
客户端(浏览器)→ 网关(代理)→ 后端服务
当网关向后端服务转发请求时,后端服务超过网关设置的超时时间仍未响应,网关主动断开连接并返回 504。

二、分场景排查步骤
1. 网关超时配置检查(首要排查点)

1.1 Nginx 网关(若依常用)
检查 Nginx 配置文件(如nginx.conf)中的超时参数:

http { # 全局超时配置 proxy_connect_timeout 60s; # 网关与后端服务的连接超时时间 proxy_read_timeout 600s; # 网关读取后端响应的超时时间(注意把这个调整项整大一点) proxy_send_timeout 600s; # 网关向后端发送请求的超时时间 

操作建议:将proxy_read_timeout调整为 300s~900s,重启 Nginx 后观察。

1.2 Spring Cloud Gateway(微服务架构)
检查application.yml中的网关配置:

spring: cloud: gateway: httpclient: connect-timeout: 10000 # 连接超时(毫秒) response-timeout: 600000 # 响应超时(毫秒,建议设为600000即10分钟)
2. 后端服务性能排查

服务响应耗时检测
通过网关日志或监控工具(如 Prometheus)查看若依服务接口的平均响应时间:

# 示例:通过Nginx日志筛选慢请求grep \"upstream_response_time\" /var/log/nginx/access.log | grep \"ruoyi\" | sort -k7 -r | head

若存在大量响应时间超过 60s 的请求,说明后端服务处理缓慢。

服务器资源监控
使用tophtopdstat命令查看 CPU、内存、磁盘 IO:

top -o %CPU # 按CPU使用率排序free -h # 查看内存使用iotop # 查看磁盘IO占用
  • 常见瓶颈

    • CPU 满载(如 GC 频繁、复杂计算)
    • 内存不足(频繁 Full GC 导致服务暂停)
    • 磁盘 IO 瓶颈(数据库慢查询、日志写入过多)
3. 数据库与慢查询优化
  • 排查若依系统慢 SQL
    开启数据库慢查询日志(以 MySQL 为例):

SET GLOBAL slow_query_log = ON;SET GLOBAL long_query_time = 1; # 超过1秒的查询记为慢查询
  • 查看慢查询文件,优化耗时 SQL(如添加索引、拆分复杂查询)。

  • 连接池配置检查
    若依默认使用 HikariCP,检查application.yml中的连接池配置:

spring: datasource: hikari: maximum-pool-size: 50 # 最大连接数(根据数据库性能调整) connection-timeout: 30000 # 连接超时时间(毫秒)
  • 若连接池已满,会导致请求堆积,间接引发 504。

4. 网络与负载均衡问题
  • 网络链路测试
    在网关服务器执行:

ping -c 10 backend-server-ip # 测试网关到后端服务的网络延迟telnet backend-server-ip 8080 # 测试端口连通性
  • 若存在高延迟或丢包,检查网络设备(如路由器、防火墙)或调整服务器部署位置。

  • 负载均衡配置
    若使用 Nginx 或 LVS 做负载均衡,检查后端服务节点健康状态:

upstream ruoyi_backend { server 192.168.1.101:8080 weight=10; server 192.168.1.102:8080 weight=10; health_check interval=30s fail_count=3; # 健康检查配置}
  • 若某节点负载过高,可临时调整 weight 或剔除节点。

5. 若依系统特有优化
  • 清理缓存与临时文件
    若依框架使用 Redis 缓存,若缓存失效或 Redis 服务异常,可能导致数据库压力骤增。清理无效缓存或重启 Redis:

  • redis-cli flushdb # 谨慎操作,生产环境需先确认缓存用途

    调整定时任务频率
    若依自带定时任务(如数据统计、报表生成),若任务执行过频或耗时过长,可修改quartz.properties中的配置:

  • # 示例:降低报表任务频率org.quartz.jobStore.misfireThreshold=60000

    三、临时解决方案与监控策略

  • 临时提升网关超时时间
    先通过调整网关超时参数(如 Nginx 的proxy_read_timeout到 900s)快速恢复服务,避免频繁 504 影响用户体验。

  • 启用网关限流
    在网关层添加限流规则(如 Nginx 的limit_req模块),防止突发流量压垮后端:

limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;server { location /ruoyi/ { limit_req zone=one burst=20 nodelay; }}

部署 APM 监控工具
安装 Skywalking、Pinpoint 等工具,实时追踪请求链路,定位具体耗时的服务或接口:

# 示例:Skywalking Agent启动参数java -javaagent:/path/to/skywalking-agent.jar -Dskywalking.agent.service_name=ruoyi-web ...

四、总结排查流程

  1. 先调整网关超时配置,快速恢复服务 → 2. 监控后端服务资源与响应耗时 → 3. 排查数据库慢查询与连接池问题 → 4. 检查网络链路与负载均衡 → 5. 针对若依框架优化缓存与任务配置。