지나공 : 지식을 나누는 공간

Web Server, WAS, Nginx [0] 본문

Tech

Web Server, WAS, Nginx [0]

해리리_ 2022. 7. 10. 20:43

들어가는 글

웹사이트가 서비스되려면 브라우저가 읽을 수 있는 파일들, HTML이나 CSS, js, 이미지와 같은 여러 데이터가 필요하다. 이런 걸 서버의 특정 폴더, 디렉토리에 넣어두고 이 폴더를 외부에서 접근 가능하도록 개방해둔 뒤, 서버에 지정된 웹사이트 주소로 접속하면 해당 데이터들을 받아갈 수 있게 하는 것이 웹 서버의 기본 역할이다. 이번에는 다소 지루할 수도 있지만(?) 웹 서버와 WAS의 딱딱한 정의를 먼저 보고, 다음 글에서는 등장 히스토리를 함께 정리할 예정이다!

Web Server

클라이언트가 어떤 페이지를 요청하면 그 요청을 받아서 정적 컨텐츠를 제공하는 서버인데, 만약 동적 컨텐츠에 대해 요청을 받는다면 WAS에게 해당 요청을 넘겨준 뒤 WAS에서 처리한 결과를 클라이언트에게 전달한다.

 

Web Server 예) Apache, Nginx

 

위에서 말한 바와 같이, Web Server는 정적 컨텐츠 제공과 동적 컨텐츠 제공 두 가지 기능이 있고 그 중 선택해서 제공한다.

  • 정적 컨텐츠 제공 : WAS를 거치지 않고 바로 자원 제공
  • 동적 컨텐츠 제공 : 클라이언트 요청을 WAS에 보내서 WAS가 처리한 결과를 클라이언트에게 전달

정적 컨텐츠를 제공하는 것과 동적 컨텐츠를 제공하는 구조를 그림으로 보면 아래와 같다. WAS에 대한 그림은 WAS 설명을 보면서 다시 이해해보자.

정적 페이지와 동적 페이지를 처리하는 차이

 

WAS(Web Application Server)

DB 조회 및 다양한 로직 처리를 해야 할 때 동적인 컨텐츠를 제공하기 위해 만들어진 애플리케이션 서버.

ex) Tomcat, JBoss

미들웨어 개념이고, WAS를 웹 컨테이너 혹은 서블릿 컨테이너라고도 부른다. 컨테이너란, JSP, Servlet을 실행시킬 수 있게 구동 환경을 제공하는 소프트웨어를 말한다. WAS = 웹서버 + 웹컨테이너 = 구동 환경이 제공되는 서버.

보안이나 스레드 처리, 분산 트랜잭션 등 분산 환경에서 주로 DB서버와 함께 사용되고 크게 세 가지 기능을 가진다.

 

1. 프로그램 실행 환경 및 DB 접속 기능 제공

2. 여러 트랜잭션 관리 기능

3. 비즈니스 로직 수행

WAS의 종류에는 자바 바이트코드로 컴파일되는 언어들에 쓰이는 Tomcat이 있다. Tomcat을 다운받아 보면 여러 폴더들과 파일들이 들어있는 하나의 폴더로 되어 있는데 그 중 특정 폴더에 war파일(스프링으로 코딩한 웹앱의 .class 파일, jsp, 이미지 등을 압축한)을 넣고 명령어를 실행하면 Tomcat을 통해 해당 스프링 서비스가 돌아가게 된다. 요즘은 반대로 스프링 서비스를 Tomcat이 들어있는 jar파일로 빌드해서 배포한다. 

 

Apache? Tomcat? Apache Tomcat???

왜 그냥 톰캣이 아니라 아파치 톰캣일까? 일단 여기서 아파치는 정적 컨텐츠를 처리하는 웹 서버에 속하고, 톰캣은 동적 컨텐츠를 저리하는 WAS에 속하는데 Tomcat은 Apache Tomcat이라는 이름으로 많이 사용되니까 혼랍스럽다. 이렇게 붙여서 쓰는 이유는, 톰캣이 원래 동적 컨텐츠만 처리하는 WAS이지만 2008년에 릴리즈된 Tomcat5.5 버전부터는 정적 컨텐츠를 처리하는 웹서버의 기능이 추가되서이다. 여기서 추가된 웹 서버의 기능이 Apache를 사용하는 것과 성능이 비슷해서라고 한다.

 

Web Server + WAS

웹 서버와 WAS를 함께 사용하는 구조

Web Server와 WAS를 같이 사용하면 Web Server가 정적 컨텐츠만 처리하도록 기능을 분배해서 전체 서버 부담을 줄일 수 있다. 그리고 WAS를 통해 요청에 맞는 데이터를 DB에서 가져와서 비즈니스 로직에 맞게 그때마다 결과를 만들고 제공하면서 자원을 효율적으로 사용할 수 있다.

정적 컨텐츠 제공

웹 문서가 서버에서 클라이언트로 보내질 때 일단은 HMTL 문서만 가고, 여기에 필요한 이미지 파일들은 클라이언트가 서버에게 다시 요청한다. 그때 이미지 같은 정적 콘텐츠들을 웹 서버를 통해 받는다. 처음 웹 문서 보낼 때 이미지 파일이 같이 보내지는 게 아니다.

웹 서버가 정적 컨텐츠만 처리하도록 만들어 두면 정적인 콘텐츠들을 WAS까지 가지 않고도 앞단에서 빠르게 보내줄 수 있다.

 

동적 컨텐츠 제공

들어온 요청에 따라 데이터가 달라질 때가 있다. 웹 서버를 쓰려면 정적 콘텐츠로 전달해야 하니까 이렇게 달라지는 데이터를 전부 미리 만들어놓고 필요할 때 제공해야 한다. 근데 이러기엔 너무 다양한 경우가 있고 자원이 절대적으로 부족하다.

따라서 WAS를 통해 요청이 들어올 때마다 DB 접속 등을 통해 비즈니스 로직을 처리하고 결과물을 만들어서 제공할 수 있다.

 

WAS가 웹 서버의 역할인 정적 콘텐츠 전달까지 다 하면 안되나?

WAS는 DB 조회, 다양한 로직을 처리하는 데에 집중하고, 단순한 정적 컨텐츠는 웹서버에게 맡기는 것이 서로 서버 부하를 줄일 수 있다.

만약 WAS가 정적 콘텐츠까지 다 처리하게 되면 서버 부하가 크고 이로 인해 동적 컨텐츠 처리까지 지연이 되면서 전반적으로 속도가 느려진다. 페이지 하나를 노출하는데 드는 시간이 너무 길어질 것이다.

 

또한, 웹 서버를 통해 로드밸런싱을 하면 여러 대의 WAS를 연결 지어서 사용할 수 있다.

 

웹 서버와 WAS를 분리해두고 웹 서버가 여러 개의 WAS를 관리하면, 앞단에서 웹 서버는 오류가 발생한 WAS를 못 쓰게 막은 뒤 문제를 발생시킨 그 WAS를 재시작시킬 수 있다. 이로써 사용자는 문제가 있었음을 못 느끼고 이용할 수 있다.
또한, 접근 허용 IP 관리와 2대 이상의 서버에서의 세션 관리도 웹 서버에서 처리하면 효율적이다. SSL에 대한 암복호화 처리 시에 웹서버(nginx, 아파치) 를 사용해서 보안을 강화할 수도 있다.

 

 

이제 Nginx가 뭔지 간단히 알아보자.

 

Nginx

웹 서버인데, 아파치보다 동작이 단순하고 전달자 역할만 하기 때문에 동시 커넥션 처리에 특화되어 있다. 본래 웹 서버는 HTML, CSS, js, 이미지와 같은 정적 컨텐츠를 웹 브라우저에 HTTP 프로토콜을 준수해서 전송하는 역할을 한다고 앞서 설명했다. Nginx의 역할을 정말 다양하다. 일단 이번 장에서 볼 역할은 간단히 두 가지 정도다. 가볍게 읽자! 다음 장에서 자세히 볼 거니까..!

 

역할 1. 정적인 리소스를 제공

유저로부터 어떤 요청이 들어왔을 때 이미지나 CSS 같은 정적인 리소스에 대한 요청들을 nginx에게 맡기고, 동적인 건 애플리케이션 서버한테 맡긴다. 이렇게 분할해서 효율적으로 서버를 관리하는 용도로 nginx를 사용한다.

 

역할 2. Reverse Proxy로서 요청과 응답을 중개

클라이언트는 가짜 서버에 요청하고 프록시서버(Nginx)가 배후 서버(WAS)로부터 데이터를 가져온다.

Nginx를 Reverse Proxy로 활용해서 WAS 서버의 부하를 줄일 수 있는 로드 밸런서로 활용할 수 있다. WAS에 reverse proxy를 두는 이유는 클라이언트가 직접 WAS에 요청하는 경우 프로세스 1개가 응답 대기 상태가 되어야만 해서, 다른 요청이 왔을 때 버퍼링이 생길 수 있기 때문이다. 따라서 proxy 서버를 둬서 여러 요청들을 여러 WAS로 배분(로드밸런싱)하는 것이다. nginx.conf 파일에서 location 지시어를 사용해서 요청을 배분한다.

 

Proxy 서버로 두는 방식도 두 가지가 있다. Forward, Reverse 각각을 보자.

 

2-1. Forward Proxy

유저 컴퓨터들의 중개인으로서 유저들의 행동을 감독하고 보안을 유지하기 위해 사용된다.

사용자 A가 요청을 보내면 B가 받아서 C에게 전달하고, C로부터 받은 응답을 다시 B가 A에게 전달한다.

Forwrad Proxy

 

주로 회사나 특정 기관에서 방화벽을 세워서 인터넷 접속에 제한을 두고 일부 인터넷만 사용하도록 할 때 쓴다. 유저들의 컴퓨터가 인터넷에 접속하기 전에 하나의 중개자, Proxy를 세워두는 것이다.

 

여기서 Forward Proxy는 유저 컴퓨터들의 중개인으로서 유저들의 행동을 감독하고 보안을 유지하기 위해 사용된다.

 

2-2. Reverse Proxy

어떤 서버한테 요청을 보낼지 서버 측 중개인으로서 Proxy 서버를 세워서 좀 더 효율적이고 안전하게 요청과 응답을 관리한다.

Reverse Proxy

 

어떤 서버에 요청을 보낼지 중개인인 proxy가 결정해서, 효율적이고 안전하게 요청과 응답을 관리한다. 중요한 행동을 하거나 중요한 데이터를 가진 서버에 도달하기 전에 하나의 레이어가 있으니 보안적으로 더 강해질 수 있다. 

 

 

 그림과 내용 출처 : https://developer88.tistory.com/299 , https://www.youtube.com/watch?v=6FAwAXXj5N0

728x90

'Tech' 카테고리의 다른 글

Redis 이모저모  (2) 2023.12.10
Nginx와 Apache의 등장과 구조, Nginx.conf 파일 [1]  (0) 2022.07.23
나 보려고 만드는 IntelliJ 단축키 (mac)  (0) 2022.04.07
Comments