ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [HTTP 완벽 가이드] 5장. 웹 서버
    Engineering/Network 2021. 9. 26. 11:57
    반응형

    05. 웹 서버

    웹 서버가 하는 일

    단계 1: 클라이언트 커넥션 수락

    클라이언트가 이미 서버에 대해 열려있는 지속적 커넥션을 갖고 있다면, 클라이언트는 요청을 보내기 위해 그 커넥션을 사용할 수 있다.
    그렇지 않다면, 클라이언트는 서버에 대한 새 커넥션을 열 필요가 있다.

    새 커넥션 다루기

    • 클라이언트가 웹 서버에 TCP 커넥션을 요청하면, 웹 서버는 그 커넥션을 맺고 TCP 커넥션에서 IP 주소를 추출하여 커넥션 맞은편에 어떤 클라이언트가 있는지 확인한다.
    • 새 커넥션이 맺어지고 받아들여지면, 서버는 새 커넥션을 커넥션 목록에 추가하고 커넥션에서 오가는 데이터를 지켜보기 위한 준비를 한다.
    • 웹 서버는 어떤 커넥션이든 마음대로 거절하거나 즉시 닫을 수 있다.

    클라이언트 호스트 명 식별

    • 웹 서버는 클라이언트 호스트 명을 구체적인 접근 제어와 로깅을 위해 사용할 수 있다.
    • 호스트 명 룩업은 꽤 시간이 많이 걸릴 수 있기 때문에 웹 트랜잭션을 느려지게 할 수 있다.

    단계 2: 요청 메시지 수신

    커넥션에 데이터가 도착하면, 웹 서버는 네트워크 커넥션에서 그 데이터를 읽어 들이고 파싱하여 요청 메시지를 구성한다.

    • 웹 서버는 파싱해서 이해하는 것이 가능한 수준의 분량을 확보할 때까지 데이터를 네트워크로부터 읽어서 메시지 일부분을 메모리에 임시로 저장해 둘 필요가 있다.

    커넥션 입력/출력 처리 아키텍처

    • 단일 스레드 웹 서버
      • 한 번에 하나씩 요청을 처리한다.
      • 구현하기 간단하지만 처리 도중에 다른 커넥션은 무시되므로 심각한 성능 문제를 야기한다.
    • 멀티프로세스와 멀티스레드 웹 서버
      • 여러 요청을 동시에 처리하기 위해 여러 개의 프로세스 혹은 고효율 스레드를 할당한다.
      • 스레드/프로세스는 필요에 따라 만들어질 수도 있고, 미리 만들어 둘 수도 있다.
      • 수 많은 커넥션을 동시에 처리할 떄는 너무 많은 프로세스나 스레드가 메모리나 시스템 리소스를 소비하지 않도록 최대 개수에 제한을 두어야 한다.
    • 다중 I/O 서버
      • 대량의 커넥션을 지원하기 위해, 많은 웹 서버가 다중 아키텍처를 채택함.
      • 모든 커넥션을 동시에 감시하며, 커넥션의 상태가 바뀌면, 그 커넥션에 대한 처리가 수행된다.
      • 커넥션이 처리되면 다음번 상태 변경을 위해 열린 커넥션 목록으로 돌아간다.
      • 스레드와 프로세스는 유휴 상태의 커넥션에 매여 기다리느라 리소스를 낭비하지 않는다.
    • 다중 멀티스레드 웹 서버
      • 여러 개의 스레드는 각각 열려있는 커넥션을 감시하고 각 커넥션에 대해 작업을 수행한다.

    단계 3: 요청 처리

    웹 서버가 요청을 받으면, 서버는 요청으로부터 메서드, 리소스, 헤더, 본문을 얻어내어 처리한다.

    단계 4: 리소스의 매핑과 접근

    요청 메시지의 URI에 대응하는 콘텐츠를 식별한다.

    단계 5: 응답 만들기

    서버가 리소스를 식별하면, 서버는 요청 메서드로 서술되는 동작을 수행한 뒤 응답 메시지를 반환한다.

    응답 엔티티

    응답 본문이 있다면, 응답 메시지는 주로 다음을 포함한다.

    • 응답 본문의 MIME 타입을 서술하는 Content-Type 헤더
    • 응답 본문의 길이를 서술하는 Content-Length 헤더
    • 실제 응답 본문 내용

    리다이렉션

    웹 서버에서 성공 메시지 대신 리다이렉션 응답을 반환할 때도 있다. 리다이렉션 응답은 3XX 상태 코드로 지칭된다.
    Location 응답 헤더는 콘텐츠의 새로운 혹은 선호하는 위치에 대한 URI를 포함한다.

    단계 6: 응답 보내기

    서버는 커넥션 상태를 추적해야 하며 지속적인 커넥션은 특별히 주의해서 다룰 필요가 있다. 비지속적인 커넥션이라면 모든 메시지를 전송한 후에
    커넥션을 닫을 것이다. 지속적인 커넥션이라면 서버가 Content-Length 헤더를 바르게 계산하기 위해 특별한 주의를 필요로 하는 경우나,
    클라이언트가 응답이 언제 끝나는지 알 수 없는 경우에 커넥션은 열린 상태를 유지할 것이다.

    단계 7: 로깅

    트랜잭션이 완료되었을 때, 웹 서버는 트랜잭션이 어떻게 수행되었는지에 대한 로그를 로그 파일에 기록한다.


    참고자료

    HTTP 완벽 가이드

    반응형

    댓글

Designed by Tistory.