웹 서버는 무엇을 하는가
웹 서버는 다음과 같은 일을 수행한다.
1. 커넥션을 맺는다.
2. 요청을 받는다.
3. 요청을 처리한다.
4. 리소스에 접근한다.
5. 응답을 만든다.
6. 응답을 보낸다.
7. 트랜잭션을 로그에 남긴다.
이러한 단계가 어떻게 수행되는지 살펴보자
1. 클라이언트 커넥션 수락
클라이언트가 웹 서버에 TCP 커넥션을 요청하면 커넥션을 연결하고 서버는 커넥션 목록에 추가한다.
이후에 요청과 응답을 하는데 있어 웹서버는 마음대로 거절하거나 커넥션을 즉시 닫을 수 있다.
웹 서버는 연결된 클라이언트를 식별하기 위해서 역방향 DNS를 사용해서 클라이언트의 IP 주소를 호스트 명으로 변환하여 사용한다. 이것은 꽤 많은 시간이 걸려 트랙잭션을 느려지게 할 여지가 있다.
아파치에서는 클라이언트 호스트 설정으로 HostnameLookups 설정 지시자로 호스트 명 룩업을 설정 할 수 있다.
이 방법 외에 ident를 이용하여 클라이언트 사용자를 알아내는 방법이 있다.
ident는 프로토콜이다. 그렇기 때문에 클라이언트는 HTTP 연결을 서버와 한 후에 서버는 클라이언트에 ident 서버 포트를 향해 연다. 하지만 안전하지 않고 클라이언트가 ident를 설치해야 한다는 점에서 서비스에는 사용되지 않는다.
2. 요청 메시지 수신
요청 메시지는 서버가 파싱하여 이해할 수 있도록 CRLF와 위치에 맞는 문자열들로 구성되어 진다.
만약 서버가 이해할수 없다면 언제라도 무효화 할 수도 있고, 많은 양의 메세지가 들어온다면 이해 할 수 있는 분량 만큼만 읽을 수 있다.
이렇게 요청된 메시지를 몇몇 서버들은 쉽게 다룰 수 있도록 다음과 같이 내부의 자료구조에 저장한다.
이를 통해서 각 필드에 접근하는데 있어 헤더는 속도가 빠른 룩업 테이블에 저장되어 신속하게 접근 할 수 있따.
3. 요청 메시지 처리
요청 메시지를 받아 파싱을 하게 되면 메서드, 리소스, 헤더, 본문을 얻어 처리한다.
4. 리소스의 매핑과 접근
웹 서버가 어떻게 컴퓨터의 디렉토리에 있는 리소스들을 클라이언트에게 찾아 주는가에 대한 이야기이다.
Docroot
DocumentRoot의 약자이다. 아파치 서버를 이용하면 알겠지만 htttpd/files 안에 파일을 넣어야만 웹 서버의 리소스에 접근 할 수 있었다.
아파치의 경우에는 httpd.config를 설정하여 docroot를 설정 해줄 수 있다.
가상 호스팅된 Docroot
하나의 서버에 여러 네임서버마다 Docroot를 지정해 줄 수도 있다.
이를 가상 서버라고 하며 다음과 같이 설정해 줄 수 있다고 한다.
사용자 홈 디렉터리 docroots
URL에서 /~유저명/ 과 같은 규칙을 통해서 유저마다 docroots를 정하는 경우도 있다.
디렉토리 목록
만약 파일이 아닌 디렉토리를 요청했다면 다음과 같은 응답을 한다.
1. 에러를 반환한다.
2. 디렉터리 대신 특별한 '색인 파일'을 반환한다.
3. 디렉터리를 탐색해서 그 내용을 담은 HTML 페이지를 반환한다.
아파치와 같은 대부분의 웹페이지들은 3번을 우선적으로 실행하고 이후 2, 1순으로 진행한다.
색인파일 경우 아파치에서 다음과 같이 설정한다.
Options - Indexes
동적 컨텐츠 리소스 매핑
요청에 따라 파일을 만들고 그 파일을 리소스 매핑하는 경우도 있을 수 있다. 이 경우에 작성된 동적 콘텐츠 생성 프로그램이 어디 있고, 어떻게 실행하는지 알려 줄 수 있어야 한다.
아파치의 경우 URI 경로가 /cgi-bin/으로 시작할 경우 프로그램을 실행하라는 의미로 받아들인다.
접근 제어
보안이나 인증과 관련해서 리소스에 대해 접근을 제어 하는 경우가 있을 수 있다.
5. 응답 만들기
요청을 처리 했다면 (성공이던 실패던) 거기에 대한 응답 메시지를 만든다.
성공했을 경우에는 응답에 본문이 생성될 것인데
1. MIMIE타입을 서술하는 Content-Type 헤더
2. Content의 길이를 나타내는 Content-Length헤더
3. 실제 응답 본문의 내용
이 담겨진다. 이를 응답 엔터티라 부른다.
MIME 타입은 설정을 하는 경우도 있지만, 서버에서 확장자나 매직 타이핑, 유형 명시와 같은 기능들을 활용해서 파일들을 분석하여 MIME를 결정한다.
가끔은 응답 대신 리다이렉션을 반환 하기도 한다.
말 그대로 다른 요청을 다시 해보라는 건데 영구적인 것과 임시적인 것으로 크게 나뉜다.
영구적인것은 301 상태코드를 리턴하며 클라이언트에게 아예 다음부터 주소를 바꾸라고 응답한다
잉시적인것은 303과 307 상태코드를 리턴하는데, 서버에 부하가 일어 난다거나 다른 서버와 공유하고 있다거나, 임시로 리소스의 이동이 있을때 이와 같은 정보를 클라이언트에게 반환한다.
6. 응답 보내기
웹 서버가 커넥션을 통해 응답을 보낸다.
7. 로깅
트랜잭션이 완료되고 웹서버가 트랜잭션이 어떻게 수행되었는지에 대한 결과를 로그파일에 기록한다. 웹 서버는 대부분 이 로그를 어떻게 작성할 것인지 설정 양식을 제공한다