본문 바로가기
Engineering WIKI/Docs

Apache 와 Tomcat의 차이

by wonos 2019. 2. 18.

아파치 & 톰캣 개념

1. 아파치 ⇒ 웹서버 (80 포트)

  • 웹서버 (Apache, IIS, Nginx)는 하드웨어와 소프트웨어 두 분야에서 다른 의미로 부릅니다.
    • 하드웨어 : 웹서버 소프트웨어와 웹 사이트의 구성 요소 파일을 저장하는 컴퓨터를 의미한다. (HTML 문서, Image, CSS 파일 등)
    • 소프트웨어 : 보통 HTTP 서버를 의미한다. HTTP 서버는 URL(웹 주소) 및 HTTP(프로토콜 기능)을 이해하는 소프트웨어이다. HTTP 서버는 저장하는 웹 사이트의 도메인 이름을 통해 액세스 할 수 있으며, 이러한 호스팅 된 웹 사이트의 콘텐츠를 최종 사용자의 장치로 전달한다.
    IIS는 윈도우 환경에서 사용하는 웹 서버 프로그램입니다. 만약 윈도우 환경이 아니라면 Apache, Nginx를 이용할 수 있습니다. 물론 윈도우 환경에서도 Apache, Nginx를 이용할 수 있습니다.
  • Nginx 아키텍처

  • Nginx는 하나의 Master Process와 여러 개의 Worker Process로 구성되어 실행합니다.
  • Master Process 에서는 설정 파일을 읽고, Worker Process를 관리합니다.
  • 모든 요청은 Worker Process에서 처리하는 데 Worker Process의 개수는 설정 파일에서 정의할 수 있으며 정의된 프로세스 개수와 사용가능한 CPU 코어 숫자에 맞게 자동으로 정의됩니다.
  • 클라이언트와 HTTP 통신을 하는 걸 볼 수 있으며, 캐싱, 프록시 기능 또한 사용할 수 있습니다
  • 결국 아파치 서버란 클라이언트에서 요청하는 HTTP 요청을 처리하는 웹서버를 의미한다. 이는 정적타입(HTML, CSS, 이미지 등)의 데이터만 처리하기 때문에 톰캣이란 것이 등장한다.

2. Tomcat ⇒ WAS(Web Application Server) (8080 포트)

  • 톰캣은 흔히 WAS(아파치사의 톰켓, 티멕스의 제우스, 레드헷의 JBOSS) 라고 말합니다.
    • Java EE는 web container와 ejb container로 구성되어 있는데, 톰켓은 web container만 구현되어 있습니다.
    • 하지만 다른 WAS인 JBoss는 web container, ejb container 모두 지원합니다. 그렇기에 톰켓은 다른 WAS에 비해 가볍고 Java EE 서버가 필요없는 Spring과 같은 프레임 워크를 사용하는 응용 프로그램에서 많이 사용됩니다.
  • 컨테이너 : 동적인 데이터들을 가공하여 정적인 파일로 만들어주는 모듈
  • 서블릿 : 클라이언트의 요청을 받고 요청을 처리하여 결과를 클라이언트에게 제공하는 자바인터페이스. java.servlet.package에 정의된 인터페이스로서 서블릿의 라이프 사이클을 위한 세 가지 필수적인 메소드들을 정의합니다. - init(), service(), destory()
  • 서블릿 컨테이너 : 서블릿들을 모아 관리하며, 새로운 요청이 들어올 때마다 새로운 스레드를 생성. 작업이 끝난 서블릿 스레드 자동 제거 합니다.
  • WAS는 웹 서버와 웹 컨테이너의 결합으로 다양한 기능을 컨테이너에 구현하여 다양한 역할을 수행할 수 있는 서비스를 말한다. 아파치 서버와 다르게 DB연결, 다른 응용프로그램과 상호 작용등 동적인 기능들을 사용 할 수 있습니다.
    • WAS는 일반적으로 Web Server와 Web Container로 구성되어 있습니다.
    • WAS 자체만으로도 http 통신 처리를 할 수 있는 Web Server가 있습니다.
    • 클라이언트의 요청이 있을 때 내부의 프로그램을 통해 결과를 만들어내고 이것을 다시 클라이언트에게 전달해주는 역할을 합니다.

 

아파치 톰캣으로 부르는 이유

기본적으로 위처럼 아파치와 톰캣은 분리 되어 있지만, 톰캣 안에 있는 컨테이너를 통해 일부 아파치의 기능을 발휘하기 때문에 보통 아파치 톰캣으로 합쳐서 부르곤 한다.

웹서버를 앞 단에 두는 이유

  • Nginx, Apache 등 웹 서버 소프트웨어가 제공하는 기능을 쓰기 위해서 사용합니다.

대표적인 4가지

  1. Web Server에 SSL 적용
  2. 웹 서버 자체적으로 SSL 적용을 할 수 있어 보안 강화를 해줍니다.
  3. 리버스 프록시로 사용 가능
  4. 리버스 프록시를 사용함으로 써 사용자들이 어떤 WAS에서 제공하는 지 알 수 없습니다.
  5. 로드 밸런서 이용 가능
  6. 로드 밸런싱을 통해 여러 대의 WAS를 연결할 수 있고, 두 대의 WAS가 동작하고 있다 가정할 때 서비스에오류가 생겨도 하나의 WAS를 중단시켜도 하나의 WAS가 돌아가기에 무중단 서비스 배포를 할 수 있습니다.
  7. 캐싱 서버 이용 가능
  8. 캐싱 서버로 이용함으로 써 사용자가 이전에 받아본 이미지 등을 DB를 거치지 않고 받아볼 수 있습니다.

아파치와 Tomcat의 차이

  • 웹 서버는 정적인 데이터를 처리하는 서버입니다.
  • 이미지나 단순 html 파일과 같은 리소스를 제공하는 서버는 웹 서버를 통하면 WAS보다 빠릅니다.
  • WAS는 동적인 데이터를 처리하는 서버입니다.
  • DB와 연결되어 데이터를 주고 받거나 프로그램으로 데이터 조작이 필요한 경우에는 WAS를 활용해야 합니다.

WAS 동작도

사용자 요청 → 웹서버에서 container로 전송, JSP → 컨테이너에서 Servlet 구동환경 제공 (동적데이터 처리) → web server에 결과값 전송 → 웹서버에서 클라이언트 페이지에 전송


웹 브라우저의 동작 원리

 

클라이언트 - 웹서버 - WAS -DB 아키텍처

  • 그럼 어떻게 서비스를 구성할까?
    • 클라이언트는 웹서버와 통신하고 웹 서버는 요청에 따라 각 WAS에 보내고 WAS에선 다시 로직을 수행한 후 Web Server를 통해 클라이언트에 요청한 컨텐츠를 전달합니다.
  • 만약 사용자가 apitest1234.co.kr:80 포트로 접근하면 80포트에서 실행하고 있는 Nginx에 접근을 합니다. 그럼 여기 Nginx에서는 정적인 문서만 제공해줍니다. 프런트에서 작업(React)한 작업한 결과물을 nginx에서 설정해줌으로써 받아볼 수 있습니다.
  • api 요청이 spring/login 이면, nginx에서 8000번 포트에 있는 스프링 애플리케이션에 포트 포워딩을 함으로 써 로직이 8000포트에 실행되고 있는 Spring 애플리케이션이 동작하는 걸 볼 수 있습니다.
  • 만약 사용자가 apitest1234.co.kr:8000 포트로 접근하면 Nginx를 안거치고 8000번 포트에 실행중인 WAS에 접근하는 데 접근이 불가합니다. 왜냐면 앞 단 웹서버 Nginx에서 방화벽 처리가 되기에 접근이 불가합니다.