4. 진짜 웹 서버가 하는 일
1. Set up connection
- 클라이언트의 접속을 받아들이거나, 닫는다.
2. Receive request
- HTTP요청 메시지를 네트워크로 부터 읽어들인다.
3. Process request
- 요청 메시지를 해석하고 그에 따른 작업을 한다.
4. Access resource
- 메시지에서 지정한 리소스에 접근한다.
5. 진짜 웹 서버가 하는 일
5. Construct response
- 헤더를 포함한 HTTP 응답 메시지를 생성
6. Send response
- 응답을 클라이언트에게 돌려준다.
7. Log transaction
- 로그파일에 트렌잭션 완료에 대한 기록을 남긴다.
6.
7. Step1 : 클라이언트 커넥션 수락
- 새 커넥션 다루기
클라이언트가 웹 서버에 TCP커넥션 요청
웹 서버는 TCP커넥션에서 IP를 체크 후, 인가 기능 제공
- 클라이언트 호스트 명 식별
웹 서버는 reverse DNS를 사용, 접근 제어와 로깅 기능 제공
하지만 성능상의 문제로 1.3에서 기본으로 off
9. - ident를 통해 클라이언트 알아보기
서버가 identd서버 포트(113)으로 정보 요청, 클라이언트는 클라이언트 정보를
돌려줌.
하지만 공공인터넷에서는 보안과, 트랜잭션 문제로 제한적인 사용.
Step1 : 클라이언트 커넥션 수락
10. 요청 메세지 파싱 방법
- 요청 메서드, 리소스 식별자(URI), 버전번호를 찾는다.
각 값은 한 개의 스페이스로 분리, 끝은 CRLF
- 메시지 헤더들을 읽는다. 끝은 CRLF
- 요청 본문이 있다면, Content-Length만큼 읽어 들인다.
Step2 : 요청 메시지 수신
11. 커넥션 입력/출력 처리 아케텍처
고성능 웹 서버는 수천 개의 커넥션을 동시지원
웹 서버의 아키텍처에 따라 요청을 처리하는 방식도 달라짐
Step2 : 요청 메시지 수신
12.
13. - 한 번에 하나씩 요청을 처리합니다.
- 트랜잭션이 완료되면, 다음 트랜잭션 처리
- 처리 도중에 모든 다른 커넥션이 무시 되기 때문에,
로드가 적은 서버에서 사용
단일 스레드 웹 서버
14. - 요청을 처리하기 위해, 여러개의 프로세스 혹은 고효율 스레드 할당.
- 단일 스레드 보다 많은 커넥션을 동시에 처리 가능
- 스레드/프로세스는 요청시 생성하거나, worker pool에서 사용
- 많은 요청으로 인한 메모리,시스템 리소스 소비가 이어진다.
그래서 스레드/프로세스 최대 생성 개수 제한을 둠
멀티프로세스와 멀티스레드 웹 서버
15. - 대량의 커넥션을 지원하기 위해 사용됨
- 모든 커넥션을 모니터링, 커넥션에 상태가 바뀌면 해당 커넥션 처리
- 스레드와, 프로세스는 유휴(idle) 상태의 커넥션에
매어있지 않아도 됨.
다중 I/O서버
16. - 여러개의 CPU의 이점을 살리기 위해, 멀티스레딩과 다중화를 결합한 모델
- 여러개의 스레드가 각각 열려있는 커넥션을 감시하고
변화가 있을때 커넥션에 대한 작업을 수행
다중 멀티스레드 웹 서버
17. Step3 : 요청처리
- 웹 서버가 요청을 받으면, 서버는 요청으로 부터 메서드, 리소스, 헤더, 본문
을
얻어서 요청을 처리한다.
- 메서드에 따라, 본문필요 여부 다름
- 이후 책의 나머지 챕터에서 다룸
18. Step4 : 리소스의 매핑과 접근
- 웹 서버는 리소스 서버
- 정적 파일(HTML, JPEG, JS), 동적 컨텐츠 제공
- URI에 매핑되는 리소스 식별 방법 제공
- Docroot(DocumentRoot)
- VirtualHost
- Directory Index
- 접근제어
21. DirectoryIndex
- 웹 서버는, 파일이름이 아닌 디렉토리 URL에 대한 요청을 받을 수 있다.
- 대부분의 웹 서버는 아래와 같이 처리
- 에러를 반환
- 디렉터리 대신 ‘색인 파일' 반환
- 디렉터리를 탐색, 내용을 담음 HTML반환
- 불필요한 파일 노출을 야기
22. Step5 : 응답 만들기
- 응답 메시지는 응답상태코드, 응답 헤더, 응답 본문(선택)으로 구성
- 응답 본문이 있다면, 응답 메시지는 다음을 포함한다.
- MIME타입을 서술하는 Content-Type헤더
- 길이를 서술하는 Content-Length헤더
- 실제 응답 본문의 내용
- 리다이렉션
23. MIME 타입 결정하기
웹 서버에게는 응답 본문의 MIME타입을 결정해야하는 책임이 있다.
- Mime.types
- 매직 타이핑(Magic typing)
- 유형 명시(Explicit typing)
- 유형 협상(Type negotiation)
24.
25. Step6 : 응답 보내기
- 전송과 응답도 커넥션 관리가 핵심
- nonpersistent(비지속) 커넥션
- 메세지 전송 후 커덱션을 닫기
- persistent(지속) 커넥션이라면
- 서버가 Content-Length헤더를 바르게 계산하기 위해 커넥션을 유지
- 클라이언트가 응답이 언제 끝나는지 알 수 없을경우 커넥션을 유지