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 的說明