웹 서버는 HTTP 요청 처리, 응답 제공
오픈 소스 소프트웨어 or 마이크로소프트나 아이플래닛의 웹 서버 같은 상용 소프트웨어 사용 가능
역방향 DNS를 사용해 클라이언트의 IP 주소를 클라이언트의 호스트 명으로 변환하도록 설정되어 있음호스트명 룩업은 시간이 많이 걸려 웹 트랜잭션을 느려지게 할 수 있어 많은 대용량 웹 서버는 호스트 명 분석을 꺼두거나 특정 콘텐츠에 대해서만 켜놓음ident 프로토콜: 서버에게 어떤 사용자 이름이 HTTP 커넥션을 초기화했는지 찾아낼 수 있게 해줌
찾아낸 정보는 웹 서버 로깅에서 유용하기 때문에, 일반 로그 포맷의 두 번째 필드는 각 HTTP 요청의 ident 사용자 이름을 담고 있음
클라이언트가 ident 프로토콜 지원한다면 클라이언트는 ident 결과를 위해 TCP 포트 113번 listen

ident는 조직 내부에서는 잘 사용할 수 있지만, 공공 인터넷에서는 여러 이유로 동작하지 않음
아파치의 경우 IdentityCheck를 통해 ident 룩업을 사용할 수 있음
커넥션에 데이터가 도착하면 웹 서버는 네트워크 커넥션에서 그 데이터를 읽어 들이고 파싱하여 요청 메시지 구성
요청 메시지를 파싱할 때
요청 메서드, URI, 버전 번호 찾음웹 서버는 입력 데이터를 네트워크로부터 불규칙적으로 받기에
파싱해서 이해할 수 있는 수준의 분량을 확보할 때까지 메모리에 임시 저장해 둘 필요가 있음
고성능 웹 서버는 수천 개의 커넥션을 동시에 열 수 있도록 지원
항상 언제 들어올지 모르는 새 요청을 주시하고 있음

여러 요청을 동시에 처리하기 위해 여러 개의 프로세스 혹은 고효율 스레드를 할당
대량의 커넥션을 지원하기 위해 많은 웹 서버는 다중 아키텍처 채택
다중 아키텍처는
웹 서버가 요청 받으면, 서버는 요청으로부터 메서드, 리소스, 헤더, 본문을 얻어내어 처리
POST를 비로산 몇몇 메서드는 본문 요구GET은 본문 금지OPTIONS와 같은 메서드는 본문을 허용하되 요구하지는 않음웹 서버는
웹 서버는 여러 종류의 리소스 매핑 지원
리소스 매핑의 가장 단순한 형태는 요청 URI를 웹 서버의 파일 시스템 안에 있는 파일 이름으로 사용하는 것
docroot라는 폴더를 웹 컨텐츠를 위해 예약해 사용
/specials/saw-blade.gif에 대한 요청 도착/usr/local/httpd/files 갖고 있음/user/local/httpd/files/specials/saw-blade.gif 파일 반환아파치의 경우 httpd.conf 설정 파일에 DocumentRoot 추가해 설정 가능
DocumentRoot /usr/local/httpd/files
서버는 상대적인 url이 docroot를 벗어나 파일 시스템의 docroot 이외 부분이 노출되는 일이 생기지 않도록 주의해야 함
가상 호스팅 웹 서버는
한 웹 서버에 여러 개의 웹 사이트를 호스팅
가상으로 호스팅 되는 docroot 설정은 대부분의 웹 서버에서 간단
아파치 웹 서버에서는 각 가상의 웹 사이트의 VirtualHost 블록이 가상 서버에 대한 DocumentRoot 지시자를 포함하도록 설정해야 함

docroot의 또 다른 대표적인 활동은 사용자들이 한 대의 웹 서버에서 각자의 개인 웹 사이트를 만들수 잇도록 해주는 것
/와 ~ 다음에 사용자 이름이 오는 것으로시작하는 URI는 그 사용자의 개인 문서 루트를 가리킴웹 서버에 디렉터리 URL에 대한 요청을 했을 시 웹 서버가 할 수 있는 응답
대부분의 웹 서버는 요청한 URL에 대응되는 디렉터리 안에서 index.html or index.htm으로 이름 붙은 파일을 찾음
만약 사용자가 어떤 디렉터리에 대한 URL을 요청했는데, 그 디렉터리가 index.html or index.htm이란 이름의 파일을 가지고 있다면 그 파일의 콘텐츠를 반환할 것
아파치 웹 서버에서 DirectoryIndex 설정 지시자를 사용해 기본 디렉터리 파일로 사용될 파일 이름의 집합을 설정할 수 있음
DirectoryIndex 지시자는 디렉터리 색인 파일로 사용될 모든 파일의 이름을 우선순위로 나열
사용자가 디렉터리 URI를 요청했을 때 기본 색인 파일이 없고 디렉터리 색인 기능이 꺼져 있지 않다면, 웹 서버는 자동으로 그 디렉터리의 파일들을 크기, 변경일 및 그 파일에 대한 링크와 함께 열거한 HTML 파일 반환
파일 열거는 편리하지만, 일반적으로 발견할 수 없는 파일도 드러나게 된다는 단점 있음
웹 서버는 URI를 동적 리소스에 매핑할 수도 있음
(= 요청에 맞게 콘텐츠를 생성하는 프로그램에 URI를 매핑하는 것)
웹 서버들 중 애플리케이션 서버라고 불리는 것은 웹 서버를 복잡한 백엔드 애플리케이션과 연결하는 일을 함
아파치는 URI의 경로명이 실행 가능한 프로그램이 위치한 디렉터리로 매핑되도록 설정하는 기능 제공
서버가 실행 가능한 경로명을 포함한 URI로 요청 받으면, 그 경로에 대응하는 디렉터리에서 프로그램을 찾아 실행하려고 시도
# 해당 아파치 설정 지시자는
# URI 경로가 /cgi-bin/로 시작한다면
# /usr/local/etc/httpd/cgi-programs/에서 프로그램을 찾아 실행하라는 의미
ScriptAlias /cgi-bin/ /usr/local/etc/httpd/cgi-programs/
아파치에서는 특정 확장자의 파일만 실행하도록 설정할 수도 있음
# 해당 아파치 설정 지시자는
# .cgi로 끝나는 모든 웹 리소스는 실행되어야 함을 명시
AddHandler cgi-script .cgi
어떤 리소스가 서버사이드 인클루드를 포함하고 있는 것으로 설정되어 있다면,
서버는 그 리소스의 콘텐츠를 클라이언트에게 보내기 전에 처리
서버는 콘텐츠에 변수 이름이나 내장된 스크립트가 될 수 있는 어떤 특별한 패턴이 있는지 검사 받음
특별한 패턴은 변수 값이나 실행 가능한 스크립트의 출력 값으로 치환 => 동적 콘텐츠를 만드는 쉬운 방법
웹 서버는 각각의 리소스에 접근 제어 할당할 수 있음
접근 제어되는 리소스에 대한 요청이 도착했을 때, 웹 서버는 클라이언트의 IP 주소에 근거해 접근을 제어할 수 있고, 리소스에 접근하기 위한 비밀번호를 물어볼 수 있음
한 번 서버가 리소스를 식별하면
서버는 요청 메서드로 서술되는 동작을 수행한 뒤, 응답 메시지 반환
응답 메시지는 응답 상태 코드, 응답 헤더, 응답 본문(생성 시)을 포함
트랜잭션이 응답 본문을 생성한다면 그 내용을 응답 메시지와 함께 돌려 보냄
만약 본문이 있다면 응답 메시지는 다음을 포함
Content-Type 헤더Content-Length 헤더웹 서버에게는 응답 본문의 MIME 타입을 결정해야 하는 책임 있음
MIME 타입과 리소스를 연결하는 여러가지 방법
mime.types
Magic typing유형 명시(Explicit typing)유형 협상(Type negotiation)리다이렉션은 다음의 경우에 유용