Web Server, WAS

4665 단어

📚 Web Server

정의

웹 브라우저(클라이언트)로 부터 HTTP 요청을 받아 HTML 문서와 같은 정적인 컨텐츠를 제공하는 프로그램

정적 페이지 (Static Pages)

  • Web Server가 받아온 파일 경로 이름과 일치하는 파일 컨텐츠를 반환한다.
  • 요청 인자 값에 상관없이 달라지지 않는 컨텐츠(HTML, CSS, Image, ...)
  • 어느 사용자 요청이든 항상 동일한 컨텐츠

기능

  • HTTP 프로토콜을 기반으로 클라이언트의 요청을 서비스 한다.
  • 정적 컨텐츠를 제공한다.
  • 클라이언트의 요청(Request)을 WAS에 전달하고 WAS가 처리한 결과를 클라이언트에게 전달(Response)한다.

종류

  • Apache Server
  • NginX


📚 WAS (Web Application Server)

정의

DB 조회나 다양한 로직처리를 요구하는 동적인 컨텐츠를 제공하는 프로그램

웹 컨테이너(Web Container) 혹은 서블릿 컨테이너(Servlet Container)라고도 불린다.

컨테이너(Container) : Servlet, JSP를 관리하는 소프트웨어

WAS에는 Web Server가 내장되어있다.


동적 페이지 (Dynamic Pages)

  • 요청 인자 값에 따라 로직을 처리한 결과가 다른 컨텐츠
  • 웹 서버에 의해 실행되는 프로그램을 통해 만들어진 결과물

기능

  • 클라이언트로부터 HTTP 요청을 받고 정적 컨텐츠와 동적 컨텐츠 모두 제공
  • 프로그램 실행 환경 및 DB 접속 기능 제공
  • 여러 트랜잭션 처리 가능
  • 업무 처리 비즈니스 로직 수행

역할

WAS = 웹 서버 + 웹 컨테이너

WAS는 웹 서버의 기능들을 구조적으로 분리하여 처리하는 역할이다.
보안, 스레드 처리, 분산 트랜잭션 처리 등 분산 환경에서 주로 사용된다.

종류

  • Tomcat


❓ Web Server를 사용하는 이유

웹 서버에서는 정적 컨텐츠만 처리하도록 기능 분배를 해서 서버 부담을 줄이기 위해 사용한다.

클라이언트가 정적 컨텐츠를 요청할 때

웹 문서(HTML)가 클라이언트에게 보내질 때 이미지 파일과 같은 정적 컨텐츠는 함께 보내지지 않는다.
먼저 HTML 문서를 받고, 이에 필요한 이미지 파일을 다시 서버에 요청해서 받아온다.
이 과정에서 WAS까지 가지 않고 앞단의 웹 서버를 통해 빠르게 보낼 수 있다.


❓ WAS를 사용하는 이유

WAS를 통해 요청에 맞는 데이터를 DB에서 가져와 비즈니스 로직에 그때마다 결과를 만들고 제공하면서 자원을 효율적으로 사용할 수 있다.

클라이언트가 동적 컨텐츠를 요청할 때

웹 서버 만으로는 사용자가 원하는 요청에 대한 결과값을 모두 미리 만들어놓고 서비스하기에는 자원이 절대적으로 부족한다.
따라서 WAS를 통해 요청이 들어올 때마다 DB와 비즈니스 로직을 통해 결과물을 만들어서 제공한다.


❓ Web Server와 WAS를 같이 사용하는 이유

책임 분할을 통한 서버 부하 방지

WAS는 DB 조회나 다양한 로직을 처리해야하기 때문에 단순한 정적 컨텐츠는 Web Server에서 빠르게 제공하는 것이 좋다.

WAS는 동적 컨텐츠를 위한 서버인데, 정적 컨텐츠까지 처리하면 과부하가 일어나 수행 속도가 느려질 수 있다. (페이지 로딩 느림)

WAS 로드 밸런싱(Load Balancing)

로드 밸런싱 기능을 이용하기 위해 WAS 앞단에 Web Server를 놓으면, 여러 대의 WAS가 요청을 나누어 처리할 수 있다.

Health Check 기능을 통해 WAS의 상태를 확인하고, 오류가 생긴 WAS에 접근하는 것을 차단할 수 있다.

location / {
    proxy_pass http://example;
    health_check interval=10 fails=3 passes=2;
}

Web Server와 WAS를 분리하여 무중단 운영을 위한 장애 극복(fail over)에 쉽게 대응할 수 있다.

보안

리버스 프록시 설정을 통해 서버를 외부에 노출하지 않을 수 있다.

server {
   listen 80 default_server;
   listen [::]:80 default_server;
   
   return 301 https://example;
}

server {
   listen 443 ssl;
   listen [::]:443 ssl;
   
   ssl_certificate ...
   
   location / {
      proxy_pass http://example;
      proxy_set_header ... 
   }
}

동작

  1. 클라이언트의 요청을 웹 서버가 받은 다음, WAS에게 보내 관련된 Servlet을 메모리에 올린다.

  2. WAS는 web.xml을 참조해 해당 Servlet에 대한 스레드를 생성한다.

  3. 이때 HttpServletRequest와 HttpServletResponse 객체를 생성해 Servlet에게 전달한다.

  4. 스레드는 Servlet의 service() 메소드를 호출하고, service() 메소드는 요청에 맞게 doGet()이나 doPost() 메소드를 호출한다.

  5. doGet()이나 doPost() 메소드는 인자에 맞게 생성된 적절한 동적 페이지를 Response 객체에 담아 WAS에게 전달한다.

  6. WAS는 Response 객체를 HttpResponse 형태로 바꿔 웹 서버로 전달한다.

  7. 생성된 스레드를 종료하고, HttpServletRequest와 HttpServletResponse 객체를 제거한다.



[참고]

좋은 웹페이지 즐겨찾기