408 的定位
408 Request Timeout 表示服务器在空闲超时内没等到一个完整请求,主动放弃这条连接(RFC 9110 §15.5.9)。它描述的是「等你发请求」超时,与 504 的「等上游处理」超时完全是两件事。慢客户端、弱网、以及负载均衡空闲超时配置不一致,是最常见的触发源。
基本信息
| 名称 | 408 Request Timeout |
|---|---|
| 含义 | 服务端等待请求(头或体)超时 |
| 规范 | RFC 9110 §15.5.9 |
| Nginx 相关 | client_header_timeout、client_body_timeout、keepalive_timeout |
| 可否重试 | 幂等请求可安全重试,非幂等要先确认是否已被处理 |
典型使用场景
- 弱网移动端首包慢,服务器在收到完整请求头前就超时断连
- 负载均衡空闲超时短于客户端复用间隔:请求发到已关闭的连接上
- 大文件慢速上传,client_body_timeout 被打断
- 压测或爬虫并发抢连接,出现大量半开连接与 408 噪声
Nginx 超时参数
Nginx 超时参数
http {
client_header_timeout 15s; # 收完整请求头的最长等待
client_body_timeout 30s; # 两次成功读请求体的间隔上限
keepalive_timeout 60s; # 空闲连接保留时长
send_timeout 30s; # 向客户端写响应的间隔上限
}与相邻错误码区别
| 状态码 | 含义 | 典型根因 |
|---|---|---|
| 408 | 服务端等请求超时 | 客户端慢、半开连接、空闲超时配得不一致 |
| 499 | 客户端提前断开(Nginx 私有码) | 用户取消、前端自己的请求超时先到 |
| 502 | 上游不可达或响应非法 | 后端进程崩、端口不通 |
| 504 | 等上游响应超时 | 后端处理慢 |
排查时把链路三层的空闲超时对齐:负载均衡、Nginx、应用框架。空隙最大的那一层往往是「连接被悄悄关掉」的元凶。
责任不在服务端
408 由服务器发出,但根因往往在客户端或中间链路:服务器只是判定「这条连接上迟迟没有出现一个完整请求」。所以把它当服务端故障去查通常南辕北辙,正确做法是同时看客户端日志、负载均衡日志与抓包结果。
排查顺序
- 抓包确认 408 是服务器主动发出,还是客户端自身超时后的误报
- 对比负载均衡与会话保持的空闲超时值,与客户端复用连接的间隔
- 检查链路里是否有 NAT 或防火墙会回收长时间空闲的连接
- 大文件上传单独看请求体读取超时与客户端上行速率
- 压测场景先看连接数与半开队列,再去调超时参数
Nginx 记录 408 时请求行与客户端标识往往是空的(请求头没读全就断了),这是识别「对端很慢或半开连接」的重要线索,比状态码本身更有信息量。