본문 바로가기
HTTP완벽 가이드

5. 웹 서버

by 벽돌1 2021. 3. 31.

다채로운 웹 서버

웹 서버는 Http요청을 처리하고 응답한다. 웹 서버 소프트웨어와 웹페이지 제공에 특화된 장비 양쪽 모두를 의미함.

 

웹 서버 구현

HTTP및 그와 관련된 TCP처리를 구현한 것. TCP 커넥션 관리에 대한 책임을 운영체제와 나눠 갖는다. 

 

다목적 소프트웨어 웹 서버

네트워크에 연결된 표준 컴퓨터 시스템에서 동작한다. 아파치, 마이크로소프트웹서버, nginx 등을 사용할 수 있다. 

 

임베디드 웹 서버

일반 소비자용 제품에 내장될 목적으로 만들어진 작은 웹서버

 

 

간단한 펄 웹서버

복잡하게 가려면 너무 얘기가 길어진다. 최소한으로 기능하는 HTTP서버라면 30줄 이하의 Perl코드르도 만들 수 있다.

flylib.com/books/en/1.2.1.48/1/

 

A Minimal Perl Web Server | HTTP: The Definitive Guide

flylib.com © 2008-2017. If you may any questions please contact us: flylib@qtcs.net

flylib.com

 

진짜 웹 서버가 하는 일

위의 perl 웹서버는 너무 간단하다. 실제 웹서버는 다음과 같은 일을 한다

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

클라이언트 커넥션 수락

새 커넥션 다루기

클라이언트가 웹 서버에 tcp커넥션 요청 -> 웹서버는 커텍션을 맺고 tcp 커넥션에서 ip주소를 추출하여 커넥션 맞은편에 어떤 클라이언트가 있는지 확인 -> 새 커넥션이 맺어지고 받아들여지면 서버는 새 커넥션을 커넥션 목록에 추가하고 커넥션에서 오가는 데이터를 지켜보기 위한 준비를 한다.

웹서버는 어떤 커넥션이든 거절하거나 닫을 수 있다.

클라이언트 호스트 명 식별

대부분의 웹 서버는 역방향DNS로 클라이언트의 ip주소를 호스트 명으로 변환하도록 설정되어 있다 구현이 아니라 아파치같은 단에서...? 로깅이나 접근 제어에 사용되지만 호스트 명 룩업hostname lookup은 시간이 걸리고 느림 그래서 대용량 웹 서버는 hostname resolution을 꺼둔다.

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

몇몇 웹 서버는 IETF ident 프로토콜을 지원한다. 얘는 서버에게 어떤 사용자 이름이 http 커넥션을 초기화했는지 찾아낼 수 있게 해준다. 이는 웹 서버 로깅에 유용하다. 일반적인 로그 포맷Common Log Format의 두번째 필드는 각 http요청의 ident사용자 이름을 담고 있다. 진짜...? 

 

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

고성능 웹 서버는 수천개의 커넥션을 동시에 열 수 있도록 지원한다. 어떻게 구성될까

단일 스레드 웹 서버 (a)

한 번에 하나씩 요청을 처리한다. node js

멀티프로세스와 멀티스레드 웹서버 (b)

여러 요청을 동시에 처리하기 위해 여러 개의 프로세스 혹은 고효율 스레드를 할당한다. 스레드/프로세스는 만들어놓을수도 있고 만들어질 수도 있다. 만들어 놓는 걸 worker pool이라고 하는데 수행할 작업을 pool에서 기다리기 때문에 요래 이름 지어졌댜.

다중 I/O서버 (c)

많은 웹 서버가 이 아키텍쳐를 채택했다. 모든 커넥션은 동시에 그 활동을 감시당한다. 커넥션 상태가 바뀌면 (에러 등) 커넥션에 대한 작은 양의 처리가 수행된다. 이 처리가 완료되면 커넥션은 다음번 상태 변경을 위해 열린 커넥션 목록으로 돌아간다. 어떤 커넥션에 대해 작업을 수행하는 건 그 커넥션이 실제로 해야 할 일이 있을 때뿐이다. 스레드/프로세스는 유휴 상태의 커넥션에 매여 기다리느라 리소스를 낭비하지 않는다. 먼말이고...

다중 멀티스레드 웹 서버 (d)

멀티 cpu이점을 살리기 위해 멀티스레딩과 다중화를 결합. 여거래의 스레드(보통 물리적)는 각각 열려있는 커넥션을 감시하고 각 커넥션을 작업

 

리소스의 매핑과 접근

Docroot

리소스 매핑의 가장 단순한 형태는 요청 URI를 웹 서버 파일 시스템 안의 파일 이름으로 사용하는 것. 이때 웹 서버가 찾아가는 root가 docroot다. 웹서버 설정에서 바꿀 수 있다.

가상 호스팅된 docroot

요청의 host헤더에 ㄷ따라서 docroot를 동적으로 매핑할 수도 있다. 

사용자 홈 디렉터리 docroots

사용자들이 한 대의 웹서버에서 각각 개인의 사이트를 만들 수 있도록 해주는 것.

GET /~bob/index.html

GET /~betty/index.html

이런식으로 ~ 다음에 유저 이름이 오면 개인 문서 루트를 가르킨다.

디렉터리 목록

ybm1234.tistory.com/index.html 이 아닌 ybm1234.tistory.com을 가르킨다면

  • 에러를 반환
  • 색인 파일을 반환
  • 디렉토리 탐색 후 그 내용을 담은 html페이지를 반환

대부분 index로 간다. 아파치에서는 DirectoryIndex 설정을 통해서 기본 디렉토리 파일로 사용될 파일 이름의 집합을 설정할 수 있다.

동적 콘텐츠 리소스 매핑

URI를 동적 리소스에 매핑할 수 있다. 요청에 맞게 콘텐츠를 생성하는 프로그램에 uri를 매핑하는 것. 아파치는 URI경로명이 실행 가능한 프로그램이 위치한 디렉토리로 매핑되도록 설정하는 기능이 있다.

ScriptAlis /cgi-bin/ /usr/local/etc/cgi-programs/

 

cgi-bin 로 http가 오면 cgi-programs를 실행하라는 것임

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

어떤 리소스가 서버사이드 인클루드를 포함하고 있는 것으로 설정되어 있다면 서버는 그 리소스의 콘텐츠를 클라이언트에게 보내기 전에 처리한다. 먼말...?

 

응답 만들기

MIME 타입 결정하기

응답 본문의 MIME타입을 결정해서 Content-Type에 서술해줘야 한다.

  • mime.types : 파일 이름의 확장자를 사용해서 mime타입을 나타냄
  • Magic typing : 아파치는 파일의 내용을 검사해서 알려진 패턴에 대한 테이블(매직 파일)에 해당하는 패턴이 있는지 찾는다. 느리지만 확장자가 없는 경우에 편하다
  • Explicit typing : 특정 파일/디렉토리 안의 파일들이 확장자/내용에 상관없이 특정 타입을 갖도록 설정
  • Type negotiation : 한 리소스가 여러 종류의 문서 형식에 속하도록 설정할 수 있다. 이때 협상 과정을 통해 mime타입을 결정한다

리다이렉션

  • 영구히 리소스가 옮겨진 경우
  • 임시로 리소스가 옮겨진 경우
  • URL 증강 : 303, 307 상태코드를 이용하며 문맥정보를 포함시키기 위해 요청이 도착하면 상태 정보를 내포한 새 url을 생성하고 리다이렉트 시킨다. 
  • 부하균형 : 과부하 된 서버가 요청을 받므녀 다른 서버로 분산시켜줌 303, 307
  • 친밀한 다른 서버가 있을 때 : 클라의 정보를 갖고 있는 다른 서버로 리다이렉트 307, 307
  • 디렉터리 이름 정규화 : 사용자가 오타로 url을 쳤다면 알아서 옮겨줌

응답 보내기

서버는 여러 클라이언트에 대한 많은 커넥션을 가질 수 있다. 커넥션 상태를 추적해 지속적인 커넥션은 주의해서 다룰 필요가 있다. 비지속적인 커넥션이라면 서버는 모든 메시지를 전송했을 때 자신 쪽의 커넥션을 닫는다. 지속적인 커넥션이라면 서버가 content-length헤더를 바르게 계산하기 위해 특별한 주의를 필요로 하는 경우나, 클라가 언제 끝나는지 알 수 없는 경우 커넥션은 열린 상태를 유지한다.

'HTTP완벽 가이드' 카테고리의 다른 글

3. HTTP 메시지  (0) 2021.03.17
2. URL과 리소스  (0) 2021.03.10
1장 HTTP 개관  (0) 2021.03.03