Apache日志显示请求200成功但浏览器报504网关超时的排查问询
问题描述
同一请求出现矛盾现象:
- Apache访问日志记录状态码200(请求处理成功),但浏览器返回504 Gateway Timeout错误
- 超时恰好发生在AWS负载均衡器(ELB)1200秒(20分钟)空闲超时阈值之后
- AWS负载均衡器的访问日志中未找到该超时请求的记录
- 已尝试将ELB空闲超时值从600秒调整至1200秒,问题仍未解决
补充信息:
- 浏览器显示504错误
- Apache访问日志记录:
[14/Sep/2023:13:12:18 +1000] "GET /pages/UI.php?operation=details&class=UserRequest&id=581400& HTTP/1.1" 200 202228
- ELB定期健康检查日志(状态码200):
[14/Sep/2023:13:46:26 +1000] "GET /pages/UI.php HTTP/1.1" 200 9540 "-" "ELB-HealthChecker/2.0"
排查过程遗漏点
- 未检查后端服务器到ELB的响应传输时长:Apache记录200仅代表服务器处理完成,但响应数据包从服务器传输到ELB的过程中可能出现延迟或中断,导致ELB在超时阈值后判定超时
- 未排查TCP连接层面的问题:比如服务器和ELB之间的TCP连接是否在服务器发送响应后被意外中断(如防火墙超时、网络设备重置连接)
- 未验证ELB日志的完整性和过滤规则:可能日志配置有误,或者该请求被日志过滤规则排除,导致未被记录
- 未检查客户端到ELB的连接状态:浏览器到ELB的连接可能先于ELB到服务器的连接出现超时,导致ELB未将服务器的响应转发给客户端
- 未排查应用层的响应分块传输问题:如果服务器采用分块编码返回响应,部分块传输延迟可能触发ELB超时,即使Apache已记录200
可能原因
- 后端服务器响应传输延迟:服务器处理完请求后,由于网络拥堵、服务器资源耗尽(如磁盘IO过高),导致响应数据包无法及时发送到ELB,超过ELB空闲超时阈值后,ELB主动断开连接并返回504给客户端,而Apache已完成处理记录200
- 中间网络设备超时:服务器和ELB之间的防火墙、NAT设备等设置了比ELB更短的空闲超时时间,在服务器发送响应前就重置了TCP连接,ELB无法收到服务器响应,返回504,而Apache已完成处理
- ELB连接复用问题:ELB复用了已超时的TCP连接向服务器发送请求,服务器处理完成后尝试通过已失效的连接发送响应,导致响应丢失,ELB返回504
- 客户端侧连接超时:浏览器或客户端设置的超时时间短于ELB的1200秒,客户端先断开连接,ELB即使后续收到服务器响应也无法转发,此时浏览器显示504,但Apache已记录200
- ELB日志配置遗漏:ELB日志未正确配置记录所有请求类型,或者日志投递存在延迟/丢失,导致该超时请求未被记录
内容的提问来源于stack exchange,提问作者PoojaA
相关产品推荐
相关产品推荐

