웹 서버는 HTTP 프로토콜을 구현하고, 웹 리소스를 관리하고, 웹 서버 관리 기능을 제공합니다. 웹 서버는 TCP 커넥션 관리에 대한 책임을 운영체제와 나눠 갖습니다. 운영체제는 컴퓨터 시스템의 하드웨어를 관리하고 TCP/IP 네트워크 지원, 웹 리소스를 유지하기 위한 파일 시스템, 현재 연산 활동을 제어하기 위한 프로세스 관리를 제공합니다. 웹 서버는 여러 가지 형태가 가능합니다.
클라이언트가 이미 서버에 대해 열려있는 지속적 커넥션을 갖고 있다면, 클라이언트는 요청을 보내기 위해 그 커넥션을 사용할 수 있습니다. 그렇지 않다면, 클라이언트는 서버에 대한 새 커넥션을 열 필요가 있습니다.
대부분의 웹 서버는 역방향 DNS(Revers DNS)를 사용해서 클라이언트의 IP 주소를 클라이언트 호스트 명으로 변환하도록 설정되어 있습니다. 웹 서버는 클라이언트 호스트 명을 구체적인 접근 제어와 로깅을 위해 사용할 수 있습니다. 호스트 명 룩업(Hostname Lookup)은, 꽤 시간이 많이 걸릴 수 있어 웹 트랜잭션을 느려지게 할 수 있습니다. 따라서 많은 대용량 웹 서버는 호스트 명 분석(Hostname Resolution)을 꺼두거나 특정 콘텐츠에 대해서만 켜놓습니다.
몇몇 웹 서버는 또한 IETF ident 프로토콜을 지원합니다. ident 프로토콜은 서버에게 어떤 사용자 이름이 HTTP 커넥션을 초기화했는지 찾아낼 수 있게 해줍니다. 이 정보는 특히 웹 서버 로깅에서 유용하기 때문에, 널리 쓰이는 일반 로그 포맷(Common Log Format)의 두 번째 필드는 각 HTTP 요청의 ident 사용자 이름을 담고 있습니다. ident는 조직 내부에서는 잘 사용할 수 있지만, 공공 인터넷에서는 트랜잭션 시간과 보안 등을 이유로 잘 동작하지 않습니다.
커넥션에 데이터가 도착하면, 웹 서버는 네트워크 커넥션에서 그 데이터를 읽어 들이고 파싱하여 요청 메시지를 구성합니다.
웹 서버가 요청을 받으면, 서버는 요청으로부터 메서드, 리소스, 헤더, 본문을 얻어내어 처리합니다.
웹 서버는 HTML 페이지나 JPEG 이미지 같은 미리 만들어진 콘텐츠를 제공하며, 마찬가지로 서버 위에서 동작하는 리소스 생성 애플리케이션을 통해 만들어진 동적 콘텐츠도 제공합니다.
일반적으로 웹 서버 파일 시스템의 특별한 폴더를 웹 콘텐츠를 위해 예약해 둡니다. 이 폴더는 문서 루트 혹은 docroot로 불립니다. 웹 서버는요청 메시지에서 URI를 가져와서 문서 루트 뒤에 붙입니다. 서버는 상대적인 url이 docroot를 벗어나서 파일 시스템의 docroot 이외 부분이 노출되는 일이 생기지 않도록 주의해야 합니다.
docroot: /usr/local/httpd/filles
요청 URL: /specials/saw-blade.gif
서버 리소스: /usr/local/httpd/filles/specials/saw-blade.gif
웹 서버는 경로가 파일이 아닌 디렉터리를 가리키는, 디렉터리 URL에 대한 요청을 받을 수 있습니다. 대부분의 웹 서버는 클라이언트가 디렉터리 URL을 요청했을 때 다음과 같이 몇 가지 다른 행동을 취하도록 설정할 수 있습니다.
서버들 중에서 애플리케이션 서버라고 불리는 것들은 웹 서버를 복잡한 백엔드 애플리케이션과 연결 하는 일을 합니다. 어떤 리소스가 동적 리소스라면, 애플리케이션 서버는 그에 대한 동적 콘텐츠 생성 프로그램이 어디에 있는지, 그리고 어떻게 그 프로그램을 실행하는지 알려줄 수 있어야 합니다.
만약 어떤 리소스가 서버사이드 인클루드를 포함하고 잇는 것으로 설정되어 있다면, 서버는 그 리소스의 콘텐츠를 클라이언트에게 보내기 전에 처리합니다. 서버는 콘텐츠에 변수 이름이나 내장된 스크립트가 될 수 있는 어떤 특별한 패턴이 있는지 검사를 받습니다. 특별한 패턴은 변수 값이나 실행 가능한 스크립트의 출력 값으로 치환됩니다.
접근 제어되는 리소스에 대한 요청이 도착했을 때 웹 서버는 클라이언트의 IP 주소에 근거하여 접근을 제어할 수 있고, 혹은 리소스에 접근하기 위한 비밀번호를 물어볼 수도 있습니다.
한번 서버가 리소스를 식별하면, 서버는 요청 메서드로 서술되는 동작을 수행한 뒤 응답 메시지를 반환합니다. 응답 메시지는 응답 상태 코드, 응답 헤더, 그리고 응답 본문(생성되었다면)을 포함합니다. 웹 서는 받을 때와 마찬가지로 커넥션 너머로 데이터를 보낼 때도 비슷한 이슈에 직면합니다. 서버는 커넥션 상태를 추적해야 하며, 지속적인 커넥션은 특별히 주의해서 다룰 필요가 있습니다.
마지막으로, 트랜잭션이 완료되었을 때 웹 서버는 트랜잭션이 어떨게 수행되었는지에 대한 로그를 로그파일에 기록합니다. 대부분의 웹 서버는 로깅에 대해 여러 가지 설정 양식을 제공합니다.