Client <--[timeout client]--> HAProxy <--[timeout connect]--> Backend
<--[timeout server]--->
| 설정 | 구간 | 재는 대상 |
|---|---|---|
timeout connect |
HAProxy → 백엔드 | TCP 연결을 맺기까지 기다리는 시간 |
timeout client |
클라이언트 ↔ HAProxy | 클라이언트가 아무것도 보내지 않고 있는 시간 |
timeout server |
HAProxy ↔ 백엔드 | 백엔드가 응답을 보내지 않고 있는 시간 |
client 와 server 는 전체 소요 시간이 아니라 무통신 상태(idle) 를 잰다. 데이터가 계속 흐르는 대용량 전송은 timeout server 30s 여도 30초 만에 끊기지 않는다. 반대로 백엔드가 요청을 받아 놓고 계산만 오래 하면 그 사이 아무것도 보내지 않으므로 이 값에 걸린다.
defaults
log global
mode http
option httplog
timeout connect 5s
timeout client 30s
timeout server 30s
세 값이 없으면 HAProxy 가 기동 때 경고를 낸다. 값이 없다는 것은 무한 대기를 뜻해 연결이 쌓이기 때문이다.
timeout connect 는 짧게 잡는다. 정상 상태에서 같은 망 안의 TCP 연결은 밀리초 단위로 끝나므로 2-5초면 충분하다. 길게 두면 죽은 서버를 붙잡고 기다리느라 장애 감지가 늦어진다.
timeout server 는 백엔드가 가장 오래 걸리는 정상 요청보다 길어야 한다. 리포트 생성이나 대용량 조회가 있는 서비스에서 이 값이 짧으면 정상 요청이 504 로 끊긴다. 대신 무한정 길게 두면 백엔드가 멈췄을 때 연결이 쌓인다.
timeout client 는 업로드가 느린 사용자와 keep-alive 연결을 고려한다. 너무 짧으면 모바일 · 저속 회선 사용자가 자주 끊긴다.
# 일반 웹 서비스
timeout connect 5s
timeout client 60s
timeout server 60s
# 장시간 API · 배치
timeout connect 5s
timeout client 5m
timeout server 5m
| 설정 | 용도 |
|---|---|
timeout http-request |
요청 헤더 전체를 받기까지의 제한. Slowloris 방어에 쓴다 |
timeout http-keep-alive |
응답 후 다음 요청을 기다리는 시간 |
timeout queue |
백엔드가 가득 찼을 때 큐에서 대기하는 최대 시간 |
timeout check |
헬스 체크 응답 대기 시간 |
timeout tunnel |
WebSocket · CONNECT 처럼 터널로 전환된 뒤 적용 |
defaults
timeout http-request 10s
timeout http-keep-alive 10s
timeout queue 30s
timeout check 5s
WebSocket 을 쓰는 서비스에서 연결이 주기적으로 끊긴다면 timeout tunnel 을 본다. 업그레이드된 뒤에는 client · server 대신 이 값이 적용되므로, 길게 잡거나 애플리케이션에서 ping 을 보내게 한다.
timeout tunnel 1h
HTTP 로그의 종료 상태(termination_state) 첫 글자로 구분한다.
| 값 | 뜻 |
|---|---|
cD |
클라이언트 쪽 데이터 대기 중 타임아웃(timeout client) |
sH |
백엔드 응답 헤더 대기 중 타임아웃(timeout server) |
sD |
백엔드 데이터 전송 중 타임아웃 |
cH |
요청 헤더 대기 중 타임아웃(timeout http-request) |
SC |
백엔드 연결 실패(timeout connect 또는 거부) |
504 응답과 sH 가 함께 보이면 백엔드가 느린 것이고, SC 와 503 이면 연결 자체가 안 된 것이다. 로그 필드 해석은 HAProxy 로그 설정과 분석 에 정리했다.
haproxy -c -f /etc/haproxy/haproxy.cfg # 문법 검사
systemctl reload haproxy # 무중단 적용
reload 는 기존 연결을 유지한 채 새 프로세스를 띄운다. 타임아웃을 크게 줄이는 변경은 재적재 직후 기존 연결에 영향을 주므로 트래픽이 적은 시간에 한다.