Web Server 와 Common GateWay Interface 와 Web Application Server(이하 WAS 또는 AS)
웹 서버는 하드웨어 또는 소프트웨어, 혹은 두 개가 함께 동작하는 것을 의미할 수 있다.
- 하드웨어 : 웹 서버의 소프트웨어와 웹 사이트의 컴포넌트 파일들을 저장하는 컴퓨터
웹 서버는 인터넷에 연결되어 웹에 연결된 다른 기기들이 웹 서버의 데이터를 주고 받을 수 있도록 한다. - 소프트웨어 : 웹 사용자가 어떻게 호스트 파일에 접근하는지 관리한다. HTTP 서버는 URL과 HTTP의 소프트웨어 일부.
브라우저가 HTTP를 통해 웹 서버의 파일을 요청한다. 이 요청이 제대로 웹 서버(하드웨어)에 도달하면, HTTP서버(소프트웨어)는 요청받은 문서를 HTTP를 이용해 보내준다.

웹 서버는 요청에 따라 기능을 수행하기 위해 정적 또는 동적 웹 서버가 필요하다.
정적 웹 서버는 HTTP 서버(소프트)가 있는 컴퓨터(하드)로 구성되어 있다. 서버는 저장되어 있는 동일한 내용의 페이지(HTML, CSS, JS 등)를 사용자의 브라우저에게 전송하기 때문에 이것을 '정적'이라고 한다.
동적 웹 서버는 정적 웹 서버 + 추가적인 소프트웨어(대부분 AS와 DB)로 구성되어 있다. 애플리케이션 서버(AS)가 HTTP 서버를 통해 브라우저가 요청한 파일을 전송하기 전에 업데이트를 하기 때문에 사용자마다 다른 페이지를 볼 수 있어 '동적'이라고 부른다.
WAS(Web Application Server)
WAS(=AS)는 웹 환경에서 작동하는 응용프로그램으로 DB나 외부 서비스와 상호작용하며 로직을 처리한다. DB 등에서 가져온 데이터를 가공하여 즉석으로 웹 페이지를 생성, 반환한다. 때문에 같은 주소로 접속해도 사용자나 환경에 따라 다른 페이지를 볼 수 있다.
대표적인 WAS에는 Tomcat, JBoss, Jeus, WebSphere 등이 있다.
WAS의 주요 기능
- 프로그램 실행 환경 및 DB 접속 기능을 제공
- 여러 트랜잭션 관리
- 업무 처리 비즈니스 로직 수행
웹 서버와 WAS
웹 서버나 WAS 둘 중 하나만 사용하면 되는 것 아니냐는 의문이 들 수 있다. 웹 서버와 WAS를 구분하는 이유는 자원을 효율적으로 사용하고, 배포 및 유지보수의 편의성을 위해서이다.
WAS는 사용자의 요청에 맞게 동적으로 생성된 페이지를 제공해야 한다. 사용자의 요청이 들어올 때마다 데이터를 DB에서 가져와 다양한 처리를 해야하기 때문에 정적 페이지보다 제공하기까지 시간이 더 필요하다. 그렇기에 정적 콘텐츠의 제공은 웹 서버가 담당하도록 해서 WAS의 부담을 줄이는 것이다.
CGI (Common Gateway Interface)
CGI는 웹 서버에서 응용프로그램을 동작시키기 위한 프로토콜(interface)이다.
사용자의 요청을 CGI 규격을 준수한 프로그램에서 적절히 처리하고, 결과를 HTML로 생성하여 웹 서버에 전달한다. CGI는 프로토콜이자 인터페이스이기 때문에 C, Java, Python 등 다양한 언어로 작성이 가능하다. 웹 서버는 CGI 프로그램을 호출하고, 클라이언트 요청에 대해 개별 프로세스를 생성한다.

CGI의 한계는 클라이언트의 요청이 많아질 경우, 서버에 가해지는 부하를 분해하지 못한다는 것이다. 이는 CGI는 클라이언트 요청이 들어올 때마다 독립적인 프로세스를 생성하기 때문이다. 멀티 프로세싱으로 인해 자원을 비효율적으로 운영하게 된다.
이를 극복하기 위한 방안들이 등장했는데
첫째, 웹 서버에 스크립트 엔진을 내장시켜 하나의 프로세스에서 여러 요청을 처리하는 것. 웹 서버 내장 모듈 방식으로도 불린다.
둘째, 사용자의 요청을 처리하는 프로그램을 데몬으로 실행시키는 것. 데몬은 시스템 백그라운드 프로세스를 말하며, 사용자의 요청을 기다리다가 요청이 발생하면 적절하게 수행한다. 이것이 WAS에 해당한다. 웹 서버가 프로그램을 실행하지 않으며, 별도의 WAS를 두게 되면 웹 서버는 리버스 프록시를 통해 로드 밸런싱을 할 수 있게 된다.
리버스 프록시는 인터넷과 WAS 중간에서 WAS를 대신해 중복으로 들어오는 정적 파일에 대한 요청은 웹 서버에서 처리하고, 동적인 처리는 WAS로 전달하는 역할을 한다. 또, 사용자의 요청이 많아 부하가 발생하면, 웹 서버는 로드 밸런싱(부하 분산)을 통해 여러 WAS로 요청하여 분산 처리할 수 있다. 이는 하나의 프로세스(웹서버)에서 여러 스레드를 관리하는 멀티 스레딩 기법을 이용한다.
WAS vs CGI
정확한 비교는 어렵다. WAS는 프로그램이고, CGI는 인터페이스이기 때문이다.
WAS
- 요청이 동적 페이지 생성과 관련된 요청일 경우 해당 PHP 스크립트를 찾는다.
- 스레드에서 PHP 모듈을 통해 해당 스크립트를 수행한다. (스레드 생성)
- 결과물(HTML 페이지)을 WAS 내의 WebServer 모듈에게 넘겨준다.
- 브라우저에게 전달한다.
CGI + WebServer
- 요청이 WebServer에 설정된 동적 페이지를 생성하는 요청일 경우, 해당 프로그램을 수행하기 위한 PHP Interpreter(프로그램)를 실행시킨다. (프로세스 생성)
- PHP 인터프리터에게 CGI 규약에 맞춰 Request에 실려온 다양한 데이터들을 전달한다.
- PHP 인터프리터는 해당 스크립트를 수행한다.
- 결과물(HTML)을 CGI 규약에 맞춰 웹 서버에 전달한다.
- 웹 서버는 브라우저에게 결과물을 응답으로 전달한다.
CGI는 프로그램을 수행하기 위한 프로세스를 생성한다는 점. WAS는 수행하기 위한 스레드를 생성한다는 점이 가장 큰 차이점이다.
WAS 프로그램 내에서 컨테이너와 웹 서버간의 통신이 CGI 규약을 따른다면 이것 또한 CGI 통신이라고 볼 수도 있다. 그렇기 때문에 동적 페이지 생성을 위한 프로세스 간의 통신이냐 스레드 간의 통신이냐가 차이점이라고 할 수 있다.
MIME TYPE
MIME이란, Multipurpose Internet Mail Extensions의 약자로 이메일과 함께 동봉할 파일을 텍스트 문자로 전환해서 이메일 시스템을 통해 전달하기 위해 개발되었다. 현재는 웹을 통해서 여러 형태의 파일을 전달하는데 쓰이고 있다.
MIME이 등장하기 전, UUEncode 방식을 이용했다. 기존에는 텍스트 파일을 주고 받는데 ASCII 표준에만 따르면 문제가 없었다. 하지만 텍스트 파일이 아닌 바이너리 파일(음악, 영상 등)을 전송해야 하는 경우가 생겼고, 바이너리 파일들을 기존의 시스템에서 전송하기 위해서는 텍스트 파일로의 변환이 필요해 MIME이 등장했다.
이러한 바이너리 파일 -> 텍스트 파일로의 변환을 인코딩(Encoding), 텍스트 파일 -> 바이너리 파일로의 변환을 디코딩(Decoding)이라고 합니다.
MIME으로 인코딩한 파일은 Content-type 정보를 파일의 앞부분에 담으며, Content-type은 여러가지의 타입이 있다.
우리가 자주 보던 Content-type은 아래와 같다.
- Application/javascript
- Application/json
- text/xml
- text/css, text/html
- application/pdf
- image/jpeg
이외에도 다양한 콘텐츠를 표현하는 타입이 존재한다.
넘 어렵내요
출처
웹 서버란 무엇일까?
웹 서버란 무엇일까? - Web 개발 학습하기 | MDN
여기서 우리는 웹 서버가 무엇인지, 어떻게 동작하는지, 왜 중요한지를 알아볼 것입니다.
developer.mozilla.org
웹 서버와 WAS, CGI (feat. 스레드와 프로세스)
CGI vs WAS
MIME-Type, Content-Type이란?
MIME-Type,Content-Type이란?
MIME이란?MIME이란? Multipurpose Internet Mail Extensions의 약자로 간략히 말씀을 드리면 파일 변환을 뜻한다.MIME는 이메일과 함께 동봉할 파일을 텍스트 문자로 전환해서 이메일 시스템을 통해 전달하기
juyoung-1008.tistory.com
'컴퓨터시스템' 카테고리의 다른 글
레지스터와 메모리, 그리고 캐시 (0) | 2024.03.11 |
---|---|
프로세스와 스레드 (0) | 2024.02.29 |
파일 디스크립터란? (File Descriptor) (0) | 2024.02.22 |
메모리 단편화와 메모리 할당 정책 (0) | 2024.02.07 |
GCC(GNU Compiler Collection)란? (0) | 2024.02.01 |