웹 서버란 HTTP 프로토콜을 기반으로 클라이언트가 웹 브라우저 주소창에 url
을 입력하여 어떠한 요청을 하면 그 요청을 받아 정적 컨텐츠를 제공하는 서버이다.
정적 컨텐츠란, 단순 HTML 문서, CSS, 이미지, 파일 등 즉시 응답 가능한 컨텐츠이다.
1️⃣ HTTP 프로토콜 지원
: 웹 서버는 클라이언트와 서버 간 통신에 사용되는 HTTP 프로토콜을 지원한다.
2️⃣ 정적 파일 제공
: 웹 서버는 클라이언트가 요청한 정적 컨텐츠를 제공한다. (HTML 문서, CSS, 이미지, 파일, ...)
3️⃣ MIME 타입 처리
: 웹 서버는 MIME(Multipurpose Internet Mail Extensions) 타입을 처리하여 클라이언트에게 올바른 파일 형식으로 데이터를 전송한다.
4️⃣ 가상 호스팅
: 웹 서버는 하나의 서버에서 여러 개의 도메인을 호스팅할 수 있도록 가상 호스팅(Virtual Hosting)을 지원한다.
5️⃣ 로깅
: 웹 서버는 서버에 접근한 클라이언트의 정보를 로그 파일에 저장하여 추적 및 분석할 수 있다.
6️⃣ 보안 기능
: 웹 서버는 SSL(Secure Socket Layer) 및 TLS(Transport Layer Security) 프로토콜을 지원하여 데이터의 보안을 유지한다.
7️⃣ 웹 서버 소프트웨어 확장성
: 웹 서버는 다양한 소프트웨어 확장 기능을 제공한다. 예를 들어, Apache
웹 서버는 모듈 기능을 제공하여 다양한 기능을 추가할 수있다.
이러한 웹 서버에는 Apache
, NginX
, IIS
(windows 전용 웹 서버)등이 있다.
WAS란 DB조회 혹은 다양한 로직 처리를 요구하는 동적 컨텐츠를 제공하기 위해 만들어진 Application 서버이다. HTTP 프로토콜을 기반으로 사용자 컴퓨터나 장치에 애플리케이션을 수행해주는 미들웨어(소프트웨어 엔진)로서, 일반적인 웹 서버와 구별이 되며, 주로 데이터베이스 서버와 같이 수행된다.
WAS는 JSP, Servlet 구동환경을 제공해주기 때문에 서블릿 컨테이너 혹은 웹 컨테이너로 불린다.
💡 WAS = 웹 서버 + 웹 컨테이너
1️⃣ 서블릿 컨테이너
: WAS는 서블릿 컨테이너를 포함한다. 서블릿 컨테이너는 자바 서블릿과 JSP(Java Server Pages)를 실행하는 데 사용된다. 이를 통해 동적인 컨텐츠를 생성하고 처리할 수 있다.
2️⃣ 데이터베이스 연동
: WAS는 데이터베이스와의 연동을 지원한다. 이를 통해 애플리케이션에서 데이터베이스를 사용할 수 있다. WAS는 대개 데이터베이스 풀링(pooling)이나 캐싱(caching)과 같은 고급 기능을 제공한다.
3️⃣ 트랜잭션 관리
: WAS는 트랜잭션 관리를 제공한다. 이를 통해 애플리케이션에서 데이터베이스 트랜잭션을 처리할 수 있다.
4️⃣ 보안
: WAS는 일반적으로 웹 서버보다 높은 보안 기능을 제공한다. WAS는 사용자 인증 및 인가, 보안 통신(SSL/TLS) 등의 기능을 제공한다.
5️⃣ 클러스터링
: WAS는 클러스터링(Clustering)을 지원한다. 이를 통해 여러 대의 WAS 서버를 하나의 논리적인 서버처럼 사용할 수 있다. 이를 통해 애플리케이션의 가용성과 성능을 향상시킬 수 있다.
6️⃣ 웹 서비스 지원
: WAS는 다양한 웹 서비스(Web Services) 프로토콜을 지원한다. 이를 통해 다른 애플리케이션과의 통합이 가능해진다.
7️⃣ 확장성
: WAS는 일반적으로 다양한 소프트웨어 확장 기능을 제공한다. 예를 들어, Java EE(Java Enterprise Edition) 기반 WAS는 EJB(Enterprise JavaBeans)와 같은 기술을 제공하여 다양한 기능을 추가할 수 있다.
이러한 WAS에는 Tomcat
, JBoss
, Jeus
, Web Sphere
등이 있다.
기능적으로 동일한 영역도 있고 WAS가 웹 서버의 기능의 많은 부분을 포함하여 수행하지만 사용의 목적이 다르다.
웹 서버는 정적인 데이터를 처리하는 서버이다. 이미지나 단순 html같은 정적 컨텐츠를 전달하며, WAS만을 이용할 때 보다 빠르고 안정적으로 기능을 수행한다. 반면 WAS는 동적인 데이터를 위주로 처리하는 서버이다. DB와 연결되어 사용자와 데이터를 주고받고, 조작이 필요한 경우 WAS를 활용한다.
웹 서버가 할 수있는 일을 WAS로 전부 가능하다면 웹 서버는 굳이 사용하지 않아도 될까? 물론 정적 컨텐츠만을 제공하는 웹 사이트를 서버에 배포한다면 웹 서버만으로도 충분하다. 그런데 동적 컨텐츠를 제공하는 웹 서비스를 배포해야 할 때는 정적, 동적 요청 처리가 모두 가능한 WAS만을 사용해도 되지 않을까?
하지만 WAS는 DB 조회 및 다양한 비즈니스 로직을 처리하는 데 집중해야 한다. 따라서
웹 서버와 WAS를 분리해야 한다. 그 이유는 다음과 같다.
1️⃣ 서버 부하 방지
: WAS와 웹 서버는 분리하여 서버의 부하를 방지해야 한다. WAS는 비즈니스 로직(서버사이드 로직)을 처리하고, 단순한 정적 컨텐츠는 웹 서버에서 처리해줘야 한다. 만약 정적 컨텐츠까지 WAS가 처리한다면 부하가 커지게 되고, 수행 속도가 느려질 것이다.
2️⃣ 보안 강화
: SSL에 대한 암호화, 복호화 처리에 웹 서버를 사용 가능하다.3️⃣ 여러 대의 WAS 연결 가능
: 로드 밸런싱을 위해 웹 서버를 사용할 수 있다. 사람들이 많이 접속하는 대용량 WAS인 경우, 서버의 수가 여려 대일 수도 있다. 만약 사용 중인 WAS에서 문제가 생겨 WAS를 재시작해야 하는 경우가 생긴다면, 앞단의 웹 서버에서 WAS를 사용하지 못하도록 요청을 차단한다. 그다음 WAS를 재시작한다면, 사용자들은 WAS에 문제가 발생한 줄 모르고 이용할 수 있다.이러한 처리를 '장애 극복 기능' 이라 한다. 여러 개의 서버를 사용하는 대용량 웹 애플리케이션의 경우, 웹 서버와 WAS를 분리하여 무중단 운영을 위한 장애 극복에 쉽게 대응할 수 있다. 또한 효율성, 배포 및 유지 보수 편의성을 위해서라도 대체로 분리한다.
4️⃣ 여러 웹 애플리케이션 서비스 가능
: 하나의 서버에서 PHP, Java 애플리케이션을 함께 사용할 수 있다.
💡 장애 극복 기능
: 소프트웨어 공학에서 장애 극복 기능이란 컴퓨터, 서버, 시스템, 네트워크 등에서 이상이 생겼을 때, 예비 시스템으로 자동 전환될 수 있도록 처리하는 기능을 말한다. (↔️ 스위치 오버)
웹 서버를 WAS 앞에 두고, 필요한 AWS들을 웹 서버에 플러그인 형태로 설정하면 효율적인 분산 처리가 가능하다.
웹 서비스는 다양한 구조를 가질 수 있다.
1️⃣ Client ➡️ 웹 서버 ➡️ DB
2️⃣ Client ➡️ WAS ➡️ DB
3️⃣ Client ➡️ 웹 서버 ➡️ WAS ➡️ DB
위에 그림은 3️⃣번 구조를 나타낸다. 클라이언트가 웹 서버에 HTTP 요청을 보내면 웹 서버는 정적인 컨텐츠 요청은 바로 응답하고, 동적인 컨텐츠 요청은 WAS에게 넘겨서 처리하고 결과를 WAS에게 받아서 클라이언트에게 넘겨준다.
머리 속에 깔끔 정리가 되었어요