프로젝트의 gunicorn.conf
내용을 보다가 keepalive
값이 있어서 찾아보게 되었다. 프로젝트 참여 전, overview 시간에 간단히 들은 적이 있어서 용도는 대강 감이 약간 오는데 관련 문서를 번역도 해보면서 좀 더 자세하게 알아보기로 했다. 번역 글이니 틀린 부분에 대한 피드백은 얼마든지 환영한다.
HTTP Keep-Alive
(HTTP 영구적 커넥션)은 단일 TCP 커넥션에서 여러 HTTP 요청과 응답을 유지할 수 있도록 하는 명령이다.
기본적으로 매 요청 이후에 HTTP 커넥션은 끊긴다. 누군가가 사이트를 방문한다고 할 때, 방문자의 브라우저는 웹 페이지를 구성하는 파일들을 요청하기 위해 새로운 커넥션을 생성해야 한다. 이 과정에서 페이지 로딩 시간이 길어질 수 있다.
keep-alive
헤더를 활성화하면 단일 커넥션에서 모든 웹 페이지 리소스들을 제공할 수 있다. HTTP 통신은 매 요청-응답마다 커넥션을 열고 닫으므로 keep-alive
헤더를 통해 서버의 CPU와 메모리의 사용량을 줄일 수 있다.
커넥션의 timeout과 최대 요청 수를 설정할 수 있다.
Keep-Alive 헤더가 의미를 가지기 위해서는 커넥션 헤더를
keep-alive
로 설정해야 한다. 또한 커넥션과 Keep-Alive HTTP/2에서는 무시된다. 커넥션 관리는 다른 메커니즘에 의해 처리된다.
Keep-Alive: 파라미터
=
로 인해 구분되는 식별자와 값으로 구성된 콤마로 구분되는 파라미터의 리스트이다. 식별자로는 timeout
과 max
가 있다.
timeout
: 유휴 커넥션의 최소 지속시간을 초
단위로 나타낸다. 전송 레벨에서 TCP 메시지에 keep-alive
가 설정되어 있지 않다면 TCP이 timeout보다 길다.max
: 해당 커넥션이 close 되기 전까지의 최대 요청 수를 나타낸다. 0이 아니라면 이 값은 non-pipelined 연결에 대해서 다음 응답에서 다른 요청이 전송되므로 무시된다. HTTP 파이프라인은 파이프라이닝을 제한할 수 있다.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
(이하 응답 본문)
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Keep-Alive
https://www.imperva.com/learn/performance/http-keep-alive/