우선 웹서버와 WAS의 차이가 뭔지 알아보자.
그전에 앞서 정적(Static) 페이지 / 동적(Dynamic) 페이지를 알아둬야 한다.
Static 페이지
동적인 작업없이 서버에서 별도의 처리가 없이 사용자에게 바로 보여주어도 되는 페이지를 말한다.
즉, Static 페이지는 어떠한 사용자가 접근하던 간에 동일한 페이지를 보여주게 된다.
EX) html, image,css
Dynamic 페이지
서버에서 어떤 일련의 과정들을 거쳐서 데이터가 변할 수 있는 페이지로 주로 데이터베이스에서 페이지를 가지고 오고, 이는 어떤 사용자인지에 따라서 다른 페이지를 보여준다.
이둘을 먼저 이해하고 웹 서버와 웹 애플리케이션 서버(WAS)를 이해해보자.
웹서버는 클라이언트가 요청한 정적인 콘텐츠를 http 프로토콜을 통하여 제공해주는 서버이다.
위에서 얘기한 Static 페이지를 보내주는 기능을 하는데, 만약 서버와 WAS가 분리되어 있을 경우 동적인 요청을 WAS의 컨테이너로 보내주는 역할도 제공한다.
여기서 분리되어 있을 경우는, 뒤에서 자세한 설명을 하겠다.
따라서 웹서버는 두가지 기능을 하는데,
1. 정적인 콘텐츠의 제공,WAS를 거치지 않고 자원을 바로 전달
2.동적인 컨텐츠를 WAS에 전달하고 , WAS 가 처리한 결과를 받아서 클라이언트에게 응답 메세지를 전송한다.
EX) Apache , Nginx ,IIS
위에서 웹 컨테이너라는 얘기가 나와서 웹 컨테이너에 대한 추가 설명이 필요하다.
웹 컨테이너의 동작방식
1. 클라이언트가 웹서버로 HTTP 요청메세지를 보낸다
2. 웹서버에서 동적으로 데이터가 변하는 부분이 있으면,이를 WAS 에 전달한다.
3. WAS 는 내용을 확인하고 처리를 담당하는 서블릿 컨테이너에 있는 서블릿에게 해당 요청을 처리하도록 한다.
4. 서블릿에서 비즈니스 로직을 수행 후 서블릿 컨테이너에 응답 메세지를 반환한다.
5. 컨테이너가 이 응답을 클라이언트에게 전달한다.
WAS (Web Application Server)
WAS 는 위에서 거듭 얘기했듯 웹 서버로 오는 동적인 요청을 처리하는 서버이다.
즉, 웹서버와 컨테이너를 붙여놓은 서버이다.
ex)Tomcat/JBoss,Jeus,Web Sphere 등
적은 트래픽이 요구된다면 WAS 로도 충분할 수 있지만, WAS 로만 운영 했을 때는 중요한 문제가 있다.
1. WAS 가 해야 할 일의 부담을 줄이기 위해서
WAS가 필요한 이유는 동적인 데이터를 처리해야하기 때문에 웹애플리케이션을 만들게 되면 필수적으로 들어간다. 이렇게 동적인 데이터를 처리하는 부분은 상당히 많은 자원을 사용하게 되는데 웹 애플리케이션을 처리하는 프로그램의 메모리나 데이터베이스와의 커넥션 등 비즈니스 로직은 많은 자원들을 사용 해야 한다
또한 만약 WAS 로 하나의 서버를 구성하게 된다면 WAS 가 죽었을 때 큰 문제가 발생한다. 하나의 서버로만 돌렸기 때문에 WAS 에서 에러가 발생해서 멈추거나 WAS 가 죽는 순간에는 비즈니스 로직을 처리하지 못하는 것도 문제지만, 서버의 문제가 있다는 정적 페이지 조차 띄우지를 못한다.
사람들이 많이 접속하는 대용량 WAS인 경우, 서버의 수가 여러 대일 수 있다. 만약 사용 중 WAS에서 문제가 생겨 WAS를 재시작해야 하는 경우가 생긴다면 이때 재시작하기 위해 앞단의 웹서버에서 WAS를 사용하지 못하도록 요청을 차단한 후 WAS를 재시작한다면, 사용자들은 WAS에 문제가 발생한지 모르고 이용할 수 있다.
이러한 처리를 “장애 극복 기능”이라 한다.
즉 규모가 커질수록 웹서버와 WAS를 분리하는 것이다. 그리고 자원을 이용하면서 효율성, 배포 및 유지보수 편의성을 위해 대체로 분리하여 둔다.
참고
소프트웨어 공학에서 장애극복기능이란
컴퓨터 서버, 시스템, 네트워크 등에서 이상이 생겼을때
예비 시스템으로 자동전환될 수 있도록 처리하는 기능이다.
반면 수동으로 직접 전환 처리하는것을 스위치 오버라고 한다.
웹 서비스는 아래처럼 다양한 구조를 가질 수 있다.
1. Client -> 웹서버 -> DB
2. Client -> WAS -> DB
3. Client -> 웹서버 -> WAS -> DB
또한 리버스 프록시의 구조를 가져가며 서버 부하 방지와 보안적 효율을 얻을 수 있다.
2. WAS의 환경설정 파일을 외부에 노출시키지 않도록 하기 위해서
클라이언트와 연결하는 포트가 직접 WAS에 연결이 되어 있다면 중요한 설정 파일들이 노출될 수 있기 때문에 WAS 설정 파일을 외부에 노출시키지 않도록 하기 위해서 웹 서버를 앞단에 배치시킨다. 웹 서버와 WAS에 접근하는 포트가 다르기 때문에, WAS에 들어오는 포트에는 방화벽을 쳐서 보안을 강화할 수도 있다.
3. 아파치( Apache )와 CGI, 그리고 톰캣( Tomcat )
윗 글을 읽고 나면 조금 의문이 드는 부분도 있을 것이다. 웹서버만으로도 분명 동적인 요청 처리가 가능한 것도 있기 때문이다. 예를 들면 PHP의 경우 WAS 없이 아파치나 nginx만을 통해서 동적인 요청 처리가 가능하다. 그걸 가능하게 해주는 게 CGI( Common Gateway Interface )이다.
웹서버에 별도로 설정해주어야 하지만 CGI는 이름 그대로 인터페이스로서, 웹 서버상에서 프로그램을 동작시키기 위한 방법을 정의한 프로그램(또는 스크립트)이다. CGI란 위에 설명해 놓았듯이 동적컨텐츠를 제공하기 위해 웹서버 내에 프로그랭밍 기능이 들어가는 방식 이다. 즉 PHP, Perl, Python 등의 언어들은 CGI를 구현해놓았기 때문에, 아파치에서 다양한 언어로 짜여진 각 프로그램을 실행할 수 있다.
예를 들어 아파치에 PHP 모듈을 설치했을 경우, 요청이 왔을 때 아파치는 HTTTP 헤더를 분석하고 파싱하여 PHP로 파라미터를 넘겨준다. 그러면 PHP에서는 파라미터를 받아 응답 할 HTML 문서를 만들어서 아파치에 전달한다. HTML 문서를 전달 받은 아파치는 CSS, JS, img 등 정적인 자원들과 함께 브라우저로 반환한다. 하지만 이 역시(CGI) 효율이 떨어지기 마련이다… CGI만으로는 규모가 큰 웹서비스를 구현하기 사실상 어렵기 때문이다(WAS의 반대 경우).
많은 프로그래머들이 JAVA를 견고한 언어라고 평가하는 이유도 여기에 어느정도 포함되어 있다고 생각한다. 자바 서블릿 은 CGI를 사용하지 않는다 그래서 WAS에 대해 설명 할때 대표적으로 JAVA, 톰캣, 아파치로 대부분 예시를 들어준다. 가장 이상적인 WS + WAS의 사용이라고 보여지기 때문이다.
요약
WEB 서버
정적컨텐츠 처리 - WAS 서버 부하를 방지
논리, 물리적 분리 / 보안강화 /여러 대의 WAS연결
참고
https://kjw1313.tistory.com/102
https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html
http://melonicedlatte.com/web/2019/06/23/210300.html
https://doozi316.github.io/web/2020/09/13/WEB26/
https://developer.mozilla.org/ko/docs/Learn/Common_questions/Web_mechanics/What_is_a_web_server