HTTP/HTTP 헤더
HTTP 프로토콜 Keep-Alive 헤더
hippo 데브옵스
2022. 6. 25. 17:27
- Keep-Alive 헤더는 송신자가 연결에 대한 타임아웃(time-out)과 요청 최대 개수를 결정
- Keep-Alive 헤더를 사용하기 위해서는 Connection 헤더를 "keep-alive"로 설정
- Connection과 Keep-Alive는 HTTP/2에서 무시 → HTTP/2 연결 관리는 다른 메커니즘에 의해 처리
- TCP가 전송이 끝나면 연결이 끊어지듯이 HTTP도 서로 전송이 끝나면 끊어짐 →TCP는 Layer4, HTTP는 Layer7
- 매번 똑같은 주소로 요청을 할 때마다 새로운 연결을 설정하고 끊어야 함 → 자원이 낭비
- 자원 낭비를 막기 위해 Keep-Alive가 생성 → '연결을 계속 유지해라'라는 의미
- Keep-Alive 헤더를 통해 최소 특정 시간동안(timeout) 최대 요청 request(max)의 수를 지정
- 최소 5초동안 최대 1000번의 요청을 할 경우에는 http connection이 끊어지지 않음
Keep-Alive: timeout=5, max=1000
- HTTP/1.0과 HTTP/1.1에서의 영속성
- HTTP/1.0 커넥션은 기본적으로 영속적이지 않음.
- Connection을 close가 아닌 retry-after로 설정하면 영속적으로 동작 -> HTTP/1.0으로 동작하는 경우(fallback)에 대비해 종종 추가
- HTTP/1.1는 영속적이며 헤더도 필요 X
Connect: keep-alive 헤더와 Keep-Alive 헤더를 활용하여 설정
1. Multiple Connections 기본적인 구조
- connection을 생성하고, 하나의 호출, 응답을 받은뒤 connection을 끊고, 다시 생성하는 방식
2. Persistent Connection의 Keep-Alive를 사용하는 구조
- 처음 connection을 생성하고, Keep-Alive time out 내에 client가 요청을 하면 port를 새로 여는 것이 아니라 이미 열려 있는 socket에 전송 방식
- time-out 내에 요청이 안들어오게 되면 port를 끊는 방식
Keep-Alive를 사용하지 않아야하는 환경
- 서버에 연결된 모든 클라이언트의 연결이 계속 증가하여 서버의 자원이 고갈되면, 많은 클라이언트의 접속에 대처할 수 없음
- 클라이언트의 접속이 제일 잦은 메인 페이지와 같은 URL 에서는 서버의 가용성을 고려하여 Keep-Alive 사용 유무 결정
- 개인 블로그가 아닌 접속자가 많은 사이트를 운영할 경우에는 관리상 웹 어플리케이션 서버와 이미지 서버를 분리해 운영하는 것이 좋음
- 웹 어플리케이션 서버의 경우에는 Keep-Alive Off 설정
- 이미지 서버는 연결 유지를 위해 KeepAlive On 설정
Keep-Alive 설정 → Keep-Alive: timeout=5, max=1000
1. KeepAlive ( default : off)
- KeepAlive는 한 프로세스가 특정 사용자의 요청을 지속적으로 허용하며 처리할지 여부를 결정
- 운영하는 서버의 메모리 상태나 접속자의 수를 확인하면서 KeepAlive 활용을 조정 필요
- KeepAlive를 On으로 설정 → Connection: Keep-Alive 설정
- 메모리 사용의 부담이 많아지게 되지만 성능은 좋아짐 → 접속자의 수 상관없이 메모리가 충분해야함
- 단발성 요청이 많은 대민 서비스의 경우 Off 가 적절
- 안정적인 KeepAlive를 활용하기 위해서는 접속자가 maxclient 값에 도달했을 경우에도 swap 메모리를 사용하지 않아야함
- KeepAlive를 Off으로 설정
- 동시 접속자 수가 많고, 메모리가 충분하지 못한 경우 활용
- 동시 접속자 수가 많고, 메모리가 충분하지 못한 경우 활용
2. KeepAliveTimeout ( default 15 초) → timeout 값
- KeepAlive가 On 일 경우에 유효한 값
- 연결된 사용자로부터 새로운 오쳥을 받기까지 서버가 얼마나 기다릴 것인가를 설정
- 1~5초 사이로 설정하는 것이 요청을 기다리는 동안 프로세스를 물고있는 RAM 의 낭비를 줄일 수 있음
- 10초 이상은 메모리 점유로 동시접속자가 크게 감소 할 수 있음
3. MaxKeepAliveRequests ( default 100 회) → max 값
- KeepAlive가 On 일 경우에 유효한 값
- 하나의 지속적인 연결에서 서비스를 제공할 요청의 최대 값을 설정
- 50 ~ 75 사이 정도가 충분
문법
Keep-Alive: parameters
Keep-Alive의 파라메터(parameters)
- 쉼표로 구분된 파라메터 목록으로, 각각 등호('=')로 구분되는 식별자와 값으로 구성
1. timeout
- 유휴 연결이 계속 열려 있어야 하는 최소한의 시간(초 단위)을 표시
- keep-alive TCP 메시지가 전송 계층(Transport layer)에 설정되지 않는다면 TCP 타임아웃 이상의 타임아웃은 무시됨
2. max
- 연결이 닫히기 이전에 전송될 수 있는 최대 요청 수를 표시
- 만약 0이 아니라면, 해당 값은 다음 응답 내에서 다른 요청이 전송될 것이므로 비-파이프라인 연결의 경우 무시
- HTTP 파이프라인은 파이프라이닝을 제한하는 용도로 해당 값을 사용 가능
3. Keep-Alive 헤더를 포함하는 응답 예제
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Thu, 11 Aug 2016 15:23:13 GMT
Keep-Alive: timeout=5, max=1000
Last-Modified: Mon, 25 Jul 2016 04:32:39 GMT
Server: Apache
(body)