Tomcat & Nginx

bearMin·2024년 7월 29일

들어가면서

WAS에 대해서 공부를 하면서 가장 대표적인 것이 Tomcat이라는 애기를 들었다. Tomcat은 많이 들어봤지만 무엇인지 몰랐고 이와 비슷한 NginX라는 것도 이번기회에 같이 알아보고자 한다!


WS란?

정의는?

Web Server의 약자로 HTTP 또는 HTTPS를 통해 웹 브라우저에서 요청하는 HTML 문서나 오브젝트(이미지 파일 등)을 전송해주는 서비스 프로그램

말이 어렵지만 쉽게 얘기해자면 정적인 파일들을 제공하기 위한 서버라고 할 수 있다. 예시처럼 HTML과 CSS, 이미지 파일 등과 같은 정적인 컨텐츠를 처리해주는 서버인 것이다.


역할은?

당연하게도 정적인 컨텐츠를 처리해주는 것이 주된 역할이다.

단순히 저장된 웹 리소스들을 클라이언트로 전달하고, 클라이언트로부터 컨텐츠를 전달받아 저장하거나 처리하는데, 이때 주로 이미지나 CSS, JavaScript를 포함한 HTML 문서를 처리한다.

이처럼 단순하게 정적인 컨텐츠를 처리할 때도 있지만 우리는 정적인 컨텐츠만을 사용하지 않는다.


때문에 사용자로부터 동적인 요청이 들어왔을 때에는 해당 요청을 웹 서버 자체적으로 처리를 할 수 없고 이를 위해서 WAS에 요청을 하게 되는 것이다.


대표적인 WS의 종류로는 Apache, Nginx 등이 있다!


WAS란?

정의는?

Web Application Server의 약자로 클라이언트의 요청에 대해 동적으로 웹 페이지를 생성하고 데이터베이스와의 연동 등의 업무를 수행한다.

이게 무슨 뜻이냐 하면 결국 WS에서 들어온 요청 중 동적인 처리가 필요한 경우 WAS까지 요청이 도달하게 되고, WS 내에서 처리가 가능하다면 WAS를 거치지 않고 요청을 처리하게 된다.


여기서 헷갈릴 수 있는 점은 WAS는 동적인 컨텐츠만 관리할 수 있는 것이 아니다. 주로 동적인 컨텐츠를 관리하지만 정적인 컨텐츠를 전달할 수 있는 기능 또한 제공된다.


역할은?

주로 동적인 컨텐츠를 처리해준다.


조금 더 자세하게 얘기를 해보자면

  1. 프로그램 실행 환경과 데이터베이스 접속 기능 제공
  2. 여러 개의 트랜잭션 관리
  3. 업무를 처리하는 비즈니스 로직 수행

등이 있다.


대표적인 WAS의 종류로는 Tomcat, JBoss 등이 있다!


왜 둘 다 쓰지?

WAS는 정적인 컨텐츠도 제공이 가능하다고 한다. 그렇다면 왜 WS와 WAS 둘 다 쓰는 것일까?


  1. 서버의 효율적인 사용을 위해서

    둘을 함께 사용하게 되면 로드 밸런싱과 확장성을 쉽게 구현할 수 있다. 이를 통해 서버의 부하를 분산시켜 처리 성능을 향상시킬 수 있고, 분리가 될 경우 독립적으로 확장이 가능해져 시스템 전체의 성능 또한 향상시킬 수 있다.

    💡 로드 밸런싱이란?
    클라이언트의 요청을 여러 대의 서버에 분산시켜 처리하는 것

  1. 유지보수와 확장성 증가

    분리하면 각각의 역할에 집중할 수 있게 된다. WS는 정적인 컨텐츠를 처리하고, WAS는 동적인 컨텐츠를 처리하는데, 이렇게 역할을 분리하게 된다면 유지보수와 확장이 보다 쉬워진다.


  1. 보안성 강화

    클라이언트와 WAS가 직접 연결이 되어 있다면 중요한 설정 파일들이 노출이 될 수 있다. 때문에 WAS 설정 파일을 외부에 노출시키지 않도록 하기 위해서 WS를 앞단에 먼저 배치를 시킨다. 이렇게 된다면 WS가 해킹에 의해 무력화 되더라도 WAS는 접근하는 port가 다르기 때문에 데이터를 보호할 수 있다.

    💡 port란?
    Server와 Web Server 프로그램 간에 연결을 하기 위한 플러그와 같은 역할을 하는 것

Apache란?

그전에

먼저 알아야할 것이 있다. Apache에 대해서 많이 들어본 사람도 있을 텐데 이 Apache는 Apache HTTP Server를 개발하는 Apache 그룹을 모태로 하여 설립된 오픈 소스 소프트웨어 프로젝트를 운영하는 비영리 단체이다.


Apache 재단의 가장 유명한 프로젝트는 Web Server의 대표적인 예시로 소개된 Apache HTTP Server이다. 소프트웨어에서 Apache라고 하면 해당 Web Server 프로그램을 가리킬 정도로 인지도가 높다.


때문에 우리가 얘기할 Apache는 Apache 재단에서 만든 Web Server인 Apache HTTP Server이다!


정의는?

대표적인 Web Server 소프트웨어로 HTTP Apache Server라고도 불리며 HTTP Web Server이다.

위에서 간단하게 얘기를 했지만 Web Server를 얘기할 때 나오는 가장 대표적인 예시로 Apache를 빼놓고 얘기할 수 없다.


이 Apache Server는 HTTP 요청을 처리할 수 있으며 클라이언트가 GET, POST, DELETE 같은 메소드를 요청하면 그에 대한 결과값을 반환한다.

이 Apache는 굉장히 다양하고 기능적인 면에서 우수하다. 또한 구축이 쉽다는 이유 때문에 많이 사용을 한다.

다만, Apache 자체만으로 매우 무겁고 C10K라는 취약점도 발견이 되었다.

💡 C10K란?
동시 사용자 1만명이 접속하는 서버를 구현하는 문제이다.

Apache는 요청이 들어올 때 각 요청에 프로세스를 할당하는 Process Driven 방식을 사용하였는데 PC가 증가하고 발전함에 따라 모든 요청에 프로세스를 생성하면서 서버는 무거워지기 시작했다.

또한, HTTP의 keep alive로 인해 처리가 되어도 프로세스의 연결이 종료되지 않아 대기하는 프로세스들이 많아졌다.

이를 보완하기 위해 프로세스 생성 제한 등 성능 개선을 위한 발전을 하였지만 근본적인 구조를 개선하지 못하였다..


Nginx란?

정의는?

오픈소스 Web Server로 고성능 및 확장 가능한 웹 응용 프로그램을 제공하기 위해 설계된 소프트웨어

Apache를 보완하기 위해 나온 Nginx는 동시 접속 처리에 특화된 경량 Web Server이다. 또한 Reverse Proxy Server로 WAS의 서버 부하를 줄일 수 있는 로드 밸런서로 사용이 된다.


특히나 이 Nginx는 기존 Apache의 Process Driven 동작 방식에서 Event Driven 방식을 사용하여 요청을 처리한다.

기존의 Apache가 C10K 라는 문제가 발생한 원인하나의 요청에 하나의 프로세스를 할당해주는 Process Driven 방식 때문이었다. 이를 해결하기 위해 발생하는 모든 요청과 응답을 모두 Event라는 개념으로 취급을 하였다.

때문에 Worker Process가 처리해야할 Event들을 쌓아놓고 순서대로 처리하는 방식으로 요청을 처리한다. 이로 인해 Process를 발생하는 것보다 훨씬 효율적인 처리가 가능해졌다.


Reverse Proxy Server란?

Proxy Server가 무엇인지 먼저 알아야 할 것 같다.

Proxy Server클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터 시스템이나 응용 프로그램을 가리킨다.

서버와 클라이언트 사이에 통신 대리를 수행하는 것을 가리켜 Proxy, 그 통신 대리 기능을 하는 것Proxy Server라고 한다.

이 Proxy Server를 사용하면 보안성, 성능, 안정성을 향상시킬 수 있다.


이 Proxy Server에는 Forward Proxy Server와 Reserve Proxy Server가 있는데, 먼저 Forward Proxy Server에 대해서 설명을 해보겠다.

우리가 흔히 얘기하는 Proxy Server란 Forward Proxy Server를 의미한다. 이 Proxy Server는 클라이언트가 Web Server에 요청을 보내면 중간에 Proxy Server가 가로챈다.


이 Forward Proxy Server를 사용하는 이유는 학교나 기업 등과 같은 기관에 속한 사람들이 제한적인 인터넷 사용을 위해 방화벽을 사용한다. 이러한 제한을 위해서 사용하는데, 기관의 사람들이 웹 사이트에 직접적으로 방문하는 것을 방지한다.

또한 Forward Proxy Server는 사용자의 정체를 숨겨준다. 기관을 역추적할 수 있게 된다면 보안상 문제가 심각해진다. 하지만 Forward Proxy Server를 사용하게 된다면 IP 주소를 역추적 해도 Proxy Server만 나오기 때문에 자신을 숨길 수 있다.


그렇다면 Reverse Proxy Server란 무엇일까?

Forward Proxy Server와는 반대이다. Forward Proxy Server는 클라이언트 앞에 있었다면 Reverse Proxy Server는 Web Server 앞에 놓여져있다.


이 Reverse Proxy Server는 로드 밸런싱에 사용이 된다. 유명 웹 사이트는 진짜 수많은 사람들이 방문을 하고 이 대량의 트래픽을 하나의 서버가 감당하기엔 매우 어렵다. 하지만 Reverse Proxy Server를 사용하게 된다면 특정 서버가 과부화 되지 않도록 로드 밸런싱이 가능해진다.

또한 성능 향상을 위한 캐시 데이터를 저장할 수 있습니다. 어떤 한국에 있는 사용자가 미국에 Web Server를 두고 있는 사이트에 접속할 때, Reverse Proxy Server가 한국에 있다면 한국에 있는 Reverse Proxy Server와 통신을 하게 되고, 캐싱이 되어있는 데이터를 사용할 경우 더 빠른 성능을 보여줄 수 있다.

그리고 Forward Proxy Server와 같이 보안에 좋다. 본래 서버의 IP 주소를 노출시킬 필요가 없으며, SSL 암호화에 좋다. 보통 서버가 클라이언트와 통신할 때 SSL/TSL 로 암호화, 복호화를 할 경우 많은 비용이 든다. 그러나 Reverse Proxy Server를 사용하면 들어오는 요청을 모두 복호화하고 나가는 응답을 암호화해주므로 클라이언트와 안전한 통신이 가능하며 본래 서버의 부담을 줄여준다.


Tomcat이란?

정의는?

Apache Tomcat이라고도 하며 Java 기반의 Servlet Container이자 Web Application Server

Apache? 맞다. 아까 위에서 설명한 WS의 Apache가 아닌 Apache 재단에서 만든 WAS로 Apache Tomcat이라고 한다.

이 Tomcat은 Java Web Application Server로 Servlet과 JSP를 지원한다.

→ 아마 우리가 알아야하는 가장 큰 이유일 것이다!


장점은?

그렇다면 Tomcat의 장점에는 어떠한 것들이 있을까?

  1. 경량화된 Server

    가볍고 빠르게 동작한다. 때문에 Web Application의 배포 및 실행이 빠르게 이루어진다.


  1. 개발과 배포의 용이성

    Java Web Application을 개발하고 배포하는데 필요한 대부분의 기능을 제공하며, 많은 개발자와 커뮤니티가 활발하게 참여하고 있어 다양한 플러그인과 라이브러리를 사용할 수 있다.


  1. 높은 호환성

    Servlet, JSP 등 다양한 Java 기술을 기반으로 구현이 되어있으며, 다양한 플랫폼 및 운영체제에서 호환성을 보장한다.


  1. 보안성

    SSL/TSL 암호화를 지원하며 Web Application의 인증 및 권한 부여를 위한 보안 기능을 제공한다.


  1. 무료 및 오픈소스

    Apache 라이선스에 따라 무료로 사용할 수 있으며, 오픈소스로 개발이 되고 있다. 따라서 Tomcat을 자유롭게 다운로드하여 사용할 수 있다.


어떤 조합을 사용하지?

위에서도 얘기했지만 WS와 WAS를 둘 다 사용을 해야 우리가 다양한 이점을 가질 수 있다. 그렇다면 우리는 어떤 WS를 사용해야하고 어떤 WAS를 사용해야할까?


WAS는 사실 Spring Boot에는 Tomcat이 내장이 되어있다. 물론 바꿔서 사용을 할 수 있지만 굳이 그렇게 사용을 하진 않는다.

이미 Tomcat과의 호환이 매우 잘 되어있으며 다른 WAS를 사용할 경우 추가적인 설정과 구성이 필요한데 이는 Spring Boot의 장점인 설정과 같은 부분도 간편하게 해서 개발자는 비즈니스 로직에만 신경을 쓰자! 에 어긋나기 때문이다.

따라서 추가적으로 다른 WAS를 사용하고 싶다면 Spring을 사용하여 직접 설정부분부터 해보는 것을 추천한다.


지금은 Spring Boot를 사용할 때 좋은 조합에 대해서 설명을 해보겠다.


Apache & Tomcat은 어떨까?

  1. 전통적이고 안정된 조합

    둘 다 Apache 에서 만들어졌으며 역사와 광범위한 커뮤니티 지원을 가진 안정적인 조합이다.


  1. 모듈화와 유연성

    또한 Apache는 모듈을 사용하여 기능을 확장할 수 있으며 이는 Tomcat과 연동이 최적화되어 고급 기능을 쉽게 구현할 수 있다.


  1. 정적 컨텐츠 처리

    Apache는 정적 컨텐츠를 매우 효율적으로 처리하며, Tomcat에 동적 요청만 전달하여 서버의 부하를 줄일 수 있다.


  1. 보안과 접근 제어

    Apache는 다양한 인증 및 접근 제어 모듈을 제공하여 Web Application 앞단에서 보안 정책을 쉽게 구현할 수 있다.


Nginx & Tomcat은 어떨까?

  1. 고성능과 낮은 메모리 사용

    Nginx는 높은 성능과 적은 메모리 사용으로 유명하며, 특히 많은 수의 동시 연결을 처리하는데 매우 효율적이다.


  1. Reverse Proxy와 로드 밸런싱

    Nginx는 Reverse Proxy와 로드 밸런싱 기능을 제공하며 이를 통해 Tomcat으로의 요청 분산이 쉽고 효율적이며, 가용성과 확장성을 높일 수 있다.


  1. 정적 컨텐츠 처리

    Nginx는 정적 컨텐츠를 매우 빠르게 처리할 수 있으며 동적 동작만 Tomcat으로 넘겨주어 성능을 최적화할 수 있다.


  1. 간편한 설정과 구성

    Nginx의 설정 파일은 직관적이고 간결하며 설정이 비교적 쉽다. 때문에 복잡한 설정이 필요없다.


  1. SSL/TLS 성능

    Nginx는 TLS/SSL 처리 성능이 뛰어나며 SSL 종료를 처리하여 Tomcat의 부담을 줄일 수 있다.


그래서 뭐 쓰라고?

사실 어떠한 선택은 자유지만, 주로 선택을 해야하는 경우는 있다.


Apache와 Tomcat을 선택하는 경우

  • 전통적인 설정을 선호하고 다양한 Apache 모듈을 활용할 때
  • 세부적인 보안 설정이나 복잡한 인증 및 접근 제어가 필요할 때
  • Apache 모듈을 통해 Tomcat과 깊은 통합을 원할 때

Nginx와 Tomcat을 선택하는 경우

  • 높은 성능과 낮은 메모리 사용을 중시할 때
  • 많은 동시 연결을 효율적으로 처리해야할 때
  • 간단하고 강력한 Reverse Proxy 및 로드 밸런싱 기능이 필요할 때

어떠한 경우가 필요한지 곰곰히 생각해보고 자신이 원하는 경우일 때를 선택하여 그에 맞는 조합을 선택하면 좋을 것 같다!


정리하자면

WS는 정적인 컨텐츠를 WAS는 동적인 컨텐츠를 처리한다!

WS의 예시로는 Apache와 Nginx, WAS의 예시로는 Tomcat이 있다!

Apache의 Process Driven 구조를 바꾸고자 Nginx가 나왔으며 Nginx는 Event Driven 구조이다!

profile
소소한 공부기록

0개의 댓글