[Server] 아파치, NginX, 톰캣이 뭔가요?

이 글의 목적

  • 웹서버 관련 아파치, NginX, 톰캣 등에 관한 정확한 개념 및 필요성에 대해서 설명할 수 있다.
  • 얄팍한 코딩사전님이 올려주신 아파치, NginX, 톰캣이 뭔가요?를 보고 정리한 글입니다.

개요

물리적인 장치인 컴퓨터는 그 역할의 개념에 따라 서버와 클라이언트로 나뉜다. 서비스를 제공해주는 컴퓨터를 ‘서버(Server)’, 서비스를 제공받는 컴퓨터를 ‘클라이언트(Client)’라고 한다.

그리고 이 서버는 다른 의미로도 사용된다. 어떤 컴퓨터로 하여금 서버 역할을 하도록 해주는 SW를 ~서버라고 부르기도 한다. 그래서 백엔드 개발자가 서버를 개발한다고 하는데 이 웹서버도 SW의 개념이다.
apacehAndNginX

대표적인 웹서버 - 아파치, NginX


웹서버

웹서버는 웹사이트 서비스를 제공하는 서버이다. 이 웹사이트가 서비스 되기 위해 필요한 것들은 크게 3가지가 있다.

  1. 크롬, 사파리, 파이어폭스, 엣지 등 웹사이트가 수행되는 브라우저
  2. HTML, CSS, 자바스크립트 파일과 같은 브라우저가 읽을 수 있는 파일과 각종 이미지
  3. 기타 여러 데이터들을 서버에서 사용자의 컴퓨터로 보내주는 기능

여기서 2번과 같은 파일들은 서버 컴퓨터의 특정 폴더, 디렉토리에 저장되어 있다. 이 폴더를 외부에서 접근 가능하도록 개방해서 서버에 지정된 웹사이트 주소로 접속하면 이 파일들을 받아갈 수 있도록 하는 것이 웹서버의 기본적인 역할이다.

아파치, NginX, IIS가 대표적인 웹서버이다. 윈도우로 서버를 돌리는게 아니라면 주로 아파치와 NginX를 주로 접하게 된다. 실제로 나는 업무단에서 아파치를 사용하고 있다. 이러한 웹서버 프로그램들을 이용하여 아래와 같은 일들을 수행할 수 있다.

  • 클라이언트가 서버에 정해진 사이트 주소로 접속 → 서버 컴퓨터에 있는 어떤 폴더를 개방 → 그 폴더 내에 있는 HTML 등의 파일들을 보내줌 → 클라이언트에서 웹사이트를 띄움

하지만 위와 같은 일들만 수행한다면 정적웹에 해당한다.

  • 정적 웹(static web): 블로그, 회사소개 페이지처럼 그 안의 내용들이 바뀔 일이 없는 페이지를 고정된 HTML, CSS, JS로 제공함. ex) 완제품들을 갖다놓은 편의점 진열대
  • 동적 웹(static web): 게시판 페이지처럼 항상 같은 내용이 뜨는게 아닌 사이트. 누가 새로 글을 올리거나 댓글을 달면 사이트의 내용이 바뀌기 때문에 고정된 HTML 파일을 이용할 수 없음. DB의 데이터나 변수들에 따라 사용자가 접속할 때 마다 페이지 내용을 만들어 클라이언트에게 제공.
    ex) 요리사가 바로바로 음식을 만들어주는 식당

APM 구동 원리

webServerRelation

위와 같은 동적 웹은 웹서버의 고유 역할이라고 하기는 애매하나 아파치나 NginX의 모듈로 가능하다. 예를들어 아파치 + PHP + MySQL을 연동시켜서 동적인 웹사이트를 제공할 수 있다. 이 조합은 줄여서 APM이라고 부른다. 쉽게말해 아파치에 PHP를 해석할 수 있는 모듈을 셋팅해놓으면 웹 접근이 있을 때 마다 PHP 코드에 적힌 레시피대로 MySQL에 있는 식재료들을 가져와서 아파치가 요리를 해줄 수 있다.

즉, 웹서버는 동적웹과 정적웹 모두 구현이 가능하다. 또는 톰캣, Node.js, Django 내장 서버 등의 전문 요리사들과 손님들 사이에서 서빙이나 매니지먼트를 담당하는 식당 매니저처럼 일하기도 한다

톰캣

요즘은 Spring Boot에 톰캣이 내장되기 때문에 직접은 많이 안 접하게 되지만, 자바랑 JSP로 만든 웹 또는 API 어플리케이션을 실행할 때 Tomcat과 같은 Web Applicaion Server(WAS)가 사용된다. WAS는 Web과 Server 사이에 Application이라는 말이 들어가면서 생긴 합성어이다. 단순히 웹과 서버 사이에서 무언가를 가져다 주는 역할만 하는 것이 아니라 동적 사이트를 전문적으로 처리해주는것과 같은 프로그래밍을 해준다. 아파치와 NginX같은 웹서버도 PHP같은 분식 종류는 요리할 수 있지만 스프링같은 고급 한정식이나 일식으로 넘어가면 톰캣 같은 전문 요리사, WAS의 힘을 빌려야한다. *자바 바이트 코드로 컴파일되는 언어들에 쓰이는 걸로 가장 흔히 사용되는 톰캣이나 Jetty, Undertow 등이 있다.

*자바 바이트 코드(Java bytecode): 자바 가상 머신이 이해할 수 있는 언어로 변환된 자바 소스 코드를 의미한다. 자바 컴파일러에 의해 변환되는 코드의 명령어 크기가 1바이트라서 자바 바이트 코드라고 불린다. 이러한 자바 바이트 코드의 확장자는 .class이다. 자바 바이트 코드는 자바 가상머신만 설치되어 있으면, 어떤 운영체제에서라도 실행 될 수 있다.

톰캣을 사용하는 방법

톰캣을 다운받아보면 여러 폴더들과 파일들이 들어있는 하나의 폴더로 되어 있다. 그 중 특정 폴더에 war 파일을 넣고 명령어를 실행하면 스프링 서비스가 톰캣을 사용하여 돌게 된다. war 파일은 스프링으로 코딩한 웹앱을 빌드하면 생기는 파일이며 그 안에 .class 파일들, jsp, 이미지, CSS, Javascript 파일 등이 압축되어 있다. 요즘은 반대로 스프링을 톰캣이 들어있는 jar 파일로 빌드해서 배포하곤 한다.

JAVA 외에서의 WAS는?

WAS를 검색해보면 주로 JAVA 관련 정보가 제일 많은데 그럼 파이선의 Django나 C#의 닷넷과 같은 경우는 어떻게 되는걸까? JAVA가 아닌 진영에서는 사실 이게 다 정의하기 나름이고 진영마다 배포 구조들도 다 다르기 때문에 딱히 어떤 것이 WAS의 역할인지 구분해서 용어를 쓰지는 않는다.

파이썬의 경우 Gunicorn이 WAS와 비슷할 수 있으나 정확히는 WSGI라는 다른 개념으로 정의가 된다. 그리고 Node.js의 경우 어플리케이션이 WAS 역할까지 한다고 볼 수도 있으나 이것도 관점에 따라 다르게 해석할 수 있기 때문에 자바 외의 진영에서는 WAS 관련하여 쓰는 말이 조금 다르다고 보면 된다.

참고