백엔드 개발하며 작성한/기억할 내용

Web Server와 Web Application Server(WAS)

뭉지(moonz) 2022. 4. 25. 16:13
반응형
여기서 말하는 "Server"는 소프트웨어적인 관점에서 이야기합니다. 

 

서론

Web Server와 Web Application Server는 헷갈리기 쉬운 개념인 것 같습니다. 이번 글에서는 각각의 역할과 왜 웹 서비스 운영 시 함께 사용하는지에 대해 이야기하겠습니다.

 

알아가기 위한 과정 중 작성하는 것이므로 잘못된 부분은 일러주시면 감사하겠습니다.

 

목차

  • Web Server와 WAS 간단한 설명과 차이점
  • Web Server의 역할
  • Web Application Server의 역할
  • Apache와 NginX (WS)
  • 정리

 

Web Server와 WAS(Web Application Server)

우선, Web Server는 무엇일까요? Web을 위한 Server입니다.

Server는 소프트웨어적 개념에서 봤을 때 리소스를 제공하는 프로그램입니다.

Web Server는 웹 브라우저와 같은 클라이언트로부터 HTTP 요청을 받아들이고,
HTML 문서와 같은 웹 페이지를 반환하는 컴퓨터 프로그램입니다. 
(by Wiki)

 

대표적인 Web Server는 Apache와 Nginx입니다.

Apache는 예전부터 널리 사용되어왔고, 2004년 Nginx가 등장하면서 현재 많은 점유율을 차지하고 있습니다.

 

그럼 Web Application Server는 무엇일까요? Web Server인데, "Application"을 수행하는 Web Server입니다.

 

Web Application Server는 웹 애플리케이션과 웹 서버 환경을 만들어 동작시키는 기능을 제공하는 소프트웨어 프레임워크이다.
인터넷 상에서 HTTP를 통해 사용자 컴퓨터나 장치에 애플리케이션을 수행해 주는 미들웨어로 볼 수 있다.
(by Wiki)

 

Web Server와 Web Application Server의 차이

먼저 가장 큰 차이로 얘기를 하자면

Web Server는 클라이언트로부터 오는 HTTP 요청을 받아들이고, HTML 문서와 같은 정적 컨텐츠 (웹 페이지)를 반환하는 서버입니다.

Proxy 역할 등 많은 기능을 제공하는데 아래에서 알아보겠습니다(중요).

반면 사용자마다 다른 데이터를 보여줘야하는, 동적인 처리를 해줘야하는 컨텐츠 요청이 오면 이는 Web Application Server가 수행합니다.

Web Application Server(WAS)는 웹 애플리케이션을 실행하는 Server입니다.

HTTP 요청에 대해 응답하기 위해 DB CRUD 등.을 포함하여 비즈니스 로직을 처리하고, 동적 데이터를 반환하는 애플리케이션 서버입니다.

 

사실, 이렇게 봤을 때 WAS도 정적 컨텐츠 처리를 할 수 있을 것 같습니다. 위 Wiki 정의에서 WAS는 웹 애플리케이션과 웹 서버 환경을 만들어 동작시킨다고 했듯이, WAS 하나만으로도 WS의 역할을 할 수 있습니다.

즉, WAS = Web Server + Application Server 기능을 수행합니다.

하지만 요즘 웹 서비스를 위한 서버를 구축할 때 WAS와 WS를 별도로 구축하는 경우를 많이 볼 수 있습니다.

Ex) WS로 Nginx를, WAS로 Tomcat을.

그 이유는 성능에 이점이 있기 때문인데, 아래에서 다시 다루겠습니다.

 

Web Server의 역할

전체 프로세스는 아래와 같은 구조로 되어있습니다.

 

 

 

사용자가 웹 브라우저에서 URL을 입력하면 사용자에게 응답을 하기까지 여러 일련의 과정을 거치게 됩니다.

Web Server가 하는 역할은 대표적으로,

클라이언트로부터 요청이 오면 서버 컴퓨터에 있는 특정 컨텐츠의 위치로 접근할 수 있도록 합니다.

톰캣이 직접 처리하는 텐츠는 일반적으로 단순 html, css, js, 이미지, 파일 등의 정적 콘텐츠가 됩니다.

 

그럼 정적인 페이지 요청이 아닌, 사용자가 접속할 때마다 그때그때 데이터를 가지고와 뿌려줘야하는 동적 콘텐츠에 대한 요청은 어떻게 할까요? WAS가 처리하도록 요청합니다.

 

Web Server가 동적 컨텐츠를 아예 처리하지 못하는 것은 아닌 것으로 보입니다.  
이전에 APM (Apache + PHP + MySQL 조합) 구성으로 동적인 PHP 웹 사이트를 제공할 수 있었던 것이 예입니다.
다시 말해, Apache(WS)에 PHP를 해석하는 모듈을 세팅해놓으면 동적 웹 요청이 왔을 때 데이터를 로직에 맞게 처리하여 제공할 수 있었습니다.

 

Web Application Server의 역할

WAS는 WS와 달리 비즈니스 로직을 처리하는 기능을 수행하며, 웹 애플리케이션 동작을 위해 여러 서비스를 제공합니다.

 

위에서 알아봤듯, WAS는 웹 서버의 기능도 웹 애플리케이션 서버의 기능도 제공합니다.

하지만 일반적으로, 웹 애플리케이션 서비스를 제공하는 것에 집중합니다.

 

아래는 WAS의 구조를 간략화한 것입니다.

WAS에는 Servlet Container 기능이 포함되어 있으며, WAS의 중요한 핵심 기능입니다.

Servlet Container는 간단히, Servlet을 실행해서 동적인 컨텐츠를 생성하는 역할을 합니다.

 

Servlet은 해당 글을 통해 공부하였습니다.

WAS 구조

비즈니스 로직 처리를 위해 데이터베이스에 접근하는 것이 대개 필요하므로 WAS는 주로 데이터베이스 서버와 함께 수행됩니다.

 

 

이렇게 봤을 때에는 WAS만으로도 정적&동적 콘텐츠 모두 제공할 수 있을 것 같습니다.

실제로 가능합니다. 그런데 왜 WS와 WAS를 분리해서 사용할까요?

1. 정적 콘텐츠는 WS로, 동적 콘텐츠는 WAS로 분리함으로써 각 서버의 부하를 줄일 수 있습니다.

2. WS가 모든 http 요청을 앞 단에서 받아서 WAS에게 전달한다고 했는데, 전달 뿐만 아니라 다양한 기능을 제공하는 Proxy 역할을 합니다.

reverse proxy❓
reverse proxy는 internet과 서버 사이에서 대신 요청을 처리하는 역할을 하는 proxy입니다.
여기서 그 역할을 Web Server가 해줄 수 있습니다.
클라이언트가 internet을 통해 데이터를 요청하면 Reverse Proxy 서버는 이를 내부 서버에 전달하여 데이터를 받아 사용자에게 다시 전달합니다. (internet과 내부 서버사이에 존재)

여기서 웹 서버, 메일 서버, DNS 서버 등이 프록시 역할을 합니다. 
reverse proxy를 둠으로써 제공하는 기능이 많습니다.
1. Load Balancing 기능
클라이언트로부터 여러 요청이 동시에 들어올 때 여러 서버에 분산해서 처리하도록 분산 제공하는 기능 
👉 여러 대의 서버가 분산 처리할 때 사용할 수 있는 기능입니다. 클라이언트로부터 오는 요청을 각 서버에 분산하여 전달해서 부하를 줄여줍니다.


2. 캐싱 기능
👉 클라이언트로부터 온 요청과 응답에 대해 캐싱해놓으면, 다음에 같은 요청이 올때 전달하지 않고, 바로 응답할 수 있어 전송 시간이 절약되고, 불필요한 외부 전송을 하지 않음으로써 외부 요청이 감소됩니다.

3. 보안 기능
👉 1차 방화벽 - DMZ(비무장 지대):proxy 역할 - 2차 방화벽 - 내부 네트워크
 구조로 되어있어 보안에 강력합니다.
👉 내부 서버의 정보(IP 정보, Port 정보..)를 감출 수 있습니다. ex) 내부적으로 리소스들이 어디에 존재하는지, 몇번 port로 돌고 있는지 등


참고) forward proxy❓
사용자 PC 가 internet을 타서 직접 연결하는게 아니라 forward proxy 서버가 요청을 받아서 인터넷에 연결하여 그 결과를 클라이언트에 전달(forward) 해 줍니다. (사용자 PC와 internet 사이에 존재)
👉 보안 : http 요청하는 클라이언트가 자신의 주소를 감출 수 있습니다. 
👉 캐싱 기능 : 위와 같은 기능. 빠르게 응답할 수 있어 성능향상을 가져옵니다.
👉 정해진 사이트만 연결하게 설정하여 웹 사용환경을 제한할 수 있습니다. 

 

 

그리고 보통 실제 운영을 하는 서비스라면, 여러 대수의 WAS를 두어야 합니다. 대표적인 이유는,

1. 급속도로 증가하는 동적 콘텐츠 요청을 잘 처리하기 위하여

2. 지속성을 위하여

👉 만약 제공하는 서비스에 새 기능을 추가하면서 서버를 다시 재부팅해야한다면 그동안에도 지속적인 서비스를 제공하기 위해 여러 인스턴스를 둡니다.

 

그래서 여러대의 WAS에 주기적으로 HTTP 요청을 보내서 서버의 상태를 확인(WAS Health Check) 해야합니다. ex) 특정 url에 200 응답이 잘 오는가?

특정 횟수만큼 연속으로 응답이 오지 않으면, 서버는 해당 WAS를 비정상으로 인지합니다.

 

 

Web Server 의 대표 : Apache와 NginX

아파치 웹서버(Apache Web Server)

  • 오래전부터 널리 사용되어 온 웹 서버
  • 요청 당 스레드 혹은 프로세스 기반의 구조 (요청마다 프로세스 생성)
  • 다양하고 검증된 기능을 사용하고자할 때는 Apache를 사용합니다.
    • ex) mod_proxy 라는 모듈에서 forward proxy 와 reverse proxy  두 가지 기능을 제공
    • nginx는 reverse proxy 기능만 제공

 

NginX

  • 필요한 기능만 제공하는 고성능 웹 서버
  • Apache의 점유율을 따라잡고 있습니다.
  • 비동기 이벤트 기반의 구조로 작동합니다. (Apache에서도 이런 이벤트 방식을 추가하긴 했습니다.)
  • SSL을 지원합니다. (HTTPS 인증서 제공)
  • 웹페이지 접근 인증 제공 : WAS까지 가지 않고도 로그인 기능을 수행합니다.
  • 압축 기능 제공 : 전달된 요청이 Text일 때 이를 입축해서 전달할 수 있습니다.
  • 성능과 가벼움을 중요시하는 서비스에서는 NginX를 사용합니다 .

 

Web Application Server의 대표 : Tomcat

 

Tomcat

Java 로 만들어져 이식성이 좋습니다.

Spring Framework 의 탄생으로 인해 J2SE Servlet 지원 만으로도 Enterprise 급의 프로그램을 개발할 수 있게 되면서 현재까지 널리 사용되고 있습니다.

 

??J2SE Servlet??

 

 

정리

Web Server는 비즈니스 로직은 실행할 수 있는 권한이 없어 정적 콘텐츠만을 제공할 수 있습니다.

또한 클라이언트의 요청을 WAS로 전달하는 Proxy 역할을 해주어 WAS에게 클라이언트와의 연결에대한 독립성을 보장해주며, 보안적으로도 한단계 안전 할 수 있도록 해줍니다.

 

WAS는 동적 콘텐츠를 제공하고 주로 데이터베이스 서버와 함께 수행됩니다. WAS는 WS 덕분에 동적 요소들을 만들어내는 것에 집중할 수 있습니다.

 

두 Server가 겹치는 기능이 있고 WAS 한개로도 운영이 가능하지만, WAS와 WS가 업무를 나누어 처리하여 부담을 덜어낼 수 있고, WS가 Proxy 역할만을 수행함으로써 더 좋은 성능을 낼 수 있게 됩니다.

 

 

 

지속적으로 업데이트 예정입니다.
피드백과 댓글 환영입니다!

 

반응형