웹 서버(Web Server)의 모든 것
- Coding/HTTP
- 2019. 6. 22.
웹 서버란?
웹 서버는 HTTP 요청(request)을 처리하고 응답(response)을 제공한다. 웹 서버라는 용어는 웹 서버 소프트웨어와 웹페이지 제공에 특화된 장비 모두를 가리킨다. 모든 웹 서버는 리소스에 대한 HTTP 요청을 받아서 콘텐츠를 클라이언트에게 돌려준다.
1) 웹 서버는 HTTP 및 그와 관련된 TCP 처리를 구현한 것이다.
2) 웹 서버는 자신이 제공하는 리소스를 관리하고 웹 서버를 설정, 통제, 확장하기 위한 관리 기능을 제공한다.
3) 웹 서버는 HTTP 프로토콜을 구현하고, 웹 리소스를 관리하고, 웹 서버 관리기능을 제공한다.
4) 웹 서버는 TCP 커넥션 관리에 대한 책임을 운영체제와 나눠갖는다.
5) 다목적 소프트웨어 웹서버 : 네트워크에 연결된 표준 컴퓨터 시스템에서 작동하는 웹 서버
6) 임베디드 웹 서버 : 일반 소비자용 제품에 내장될 목적으로 만들어진 작은 웹 서버
여기서, 운영체제란?
운영체제는 컴퓨터 시스템의 하드웨어를 관리하고 TCP/IP 네트워크를 지원하고, 웹 리소스를 유지하기 위한 파일 시스템, 현재 연산활동을 제어하기 위한 프로세스 관리를 제공한다.
웹서버가 하는 일
1) 커넥션을 맺는다. > 클라이언트의 접속을 받아들이거나, 원치않는 클라이언트라면 닫는다.
2) 요청을 받는다. > HTTP 요청 메시지를 네트워크로부터 읽어들인다.
3) 요청을 처리한다. > 요청 메시지를 해석하고 행동을 취한다.
4) 리소스에 접근한다. > 메시지에서 지정한 리소스에 접근한다.
5) 응답을 만든다. > 올바른 헤더를 포함한 HTTP 응답 메시지를 생성한다.
6) 응답을 보낸다. > 응답을 클라이언트에게 돌려준다.
7) 트랜잭션을 로그로 남긴다. > 로그파일에 트랜잭션 완료에 대한 기록을 남긴다.
웹서버가 클라이언트 포스트명 식별하는 방법
웹 서버는 역방향 DNS(reverse DNS)를 사용해서 클라이언트의 IP 주소를 클라이언트의 호스트 명으로 변환하도록 설정되어있다. 웹 서버는 클라이언트 호스트 명을 구체적인 접근 제어와 로깅을 위해 사용할 수 있다. 이 작업은 꽤 시간이 걸릴 수 있기 때문에, 많은 대용량 웹 서버는 이 작업을 꺼두거나 특정 콘텐츠에 대해서만 켜놓는다. 예시로 아파치에서는 HostnameLookups 설정 지시자로 호스트 명 룩업을 켤 수 있다.
HostnameLookups off
<Files ~ "\.(html|htm|cgi)$">
HostnameLookups on
</Files>
웹 서버의 메시지 수신
커넥션에 데이터가 도착하면, 웹 서버는 네트워크 커넥션에서 그 데이터를 읽어 들이고 파싱하여 요청 메시지를 구성한다. 이 과정에 대해 알아보자.
1) 요청줄을 파싱하여 요청 메서드, 지정된 리소스의 식별자(URI)를 찾는다.
2) 메시지 헤더들을 읽는다. 각 메시지 헤더는 CRLF로 끝난다.
3) 헤더의 끝을 의미하는 CRLF로 끝나는 빈 줄을 찾아낸다.
4) 요청 본문이 있다면, 내용을 읽어들인다. (body의 길이는 header에서 content-length 로 정의된다.)
요청 메시지를 파싱할때 웹 서버는 입력 데이터를 네트워크로부터 불규칙적으로 받는다. 네트워크 커넥션은 언제든지 무효화될 수 있다. 웹 서버는 요청 메시지를 파싱해서 이해하는 것이 가능한 수준의 분량을 확보할 때까지 데이터를 네트워크로부터 읽어서 메시지 일부분을 메모리에 임시로 저장해둔다. 이를 내부의 자료 구조에 저장한다.
웹 서버 종류
1) 단일 스레드 웹 서버
한 번에 하나씩 요청을 처리하는 웹 서버이다. 트랜잭션이 완료되면 다음 커넥션이 처리한다. 처리 도중에 모든 다른 커넥션이 무시되므로 심각한 성능 문제를 만들어낸다.
2) 멀티프로세스와 멀티스레드 웹 서버
여러 요청을 동시에 처리하기 위해 여러개의 프로세스 혹은 고효율 스레드를 할당한다. 스레드/프로세스는 필요할때마다 만들어질 수 있고 미리 만들어질 수 있다. 서버가 무수히 많은 동시 커넥션을 처리할때 그로인해 만들어진 수많은 프로세스/스레드는 너무 많은 메모리나 시스템 리소스를 소비하기 때문에 스레드/프로세스의 최대 개수에 제한을 걸어야한다.
3) 다중 I/O 서버
대량의 커넥션을 지원하기 위해, 많은 웹 서버는 다중 아키텍처를 채택했다. 다중 아키텍처에서는 모든 커넥션은 동시에 그 활동을 감시당한다. 커넥션의 상태가 바뀌면 그 커넥션에 대해 작은 양의 처리가 수행된다. 그 처리가 완료되면, 커넥션은 다음번 상태 변경을 알리기위해 열린 커넥션 목록으로 돌아간다. 스레드/프로세스의 리소스 낭비가 적다.
4) 다중 멀티스레드 웹 서버
여러개의 스레드는 각각 열려있는 커넥션을 감시하고 각 커넥션에 대해 조금씩 작업을 수행한다.
MIME 타입 결정
웹 서버에게는 응답 본문의 MIME 타입을 결정해야하는 책임이 있다. 웹 서버는 MIME 타입을 나타내기 위해 파일 이름의 확장자를 사용할 수 있다. 웹 서버는 각 리소스의 MIME 타입을 계산하기 위해 확장자별 MIME 타입이 담겨져있는 파일을 탐색한다.
MIME 타입 목록 예시
1) application/msword
2) text/html
3) text/plain
4) image/gif
리다이렉션
웹 서버는 성공 메시지 대신 리다이렉션 응답을 반환하는 경우도 있다. 웹 서버는 요청을 수행하기 위해 브라우저가 다른 곳으로 가도록 리다이렉트 할수 있다. Location 응답 헤더는 콘텐츠의 새로운 혹은 선호하는 위치에 대한 URI를 포함한다. 리다이렉션의 응답을 3XX 상태코드로 지칭된다.
'Coding > HTTP' 카테고리의 다른 글
TCP 커넥션 관리 (0) | 2019.06.22 |
---|---|
HTTP 기초개념 알아보기 (0) | 2019.06.22 |
HTTP 메시지 (0) | 2019.06.22 |
URL과 리소스 (0) | 2019.06.22 |
HTTP의 기본 인증 (0) | 2019.06.22 |