✊ 필오의 개발일지
Back to Posts
2019년 9월 7일

웹 서버

웹 서버

웹 서버가 하는 일

  1. 운영체제는
  1. 웹 서버는

node.js로 간단 웹서버를 구현해 보았다. % github feel5ny httpStudy 37558bf54d1222ef6413274b392c7318c0c60bd5%

공통적으로는 아래 그림에서 하는 일을 한다.

  1. 커넥션을 맺는다.
  1. 요청을 받는다.
  1. 요청을 처리한다.
  1. 리소스에 접근한다.
  1. 응답을 만든다.
  1. 응답을 보낸다.
  1. 트랜잭션을 로그로 남긴다.

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

1.1 새 커넥션 다루기

1.2 클라이언트 호스트명 식별

1.3 ident를 통해 클라이언트 사용자 알아내기

ident protocol - wiki 

아래는 어떻게 ident 프로토콜이 동작하는지 보여준다.

공공 인터넷에서는 다음과 같은 이유로 잘 동작하지 않는다.


2. 요청 메세지 수신

요청 메세지를 파싱할 때, 웹서버는 다음과 같은 일을 한다.

2.1 메세지의 내부 표현

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

웹 서버는 아키텍처의 차이에 따라 요청을 처리하는 방식도 달라진다.

2.2.1 단일 스레드 웹서버

2.2.2 멀티스레드와 멀티스레드 웹서버

2.2.3 다중 I/O

2.2.4 다중 멀티스레드 웹서버


3. 요청 처리

4. 리소스의 매핑과 접근

4.1 Docroot

httpd.conf 설정 파일에 docroot 경로를 설정해두면 요청 헤더의 URI를 문서 루트 뒤에 붙인다.

GET /specials/joy.gif HTTP/1.0 HOST: feel5ny.github.io
DocumentRoot /usr/local/httpd/files

/usr/local/httpd/files + /specials/joy.gif

https://feel5ny.github.io/.../

4.1.1 가상 호스팅 된 docroot

4.1.2 사용자 홈 디렉터리 docroots

4.2 디렉터리 목록

4.3 동적 콘텐츠 리소스 매핑

4.4 서버사이드 인클루드 Server-Side Includes, SSI

4.5 접근 제어


5. 응답 만들기

5.1 응답 엔터티

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

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

5.2 MIME 타입 결정하기

웹 서버에게는 응답 본문의 MIME타입을 결정해야하는 책임이 있다. MIME타입과 리소스를 연결하는 여러 가지 방법이다.

5.2.1 mime.types

5.2.2 매직 타이핑 Magic typing

매직 넘버. 다른 종류의 파일의 문법은 구조 상 보여지는 타입을 결정하는 데 도움을 줍니다. 예를 들어, 각 GIF 파일들은 47 49 46 38 16진수 값 [GIF89]로 시작되며 PNG 파일의 경우 89 50 4E 47 [.PNG]로 시작됩니다. 파일의 모든 타입들이 이런 매직 넘버를 가지고 있는 것은 아니므로 100% 신뢰할 만한 시스템은 아니기도 합니다. 출처 

5.2.3 유형 명시 Explicit typing

5.2.4 유형 협상 Type negotiation

관련내용 

5.3 리다이렉션

  1. 영구히 리소스가 옮겨진 경우 - 301
  2. 임시로 리소스가 옮겨진 경우 - 303, 307
  3. URL 증강 - 303, 307
  4. 부하 균형 - 303, 307
  5. 친밀한 다른 서버가 있을 때 - 303, 307
  6. 디렉터리 이름 정규화

5.3.1 영구히 리소스가 옮겨진 경우

5.3.2 임시로 리소스가 옮겨진 경우

5.3.3 URL 증강

5.3.4 부하 균형

5.3.5 친밀한 다른 서버가 있을 때

5.3.6 디렉터리 이름 정규화


6. 응답 보내기


7. 로깅





참고자료

  1. 컨텐츠 협상 
  2. ident protocol - wiki 
  3. 확장자별 mime타입 - mdn 
  4. 매직넘버 - mdn 
Previous한글은 노토산스, 영문/숫자는 다른 폰트로 해주세요...👀 (feat. unicode)
Next커넥션 관리 - TCP 커넥션의 종류

Related

© 2025 Felix