웹서비스의 구조
- 정적 처리 : 클라이언트 -> (Request) -> 웹서버
- 기본적인 동적 처리의 경우 : 클라이언트 -> (Request) -> 웹서버 -> (Request) -> WAS -> 외부 프로그램 실행(WAS에서 동작)
- CGI를 사용하는 경우 : 클라이언트 -> Request -> 웹서버 -> CGI -> 외부 프로그램 실행(웹서버에서 동작)
- WSGI를 사용하는 경우 : 클라이언트 -> Request -> 웹서버 -> Request -> WSGI (미들웨어) -> Requset -> WAS -> 외부 프로그램
웹 서버
- 소프트웨어 + 하드웨어로 이루어짐.
- 하드웨어 : 웹서버가 설치된 시스템 컴퓨터
- 소프트웨어 : 웹 브라우저 클라이언트로부터 Requset를 받아 정적인 컨텐츠(html , css 등등)을 Response 하는 프로그램.
- 기능 : 클라이언트의 요청에 응답을 보내는 역할을 한다.
- 정적인 컨텐츠 제공 -> WAS 를 거치지 않고 서버의 자원을 제공한다.
- 동적인 컨텐츠 제공을 위한 요청 전달 -> 클라이언트의 Request를 WAS에 보내고, WAS 가 처리한 결과를 전달받으면 해당 내용을 클라이언트에 Response 한다.
- 웹서버 소프트웨어의 예) Apache, Nginx, IIS 등등
CGI - Common Gateway Interface
- 정적으로 동작하는 웹서버를 동적으로 기능하게 만들기 위함.
- 웹서버에 들어온 Request를 외부 프로그램과 연결하여 해당 프로그램이 그 요청을 처리하게 연결해주는 역할.
- 들어온 요청을 연결해주는 역할만 할 뿐, 웹 서버가 외부 프로그램을 직접 실행함.
- WAS와의 차이는 연결되는 외부 프로그램을 서버가 직접 실행하는지, WAS가 대신 실행하는지 차이.
- -> 요청이 들어올 때 마다 서브프로세스를 fork함.
- 따라서 WAS에 비해 다수의 요청을 처리하기에 불리하다.
WAS - Web Application Server
- 웹서버 + CGI = WAS. 일반적으로는 웹서버와 WAS를 굳이 구분할 필요가 없음.
- DB조회, 다양한 로직 처리등등의 동적인 컨텐츠 제공을 위해 만들어짐.
- http/https 를 통해 컴퓨터나 장치에 애플리케이션을 수행해주는 미들웨어(소프트웨어 엔진)임.
- 웹 컨테이너/서블릿 컨테이너 라고도 불림 -> jsp, servlet 구동 환경을 제공함.
- 웹서버+웹컨테이너 -> 웹서버의 기능을 구조적으로 분리하여 처리하기 위한 목적.
- ->분산처리 환경을 구성하고, 주로 DB 서버를 따로 분리하는 식으로 구성된다.
- 예)Tomcat(Apache), JBoss(Redhat), Jeus(Tmax),, Web Sphere(IBM),Django 등
웹서버와 WAS를 구분하는 이유?
웹서버가 필요한 이유
- 클라이언트가 서버로부터 Response를 받을때 HTML문서와 이미지 파일등의 정적 컨텐츠를 한꺼번에 받는것이 아닌, 웹 문서를 모두 받고 나면 그에 맞는 이미지 파일을 재 요청하여 받아오는 식임.
- 이때 웹서버 프로그램이 이미지 파일 요청까지 한번에 처리해서 Response 해주면 WAS에 요청을 다시 보낼 필요가 없어짐
- -> 웹서버가 정적 요청을 처리하면 WAS의 요청/응답 과정이 생략되어 서버의 부담을 줄일 수 있음.
WAS가 필요한 이유
- 웹 페이지에 존재하는 동적 컨텐츠를 처리하기 위함.
- 웹서버만을 이용한다면 동적으로 동작해야 하는 컨텐츠의 결과를 웹서버에서 모두 미리 로드해두고 클라이언트에 Response를 보내야함.
- -> 이에 따른 자원낭비를 막기 위해 WAS를 통해 클라이언트의 요청에 맞는 컨텐츠를 그때 그때 제공할 수 있음.
기능을 분리하는 이유
- 서버의 부하 방지 : 두개의 서버 프로세스가 별개의 작업을 처리하게끔 하여 동적 데이터를 처리하기 위해 상대적으로 바쁜 WAS에 가해지는 부하를 줄인다.
- 정적컨텐츠는 대체로 처리량이 많은 멀티미디어 컨텐츠가 많기 때문에 해당 요청까지 WAS가 처리하면 부하가 커지게 된다.
- 물리적으로 두 서버를 분리하여 보안을 강화한다.
- 대용량의 처리를 필요로 하는 웹 서비스의 경우는 웹서버 하나에 여러개의 WAS를 분산하여 연결할 수 있다.
- 백사이드/프론트사이드로 분리한 WAS를 연결하면 무중단 운영이 가능해진다.
- 하나의 웹 서비스에서 여러개의 어플리케이션 서비스가 가능해진다. (예-서버 하나에서 PHP와 Java 어플리케이션 동시 제공 가능.)
WSGI - Web Server Gateway Interface
- 웹서버와 웹 어플리케이션간 인터페이스를 제공하는 파이썬 프레임워크.
- -> 파이썬 스크립트(혹은 웹 어플리케이션)이 웹 서버와 통신하기 위한 인터페이스라는 소리. (일종의 프로토콜)
- 서버|게이트웨이 , 어플리케이션|프레임워크 양단으로 나눠진 구조.
- 웹서버와 WAS 사이에서 미들웨어로써 동작하며, 웹 서버의 관점에서는 WAS 처럼, WAS 관점에서는 서버처럼 동작한다.
- 다수의 클라이언트에서 전해지는 Request들을 동시에 처리하기 위해 사용함.
- -> CGI와는 다르게 Request 마다 서브프로세스를 만들지 않음.
- 웹서버로부터 들어온 요청을 처리하는데, 환경정보와 요청에 대한 콜백 함수 등을 파싱하고 정리하여 WAS에 제공하고, WAS은 해당 요청을 처리하고 콜백 함수를 통해 웹서버로 응답함.
- 같은 프로세스에서 다수의 애플리케이션과 프레임워크들을 실행시킴.
정리하자면,
- WAS는 웹서버와 외부프로그램을 연결하는 미들웨어이고, WSGI는 WAS가 파이썬 프로그램과 연결되는 경우에 웹서버와 WAS를 연결하는 미들웨어 역할을 한다고 생각하면 된다.
- CGI 방식은 웹서버와 외부프로그램을 직접 연결시켜 웹서버 위에서 외부 프로그램이 실행되는 방식이다.
- WAS 방식은 외부 프로그램을 웹서버와 분리시키고 WAS라는 별개의 서버 위에서 실행되게 한다.