haproxy 中的超时
客户端请求阶段
- timeout client
- haproxy 和客户端通信时,连接不活跃的时间,既不发送数据,也不ack接收的数据
- 如果未设置,则永不超时,此时连接是否超时依赖于tcp连接本身的机制
- timeout http-request
- tcp 连接建立后,直到所有头部发送完毕的时间
- 如果未设置,则使用 timeout client 的值
- 如果 frontend 是 tcp 模式,则使用 backend 中的 timeout http-request
- timeout http-keep-alive
- 当开启 option http-keep-alive 时,haproxy 处理完请求 A ,等待连接上请求 B ,请求 A 结束到请求 B 开始之间的间隔时间
- 如果未设置,则使用 timeout client
- 如果 frontend 是 tcp 模式,则使用 backend 中的 timeout http-keep-alive
- timeout client-fin
- 当客户端和 haproxy 的连接的一端已经 shutdown 时,该连接不活跃的时间
- 如果未设置
- 非隧道连接,使用 timeout client
- 隧道连接,如 RDB/WebSocket ,使用 timeout tunnel
haproxy 转发阶段
- timeout queue
- 当 haproxy 接受客户端请求后,如果暂时找不到可以立即转发的后端,此时会将该连接放置在 backend 或者 server 的请求队列中,等待有 server 可以处理请求时,就转发过去
- timeout queue 指定的是,某个请求被放置在队列中的最大时间,如果超时,则认为该请求不能被处理,返回 503 给客户端
- 如果未设置,则使用 timeout connect
- timeout connect
- haproxy 和后端建立 tcp 连接的超时时间
- 如果未设置则永不超时
后端响应阶段
- timeout server
- haproxy和后端通信时,连接不活跃的时间,即既不发送数据,也不 ack 接收的数据
- timeout server-fin
- 当 haproxy 和后端的连接的一端已经 shutdown 时,该连接不活跃的时间
- 如果未设置
- 非隧道连接,使用 timeout server
- 隧道连接,使用 timeout tunnel
特殊场景
-
timeout tunnel
- 隧道连接的场景
- http 连接升级后 WebSocket 之后
- 转发 CONNECT 请求 给http 代理
- tcp 连接
- 隧道连接建立后,该连接双向不活跃的时间,即连接上既不发送数据,也不接收数据
- 当连接转换为隧道连接后,timeout client/timeout server 都将被 timoeut tunnel 取代
- 隧道连接的场景
-
timeout tarpit
- 当 http 请求被 http-request tarpit 指令标记后,haproxy 会将连接维持 timeout tarpit 的时间,如果超时后,该连接仍然未关闭,就回复 500 响应码给客户端,参看 http-request tarpit 的说明