웹 서버는 HTTP 요청을 처리하고 응답을 제공한다. 웹 서버는 기능, 형태, 크기가 다양하다. 기능은 달라도 모든 웹 서버는 리소스에 대한 HTTP 요청을 받아서 콘텐츠를 클라이언트에게 돌려준다.
웹 서버는 HTTP 및 그와 관련된 TCP 처리를 구현한 것이다.
웹 서버는 여러 가지 형태가 가능하다.
다목적 소프트웨어 웹 서버는 네트워크에 연결된 표준 컴퓨터 시스템에서 동작한다.
출처 : https://news.netcraft.com/archives/2020/10/21/october-2020-web-server-survey.html
넷크래프트의 조사는 인터넷 웹 사이트들이 어떤 웹 서버를 통해 서비스 되고 있는지 보여준다.
책은 2014년도를 기준으로 1위 마이크로소프트 2위 아파치 3위가 nginx 였다. 책에서 nginx 서버가 수년간 꾸준히 증가한다고 했는데
2020년을 기준으로 보면 nginx 서버가 1위 점유율로 올라갔다.
일반 소비자용 제품에 내장될 목적으로 만들어진 작은 웹 서버이다. (예: 프린터, 가전제품) 사용자가 그들의 일반 소비자용 기기를 간편한 웹 브라우저 인터페이스로 관리할 수 있게 해준다.
클라이언트가 웹 서버에 TCP 커넥션을 요청하면, 웹 서버는 그 커넥션을 맺고 TCP 커넥션에서 IP 주소를 추출하여 커넥션 맞은편에 어떤 클라이언트가 있는지 확인한다.
웹 서버는 역방향 DNS(reverse DNS)
를 사용해서 클라이언트의 IP 주소를 클라이언트의 호스트 명으로 변환하도록 설정되어있다. 호스트 명 룩업은 시간이 많이 걸릴 수 있어 웹 트랜젝션을 느려지게 할 수 있다.
많은 대용량 웹 서버는 호스트 명 분석을 꺼두거나 특정 콘텐츠에 대해서만 켜놓는다.
서버에게 어떤 사용자 이름이 HTTP 커넥션을 초기화했는지 찾아낼 수 있게 해준다. ident는 조직 내부에서는 사용할 수 있지만, 일반 공공 인터넷에서는 잘 동작하지 않는다.
요청 메시지를 파싱할 때, 웹 서버는 다음과 같은 일을 한다.
요청줄을 파싱하여도 요청 메서드, 지정된 리소스의 식별자, 버전 번호를 찾는다.
요청줄은 캐리지 리턴 줄바꿈 문자열(CRLF)로 끝난다
메시지 헤더들을 읽는다(각 헤더는 CRLF로 끝남)
헤더의 끝을 의미하는 CRLF로 끝나는 빈 줄을 찾아낸다(존재한다면)
요청 본문이 있다면, 읽어 들인다
요청 메시지를 쉽게 다룰 수 있도록 내부의 자료 구조에 저장한다.
웹 서버들은 항상 새 요청을 주시하고 있다. 웹 서버 아키텍처의 차이에 따라 요청을 처리하는 방식도 달라진다.
웹 서버가 요청을 받으면, 서버는 요청으로부터 메서드, 리소스, 헤더, 본문(없을 수도)을 얻어내어 처리한다.
웹 서버는 정적 리소스 및 동적 콘텐츠도 제공한다.
일반적으로 웹 서버 파일 시스템의 특별한 폴더를 웹 콘텐츠를 위해 예약 해둔다. 이 폴더는 루트 혹은 docroot로 불린다. 요청 메시지에서 URI를 가져와서 문서 루트 뒤에 붙인다.
GET /specials/saw-blade.gif HTTP/1.0
Host: www.joes-hardware.com
웹 서버의 문서 루트가 /usr/local/httpd/files
를 갖고 있을 때, 웹 서버는 /usr/local/httpd/files/specials/saw-blade.gif
파일을 반환한다.
DocumentRoot /usr/local/httpd/files
httpd.conf 설정 파일에 DocumentRoot 줄을 추가하여 아파치 웹 서버의 문서 루트를 설정할 수 있다.
각 사이트에 그들만의 분리된 문서 루트를 주는 방법으로 한 웹 서버에서 여러 개의 웹 사이트를 호스팅한다.
가상 호스팅 웹 서버는 URI나 HOST 헤더에서 얻은 IP 주소나 호스트명
을 이용해 올바른 문서 루트를 식별한다. 이 방법으로, 하나의 웹 서버 위에서 두 개의 사이트가 완전히 분리된 콘텐츠를 갖고 호스팅 되도록 할 수 있다.
아파치 웹 서버에서는, 각 가상 웹 사이트의 VirtualHost 블록이 가상 서버에 대한 DocumentRoot 지시자를 포함하도록 설정해야 한다
보통 빗금과(/) 물결표(~) 다음에 사용자 이름이 오는 것으로 시작하는 URI는 그 사용자의 개인 문서 루트를 가리킨다.
웹 서버는 경로가 파일이 아닌 디렉터리
를 가리키는, 디렉터리 URL에 대한 요청을 받을 수 있다. 대부분의 웹 서버는 디렉터리 URL을 요청했을 때 다음과 같이 다른 행동을 취하도록 설정할 수 있다.
웹 서버는 URI를 동적 리소스에 매핑할 수도 있다. 웹 서버들 중에서 애플리케이션 서버라고 불리는 것들은 웹 서버를 복잡한 백엔드 애플리케이션
과 연결 하는 일을 한다.
많은 웹 서버가 서버사이드 인클루드도 지원한다. 서버는 그 리소스의 콘텐츠를 클라이언트에게 보내기 전에 처리한다. 서버는 콘텐츠에 변수 이름이나 내장된 스크립트가 될 수 있는 어떤 특별한 패턴이 있는지 검사를 받는다.
웹 서버는 클라이언트의 IP 주소에 근거하여 접근을 제어할 수 있고 혹은 리소스에 접근하기 위한 비밀번호를 물어볼 수 있다.
웹 서버는 종종 성공 메시지 대신 리다이렉션 응답
을 반환한다. 리다이렉션 응답은 3XX 상태 코드로 지칭된다. Location 응답 헤더
는 콘텐츠의 새로운 혹은 선호하는 위치에 대한 URI를 포함한다.
영구히 리소스가 옮겨진 경우
301 Moved Permanently 상태 코드 사용
임시로 리소스가 옮겨진 경우
303 See Other / 307 Temporary Redirect 상태 코드 사용
URL 증강
트랜젝션 간 상태를 유지하는 유용한 방법이다. 303 See Other / 307 Temporary Redirect 상태 코드 사용
부하 균형
과부하된 서버가 요청 받으면, 덜 부하 걸린 서버로 리다이렉트 303 / 307
친밀한 다른 서버가 있을 때
303 See Other / 307 Temporary Redirect 상태 코드 사용
디렉터리 이름 정규화
클라이언트가 디렉터리 이름 요청을 할 때 요청 끝에 빗금을 빠뜨렸다면, 클라이언트를 슬래시를 추가한 URI로 리다이렉트 한다
서버는 커넥션 상태를 추적해야 하며 지속적인 커넥션은 특별의 주의해서 다뤄야 한다.
트랜젝션이 완료되면 웹 서버는 트랜젝션이 어떻게 수행되었는지
에 대한 로그
를 로그파일에 기록한다.