웹 서버가 트랜잭션 요청을 받을 때 일어나는 일

IKNOW·2024년 1월 9일
0

모든 웹 서버는 리소스에 대한 HTTP 요청을 받아서 컨텐츠를 클라이언트에게 돌려준다.

  1. 클라이언트 커넥션 수락

    클라이언트가 이미 서버에 대해 지속 커넥션을 갖고 있다면, 그 커넥션을 사용할 수 있지만 커넥션이 없다면, 새 커넥션을 맺어야 한다.

    클라이언트가 웹 서버에 TCP 커넥션을 요청하면, 웹 서버는 그 커넥션을 맺고 TCP 커넥션에서 IP를 추출하여 클라이언트를 확인한다. 커넥션이 맺어지면, 서버는 커넥션을 커넥션 목록에 추가하고 커넥션에서 오가는 데이터를 지켜본다.

    웹 서버는 reverse DNS를 사용하여 클라이언트의 IP주소를 클라이언트의 호스트 명으로 변환한다.

    웹서버는 클라이언트 호스트 명을 구체적인 접근 제어와 로깅을 위해 사용한다. 호스트 명을 찾는 것은 시간이 걸릴수 있는 작업이기 때문에 웹 트랜잭션을 느려지게 할 수 있다. (많은 웹 서버는 호스트명 분석을 끄거나 특정 컨텐츠에 대해서만 켜놓는다고 한다.)

  2. 요청 메시지 수신

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

  • 웹서버는 요청줄을 파싱하여 요청 메서드, URI, 버전 번호를 찾는다. 각 값은 공백문자로 분리되어 있으며, 요청줄은 캐리지 리턴 문자열(CRLF)로 끝난다.

  • 메시지 헤더를 읽는다 각 메시지 헤더는 CRLF로 끝난다.

  • 헤더의 끝을 의미하는 CRLF로 끝나는 빈 줄을 찾는다.

  • 요청 본문이 있다면 읽는다.

    웹 서버는 입력데이터를 불규칙적으로 받고, 네트워크 커넥션은 언제라도 끊어질 수 있기 때문에, 파싱해서 이해하는 것이 가능한 수준의 분량을 확보할 때까지 데이터를 네트워크로부터 읽어서 메시지를 임시로 저장할 필요가 있다.

    웹 서버는 요청메시지를 내부의 자료구조에 저장한다. 해당 자료구조는 요청 메시지의 각 조각에 대한 포인터와 길이를 담을 수 있어야 하고, 헤더는 룩업 테이블에 저장되어 필드에 신속하게 접근할수 있게 해야한다.

    웹 서버와 연결된 수많은 커넥션들은 웹서버로 수많은 요청을 보내고 있기 때문에, 웹 서버들은 항상 새 요청을 주시하고 있다. 다만 웹 서버는 아키텍처에 따라 많은 요청을 처리하는 방식이 달라진다.

    단일 스레드 웹 서버

    단일 스레드 웹서버는 하나에 한 요청을 처리하고 트랜잭션이 완료되면, 다음 커넥션이 처리된다. 구현은 간단하지만 트랜잭션을 처리하는 동중 다른 커넥션이 무시되기 때문에 성능 문제가 발생한다.

    멀티 프로세스/멀티 스레드 웹서버

    멀티 프로세스/멀티 스레드 웹 서버는 여러 요청을 동시에 처리하기 위해 여러개의 프로세스 혹은 고 효율 스레드를 할당한다. 스레드/프로세스는 필요할 때마다 만들어 질수도 있고, 미리 만들어 놓을 수도 있다.너무 많은 프로세스/스레드는 너무 많은 메모리나 시스템 리소스를 소비하기 때문에 많은 멀티스레드 웹 서비스는 스레드/프로세스의 갯수에 제한을 건다.

    다중 I/O 서버

    다중 아키텍처에서, 모든 커넥션은 그 활동을 감시당한다. 특정 커넥션의 상태가 바뀌면, 그 커넥션에 대해 작업이 수행되며, 해당 커넥션은 열린 커넥션 목록으로 돌아간다. 실제로 해야 할 일이 있을 때만 특정 커넥션에 대해 작업을 수행한다. 다중 아키텍처에서 스레드와 프로세스는 유휴 상태의 커넥션에 매여 기다리느라 리소스를 낭비하지 않는다.

    다중 멀티스레드 웹 서버

    다중 멀티스레드 웹서버에서는 다중 코어 CPU의 이점을 살릴수 있으며 한 CPU 코어에 묶여있는 커넥션을 감시하고 상태가 변한 커넥션에 대해 작업을 수행한다.

  1. 요청 처리

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

  2. 리소스의 매핑과 접근

    웹서버는 궁극적으로 리소스 서버이다. HTML문서나 JPEG같은 이미지를 컨텐츠로 제공한다.

    Docroot

    웹서버는 여러 종류의 리소스 매핑을 지원하는데 가장 단순한 형태는 요청 URI를 웹 서버의 파일 시스템 안에 있는 파일 이름으로 사용하는 것이다. 일반적으로 웹서버 파일시스템의 특별한 폴더를 웹 컨텐츠를 위해 예약해 두는데 이 폴더를 Docroot라고 한다.

    디렉토리

    웹 서버는 경로가 아닌 파일이 아닌 디렉토리를 가리키는 디렉토리 URL에 대한 요청을 받을 수 있다. 웹 서버는 디렉토리 URL을 요청 받았을 때, 에러를 반환하거나, 색인 파일을 반환하거나, HTML페이지를 반환한다.

    웹 서버는 URL에 해당하는 디렉토리 안에서 index.html으로 이름 붙은 문서를 찾고 해당 디렉토리가 index.html을 갖고 있다면 서버는 해당 컨텐츠를 반환한다.

    동적 컨텐츠 리소스 매핑

    웹서버는 요청에 맞게 컨텐츠를 생성하는 프로그램에 URI를 매핑할 수 있다. 애플리케이션 서버는 웹 서버를 백엔드 애플리케이션과 연결하고. 어떤 리소스가 동적 리소스라면, 애플리케이션 서버는 그에 대한 동적 컨텐츠 생성 프로그램이 어디에 있는지, 어떻게 그 프로그램을 실행하는 지 알려준다.

  3. 응답 만들기

    응답 메시지는 상태 코드, 응답 헤더, 본문을 포함한다.

    만약 트랜잭션이 응답 본문을 생성하면, 그 내용을 응답 메시지와 함께 돌려보내고 응답 메시지는 Content-Type 헤더와 Content-length 헤더, 응답 본문을 포함한다.

    리다이렉션

    웹 서버는 성공 메시지 대신 요청을 수행하기 위해 브라우저가 다른 곳으로 가도록 300번대 상태코드로 지칭되는 리다이렉션 응답을 반환하는 경우가 존재한다. 리다이렉트는 영구히 리소스가 옮겨진 경우(301), 임시로 리소스가 옮겨진 경우(303, 307). 문맥 정보를 포함시키기 위해(303, 307), 로드밸런싱을 위해 -과부화된 서버가 요청 받은 경우, 부하가 적은 서버로 리다이렉션한다-(303, 307)…

  4. 응답 보내기

    웹 서버는 받을 때와 마찬가지로 여러 클라이언트에 대한 많은 커넥션을 갖을 수 있다.버서는 커넥션 상태를 추적하고 있어야 하며, 지속 커넥션이라면, 커넥션은 열린 상태를 지속하고, 만약 비 지속적인 커넥션이라면 서버가 응답을 전송한 이후 커넥션을 닫을 것이다.

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

profile
조금씩,하지만,자주

0개의 댓글

관련 채용 정보