Web Server와 Web Application Server

Jeonghwa·2024년 3월 17일
1
post-thumbnail

서론

최근 CS스터디를 하면서 HTTPS에 대해 공부를 하던 중, 아래와 같은 대화가 오고갔습니다.

  • 나: HTTPS 통신을 위해 인증서를 발급받는건 알겠는데 어디다 설치해야하는거에요? 톰캣??
  • 팀원: 아니요. 웹서버에 설치하는거에요.
  • 나: 엇 톰캣이 웹서버아닌가요?
  • 팀원: 톰캣은 WAS에요.
  • 나: ?? 근데 톰캣만 띄워도 서비스되지않나요.. 이런경우엔 어디에 설치하는거에요.
  • 팀원: 회사마다 인프라 구축된게 달라요. 만약 웹서버 + WAS 구조로 운영한다면 웹서버에 설치하고 WAS만 사용한다면 WAS에 설치하면됩니다.

저는 이해가 되지 않았습니다.. 그래서 해당 개념을 정리하기위해 이번 블로깅 주제를 위와 같이 잡았습니다.

Web Server

  • Web: 인터넷을 통해 연결된 수많은 리소스url을 사용하여 http요청을 통해 접근할 수 있는 거대한 정보 시스템.
  • Server: 클라이언트에게 네트워크를 통해 정보나 서비스를 제공하는 컴퓨터 시스템.

리소스: 텍스트, 이미지, 비디오 등 콘텐츠를 포함하는 웹페이지(HTML)

즉, Web Server는 Web이라는 서비스를 제공하는 컴퓨터 시스템이라고 볼 수 있습니다. 대표적인 제품은 Apache, Microsoft iis, Nginx 등이 있습니다.

작동방식을 자세히 알아볼까요?

웹브라우저(클라이언트)는 웹서버에게 주소(url)을 가지고 통신 규칙에 맞게 요청(http)하면, 알맞은 내용(HTML)을 응답 받게됩니다.

그리고 웹서버는 웹브라우저(클라이언트)에게 요청을 받고 필요한 내용(HTML)를 만들어서 응답(http)합니다.

만약 아파치같은 무료 웹서버를 깔고 포트번호 및 HTML디렉토리만 지정해주면 전세계 사람들에게 데이터를 제공해줄 수 있습니다.

HTML은 프로그래밍 언어가 아니다.

웹서버만으로 줄 수 있는 데이터는 정적 컨텐츠(html, css, 이미지 등)로 한정되어있습니다.

요청인자에 따라 바뀔 수 있는 동적 컨텐츠를 제공하고싶어도, HTML은 프로그래밍 언어가 아니므로 DB에 접속하여 데이터를 가져올 수 도 비지니스 로직을 수행하여 데이터를 새로 생성하여 제공하는 것은 불가능합니다. 항상 동일한 컨텐츠만 제공할 수 있죠.

위와 같은 문제를 해결하기위해 WAS가 등장하게 됩니다.

WAS(Web Application Server)

  • Web Application: 웹에서 실행되는 응용 프로그램
  • WAS(Web Application Server): 웹 어플리케이션을 호스팅하고, 클라이언트의 요청에 따라 애플리케이션 코드를 실행하여 동적으로 콘텐츠를 생성 및 반환하는 프레임워크

즉, WAS는 프로그램 실행 환경을 제공하며 요청에 맞게 데이터베이스 접근, 비지니스 로직 수행 등 복잡한 처리를 수행하여하여 동적 컨텐츠를 전달할 수 있습니다. 대표적인 제품은 Tomcat, IBM WebSphere, Tmax JEUS가 있습니다.

Web Server와 WAS 이 둘의 관계는?

쉽게말해 Web Server는 클라이언트로부터 HTTP 요청을 받으며, 정적 컨텐츠 요청시 해당 데이터를 제공하고, 동적 컨텐츠 요청시엔 요청을 WAS로 전달하여 WAS가 처리한 결과를 클라이언트에게 전달하게 됩니다.

하지만 대부분의 WAS는 Web Server를 내장하고 있기 때문에 HTTP 요청을 받을 수 있습니다. 요청에 맞는 정적 컨텐츠(html, css, 이미지 등)를 제공할 수 도 있고 DB조회나 비지니스 로직 처리를 통해 동적 컨텐츠도 클라이언트에게 제공할 수 있습니다.

동작 방식에 대해 자세히 설명해보자면 웹서버웹컨테이너에게 요청을 넘겨주고, 웹컴포넌트(서블릿 등)를 관리하는 웹컨테이너는 요청에 맞는 서블릿을 찾아 로직을 수행한 뒤, 생성된 콘텐츠를 웹 서버를 통해 클라이언트에게 반환합니다.

서블릿: Java 언어를 사용하여 동적 컨텐츠를 생성하는 서버 사이드 프로그램. HTTP 요청을 받아 처리하고 그 결과를 반환할 수 있습니다.

짚고 넘어가야할 부분
http통신 시 사용되는 메세지는 헤더바디로 구조가 나뉘는데, 여기서 말하는 컨텐츠http 바디에 담긴 데이터를 말합니다. 꼭 html일 필요는 없습니다. 단순 text가 될수도 json이 될수도 웹에서 처리할 수 있는 형식은 다양합니다. 대표적인 형식이 html일뿐입니다.

WAS는 Web Server를 내장하고있는데 앞단에 따로 두는 이유는?

사실 트래픽이 적다면 WAS만 사용해도 괜찮습니다. 하지만 과부하가 걸릴일이 많아진다면 Web Container의 분산이 필요해집니다.

웹서버를 따로 두면 가질 수 있는 장점에 대해 알아봅시다.

1. 책임 분할을 통한 서버 부하를 방지할 수 있다.

정적 컨텐츠는 Web server, 동적 컨텐츠는 WAS가 담당하도록 하여 서버의 부하를 나눌 수 있습니다. 즉, 정적컨텐츠는 요청은 WAS까지 가지않아도 앞단에서 빠르게 보내줄 수 있습니다.

예시) Nginx

server { 
	root /www/data;
   	
    location / {
    }
    
    location /images/ {
    }
}
  • root는 파일 시스템 디렉토리의 root이다.
  • 만약 /images/1.jpg 로 요청이오면, /www/data/images/1.jsp파일을 찾아 제공한다.

2. 여러대의 WAS를 로드밸런싱할 수 있다.

WAS가 처리해야하는 요청을 여러 WAS가 나누어서 처리할 수 있도록 Web Server에 로드밸런싱을 설정할 수 있습니다.

예시) Nginx

http {
    upstream backend {
        server backend1.example.com weight=5;
        server backend2.example.com;
        server 192.0.0.1 backup;
    }
}

server { 
    location / {
        proxy_pass http://backend;
    }
}

여러 WAS를 backend라는 서버 Group으로 묶은 다음 /요청이 오면 여러 WAS 중 1대에 요청이 가도록 설정할 수 있습니다. 현재 설정은 backend1에 가중치가 5로 설정되어 있으므로 다른 서버에 비해 5배 더 많은 요청을 받게 됩니다.

3. 여러대의 WAS를 Health check할 수 있다.

Health check란?
서버에 주기적으로 HTTP 요청을 보내 서버의 상태를 확인하는 작업을 말합니다.
ex) 특정 url 요청에 200 응답이 오는지?

Web Server에 Health check를 설정 해준다면, 주기적으로 요청을 보냄으로써 fails 설정만큼 연속으로 정상 응답이 오지 않으면 해당 서버를 비정상 서버로 간주할 수 있습니다.

그렇게되면 해당 WAS에 대한 연결은 자동으로 차단되고 사용자는 서비스의 이상을 느끼지 못한채 나머지 WAS에 접속할 수 있습니다.

또한 해당 WAS를 복구할 경우 Web Server는 계속해서 헬스체크를 보내기 때문에 passes 설정만큼 연속으로 정상 응답이 온다면, 별다른 조치없이 해당 서버로 요청을 다시 전달할 수 있습니다.

예시) Nginx

server { 
    location / {
    	proxy_pass http://backend;
        health_check interval=10 fails=3 passes=2;
    }
}
  • Interval: health check를 통해 서버 상태를 확인하는 요청을 날리는 주기 (default: 5초)
  • Fails : 서버를 비정상이라고 판단하는 연속적인 실패 응답 횟수 (default: 1회)
  • Passes: 서버가 복구되어 정상이라고 판단하는 연속적인 성공 응답 횟수 (default: 1회)

4. 보안을 강화할 수 있다.

리버스 프록시를 통해 실제 서버를 외부에 노출하지 않을 수 있습니다.

WAS의 경우 DB접근 권한을 가지고 있기 때문에 노출되면 위험할 수 있습니다. 따라서 앞단에 웹서버를 두어 WAS를 클라이언트에게 노출시키지 않고 무조건 웹서버를 타야지만 요청을 처리할 수 있도록 만들 수 있습니다.

결론

  • Web Server는 클라이언트의 요청을 받아 정적 컨텐츠를 반환합니다.
  • WAS는 Web Server+Web Container구조로 이루어져있으며 클라이언트의 요청을 받아 정적/동적 컨텐츠를 반환합니다.
  • WAS만으로 웹 서비스는 가능합니다. 하지만 서비스 확장성, 안정성을 고려한다면 앞 단에 Web server를 두는 것이 유리합니다.

참고 :

profile
backend-developer🔥

0개의 댓글

관련 채용 정보