답변:
편집 : 내 대답은 편집되지 않은 원래 질문에만 적용됩니다.이 질문은로드 밸런서 / 리버스 프록시에서 일반적인지 여부입니다. nginx / product X가이 기능을 지원하는지 잘 모르겠습니다. 리버스 프록시 경험의 99.9 %가 HAproxy를 사용하고 있습니다.
옳은. 서버 쪽이 아닌 클라이언트 쪽의 HTTP 연결 유지.
왜?
몇 가지 세부 정보를 분류하면 이것이 왜 이점인지 신속하게 확인할 수 있습니다. 이 예에서는 www.example.com 페이지를로드한다고 가정하고 해당 페이지에는 3 개의 이미지 img [1-3] .jpg가 포함되어 있습니다.
4 개의 별도 TCP 세션이 설정되어 닫혀 있습니다.
HTTP Keep-Alive를 사용하면 단일 TCP 연결이 여러 HTTP 요청을 차례로 처리 할 수 있습니다.
Keep-Alive를 사용하면 단 하나의 TCP 연결 만 설정되고 결국 닫힙니다.
이에 응답하려면 클라이언트와 서버간에 TCP 연결을 설정하는 데 필요한 사항을 이해해야합니다. 이를 TCP 3 방향 핸드 셰이크라고합니다.
네트워크에는 대기 시간이 있으므로 3 방향 핸드 셰이크의 각 단계에는 일정 시간이 걸립니다. 클라이언트와 서버 사이에 30ms가 있다고 가정하면 TCP 연결을 설정하는 데 필요한 IP 패킷의 앞뒤 전송은 TCP 연결을 설정하는 데 3 x 30ms = 90ms가 걸린다는 것을 의미합니다.
그다지 들리지는 않지만 원래 예제에서 4 개의 개별 TCP 연결을 설정해야한다고 생각하면 360ms가됩니다. 클라이언트와 서버 간의 대기 시간이 30ms가 아니라 100ms이면 어떻게됩니까? 그런 다음 4 개의 연결을 설정하는 데 1200ms가 걸립니다.
더 나쁜 것은 일반적인 웹 페이지를로드하기 위해 3 개 이상의 이미지를 요구할 수도 있고 클라이언트가 요청해야하는 CSS, JavaScript, 이미지 또는 기타 파일이 여러 개있을 수도 있습니다. 페이지에 30 개의 다른 파일이로드되고 클라이언트 서버 대기 시간이 100ms 인 경우 TCP 연결을 설정하는 데 얼마나 걸립니까?
30 개의 다른 파일을 참조하는 웹 페이지를로드하기 위해 TCP 연결을 설정하는 데 9.3 초가 걸렸습니다. 그리고 그것은 HTTP 요청을 보내고 응답을받는 데 걸린 시간조차 포함하지 않습니다.
HTTP Keep-Alive를 사용하면 하나의 TCP 연결 만 설정하면 300ms가 걸립니다.
HAproxy와 같은 HTTP 역방향 프록시는 일반적으로 프록시를 사용하는 백엔드 서버에 매우 가깝게 배포됩니다. 대부분의 경우 리버스 프록시와 백엔드 서버 간의 대기 시간은 1ms 미만이므로 TCP 연결을 설정하는 것이 클라이언트 간의 것보다 훨씬 빠릅니다.
그러나 그 이유는 절반에 불과합니다. HTTP 서버는 각 클라이언트 연결에 대해 특정 양의 메모리를 할당합니다. Keep-Alive를 사용하면 연결이 유지되며, 서버 구성에 따라 Keep-Alive 시간 제한에 도달 할 때까지 서버에서 일정량의 메모리를 사용합니다. .
따라서 HTTP 리버스 프록시의 서버 측에서 Keep-Alive를 사용하는 효과를 고려하면 메모리에 대한 필요성이 증가하고 있지만 프록시와 서버 간의 대기 시간이 너무 짧기 때문에 실제 이점이 없습니다. TCP의 3 방향 핸드 셰이크에 걸리는 시간이 단축되므로 일반적으로이 시나리오에서 프록시와 웹 서버간에 Keep-Alive를 비활성화하는 것이 좋습니다.
면책 조항 : 예,이 설명은 브라우저가 일반적으로 서버에 여러 개의 HTTP 연결을 병렬로 설정한다는 사실을 고려하지 않습니다. 그러나 브라우저가 동일한 호스트에 얼마나 많은 병렬 연결을 할 것인지에 대한 제한이 있으며 일반적으로 계속 유지하기에 충분할 정도로 작습니다.
Nginx는 양쪽에서 연결 유지를 지원합니다.