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

📜 라디오 대본

얄코: 쇼파에서 눈 감고 듣는 얄코 라디오! 얄코: 오늘은 웹 서버와 관련 주제들을 알아보겠습니다. 얄코: 저는 얄팍한 개발자 얄코 미토: 미친토끼 미토에요 미토: 얄코씨가 옛날에 서버란거 알려주는 영상에서 미토: 서버가 컴퓨터라고 했잖아요 컴퓨터. 하드웨아 물리적인 기계 얄코: 네, 정확히 말하자면 역할의 개념이라고 했었죠. 얄코: 같은 컴퓨터도 서비스를 해주느냐 제공받느냐에 따라 얄코: 서버와 클라이언트로 나뉜다고요 미토: 그럼 이 웹서버는 뭐에요? 이것도 무슨 기계인 거인 거에요? 얄코: 서버란 말이 다른 의미로도 사용되는데 얄코: 어떤 컴퓨터로 하여금 서버 역할을 하도록 해주는 얄코: 소프트웨어를 무슨무슨 서버라고 부르기도 해요. 얄코: 그래서 백엔드 개발자가 서버를 개발한다고 하잖아요. 얄코: 이 웹 서버도 소프트웨어의 개념이에요. 얄코: 아파치랑 NginX가 대표적인 제품이죠. 미토: 그럼 '웹' 서버니까 이 컴퓨터를, 서버들 중에서도 미토: 웹사이트를 제공하는 서버로 만들어주는 뭐 그런 서비스겠네요? 얄코: 그렇죠. 자, 웹사이트가 서비스될 때 필요한 것들이 뭐가 있죠? 미토: 웹사이트는 브라우저에서 돌아가는거잖아요 브라우저 미토: 크롬이나 사파리나 파이어폭스, 엣지 같은거요 미토: 그 브라우저가 읽을 수 있는 파일들 미토: HTML, CSS, 자바스크립트 파일들이랑 미토: 각종 이미지, 기타 여러 데이터들을 갖다가 미토: 서버에서 사용자의 컴퓨터로다가 보내줄 수 있어야죠. 얄코: 맞아요. 이 파일들은 원래 서버 컴퓨터에 저장돼있죠. 얄코: 이 서버의 특정 폴더, 디렉토리에 이것들을 넣어두면 얄코: 이 폴더를 외부에서 접근 가능하도록 개방해서 얄코: 서버에 지정된 웹사이트 주소로 접속하면 얄코: 이것들을 받아갈 수 있도록 하는 것이 얄코: 이 웹서버의 기본적인 역할 중 하나에요. 미토: 음 그럼 이 웹서버라는 프로그램들 미토: 아파치랑 이 이건 또 어떻게 읽어 N g i n X? 미토: 느그 인 엑스에요? 얄코: 엔진 엑스요 엔진 엑스 미토: 그리고 이건 잘 못 들어본건데 IIS? 얄코: IIS는 윈도우 서버에서 쓰이는거라 생소하죠. 얄코: 이 아파치, NginX, IIS가 대표적인 웹 서버에요. 얄코: 윈도우로 서버를 돌리는 게 아닌 이상은 얄코: 아파치랑 NginX 둘 중 하나를 접하게 될 거구요 미토: 그럼 이 프로그램들로 서버 컴퓨터에 있는 미토: 어떤 폴더를 개방을 해가지고다가 거기 들어있는 미토: HTML 등의 파일들로 웹사이트를 제공할 수 있는거네요. 미토: 서버에 정해진 사이트 주소로 접속을 하면 미토: 그 파일들을 꺼내가서 웹사이트를 띄우게끄름 미토: 근데 이렇게 되면 이건 정적 웹이잖아요? 얄코: 맞아요. 전에 정적 웹과 동적 웹 영상에서 다뤘었는데 얄코: 정적 웹은 블로그 페이지나 회사 소개 페이지처럼 얄코: 그 안의 내용들이 바뀔 일이 없는 웹페이지를 얄코: 고정된 HTML, CSS, 자바스크립트로 제공하는 얄코: 말하자면 완제품들을 갖다놓은 편의점 진열대라고 했었죠. 미토: 반면에 동적 웹이란거는 게시판 페이지처럼 미토: 항상 같은 내용이 뜨는게 아닌 사이트들인 것인거죠. 미토: 누가 새로 글을 올리거나 댓글 달면 사이트 내용이 바뀌니까 미토: 고정된 HTML파일을 진열해서 제공할 수 있는거가 아니잖아요. 미토: 데이터베이스에 있는 데이터들이나 뭐 그런 변수들에 따라서 미토: 사용자가 접속할 때마다 그때그때 미토: 페이지 내용이 만들어져가지고 와지는거죠. 미토: 이거는 요리사가 바로바로 음식을 만들어주는 식당같은거랬구요. 얄코: 맞아요. 이런 동적 웹을 제공하는 것도 얄코: 웹서버의 고유 역할로 정의해야 할지는 애매하지만 얄코: 아파치나 NginX의 모듈로 할 수 있어요. 얄코: 이를테면 오랫동안 사용되어온 방법으로 얄코: 아파치랑 PHP, MySQL을 연동시켜서 얄코: 동적인 PHP 웹사이트를 제공하는 방식이 있구요. 미토: Apache PHP MySQL 조합이라그래가지고 미토: APM이라고 하죠 APM. 추억돋네 옛날에 많이 했는데 얄코: 그렇죠. 아파치에 PHP를 해석할 수 있는 모듈을 세팅해놓으면 얄코: 웹 접근이 있을 때마다 PHP 코드에 적힌 레시피대로 얄코: MySQL에 있는 식재료들을 가져와서 아파치가 요리를 해주는거에요. 얄코: 물론 역시 웹서버인 NginX로도 다 가능한 것들이구요. 미토: 그러니까 얘네가, 정적 웹일 때는 편돌이도 하고 미토: PHP로 만든 동적 웹일 때는 요리사도 하는거네요. 얄코: 적절하네요. 또는 그냥 식당 매니저로서 일하기도 해요. 얄코: 톰캣이나 Node.js, Django 내장 서버 등의 전문 요리사들과 얄코: 손님들 사이에서 서빙이나 매니지먼트를 담당하기도 하죠. 미토: 그 부분이 좀 설명을 들어야 될 것들이 많을 것 같네? 미토: 일단 전부터 궁금했는데 톰캣이 뭐에요 톰켓? 미토: 아파치를 톰캣이랑 연동한다느니 그런 얘기 많이 들었는데 미토: 그게 뭔지를 내가 이참에 좀 알아야겠어 얄코: 요즘은 스프링 부트에 톰캣이 내장되기 때문에 직접은 많이 안 접하지만 얄코: 자바랑 JSP로 만든 웹 또는 API 어플리케이션을 실행할때 얄코: 이 톰캣 같은 Web Application Server가 사용돼요. 얄코: 줄여서 WAS 또는 와스라고 하기도 하는데 얄코: 지금부터 와스라고 부를게요 얄코: '웹'이랑 '서버' 사이에 '어플리케이션'이란 말이 들어가서 W A S가 됐죠. 얄코: 단순히 뭘 갖다주는게 아니라 뭔가 프로그래밍된 걸 더 한다는거에요. 얄코: 이건 동적 사이트를 전문적으로 처리해주는거라고 보시면 돼요. 얄코: 아파치나 NginX같은 웹서버도 PHP같은 분식 종류는 요리할 수 있지만 얄코: 스프링같은 고급한정식이나 일식으로 넘어가면 톰캣 같은 전문 요리사 얄코: WAS의 손을 빌려야 하는거죠. 얄코: 자바 바이트코드로 컴파일되는 언어들에 쓰이는걸로 얄코: 가장 흔히 사용되는 톰캣이나 Jetty, Undertow 등이 있구요 얄코: 톰캣을 사용하는 방법을 짧게 설명하자면 얄코: 스프링으로 코딩한 웹앱을 war 파일로 빌드하면 그 안에 얄코: .class 파일들이랑, jsp, 이미지, CSS, 자바스크립트 파일 등이 압축돼있어요. 얄코: 톰캣을 다운받아보면 여러 폴더들과 파일들이 들어있는 하나의 폴더로 돼있는데 얄코: 그 중 특정 폴더에 방금 말한 war 파일을 넣고 명령어를 실행하면 얄코: 스프링 서비스가 톰캣을 사용해서 돌게 되는거에요. 얄코: 요즘은 반대로 스프링을 톰캣이 들어있는 jar 파일로 빌드해서 배포하곤 하죠. 얄코: 여튼 아파치와 NginX가 웹서버, 톰캣은 WAS다 기억하시면 돼요. 미토: 그럼 파이썬의 장고나 C#의 닷넷처럼 다른 것들에선요? 미토: 와스 검색해보니까 죄 자바 것들만 나오네? 얄코: 사실 이게 다 정의하기 나름이고 진영마다 배포 구조들도 달라서 얄코: 다른 진영에서는 딱히 어떤 것이 WAS 역할이다 얄코: 이렇게 딱히 구분해서 용어를 쓰지는 않는걸로 보여요. 얄코: 파이썬 같은 경우 Gunicorn이 비슷할 수 있는데 얄코: 이거는 WSGI라고 좀 다른 개념으로 정의가 되고 얄코: Node.js에서처럼 어플리케이션이 WAS 역할까지 하거나 얄코: (이것도 관점에 따라 달라질 수 있겠지만) 얄코: 이처럼 쓰는 말이 다르다고 보시면 돼요, 자바 외의 진영에선. 얄코: 공통적인건, 웹서버를 앞단에 두고 얄코: 즉 방문자들을 이 웹서버가 응접실에서 접대하도록 하고 그 뒤에서 얄코: WAS든 뭐라 부르든 전문 요리사가 요리를 하고 있는거죠. 얄코: 일단 이번 화에서는 편의상 웹서버랑 구분하기 위해서 얄코: 요리사 역할을 하는것들을 다 묶어서 WAS라고 부를게요. 얄코: 여튼 아파치같은 웹서버와 자주 묶여서 언급되는게 얄코: 이 WAS, 톰캣이기 때문에, 특히 자바 많이 하는 한국에서는요 얄코: 그래서 이처럼 한 주제로 묶어서 다뤄봤어요. 미토: 그러면은 이 톰캐트가 스프링같은 고난도 요리를 해주고 미토: 그거를 아파치가 손님들한테 서빙을 하는 그런 그림이네요. 얄코: 그렇죠. 사실 톰캣 등의 WAS들도 방문자들에게 직접 얄코: 동적으로 요리해낸 웹을 서빙해서 갖다줄 수도 있고 얄코: 진열돼있는 정적 리소스들을 건내주는 일도 할 수는 있어요. 얄코: 아파치 없이 톰캣만으로도 웹사이트를 제공할 수는 있다는거죠. 미토: 그런데 그렇게 안하는 이유가 있다는거아녜요 미토: 듣기로는 톰캣이 정적 요소들 넘겨주는 편돌이 일에 좀 느려서 미토: 아파치가 그걸 대신 해준다 그러던데 맞는거에요? 얄코: 예전에는 그랬다는데 이젠 톰캣의 정적 리소스 제공도 빨라져서 얄코: 그 점에서는 의미있는 차이가 없다고 하구요 얄코: 톰캣 뿐 아니라 Node.js 서버 어플리케이션이나 닷넷 등 얄코: 이 WAS들을 뒷단에 두고 WebServer를 앞단에 둬서 얄코: 아파치나 NginX가 손님들을 맞도록 하는 이유들이 따로 있어요. 얄코: 아까 웹 서버가 기본적으로 하는 일들 얄코: 정적 또는 가벼운 동적 리소스를 제공하는 역할을 얘기했었는데 얄코: 이 아파치, 그리고 NginX는 그것 말고도 다양한 기능들을 제공해요. 얄코: 그중에 먼저, reverse proxy가 있어요. 미토: 나 프록시 아는데, 그거 뭐 대신한다는 뜻이잖아요 미토: 사용자들이 사이트나 어디 접속할 때, 자기 아이피 주소 숨기려고 미토: 중간에 프록시라는거 둬서 그걸 통해서다가 데이터 주고받는거요 얄코: 네, 그거는 forward proxy라고 하죠. 얄코: 우리 서버에 방문하는 손님들이 자기네 집 주소를 감추는거에요. 얄코: 대절버스를 proxy라는 정류장에서 타고오는 식으로요. 얄코: 그런데 여기서 웹서버가 해주는 건 reverse proxy에요. 얄코: 이건 반대로, 손님들에게서 서버의 정보를 감추는거죠. 미토: 아니, 손님들이 서버가 어딨는지 다 알고 찾아왔는데 미토: 거기에 프록시로 감출거가 뭐가 있어요? 얄코: 서버란 집의 관리자도 보안상 내부 구조를 감출 필요가 있잖아요. 얄코: 정적 리소스들이 진열된 방은 어디인지 얄코: 톰캣같은 요리사들이 동적 요소를 요리하는 주방은 어디인지 얄코: 이런 것들을 드러내지 않고, 아파치나 NginX가 얄코: 응접실에서 대신 손님들을 맞이하고 요리를 내오는거죠. 얄코: 서버 내부적으로 파일들이 어느 폴더에 들어있는지 얄코: 서비스가 몇 번 포트로 돌고 있는지 등을 감추는거에요 미토: 오 얄코: 한 서버에서 이러쿵닷컴 저러쿵닷컴 요로쿵닷컴이 제공된다 치면 얄코: 이들 중 어느 주소로 사람들이 접속하든 얄코: 이 웹서버가 손님을 맞아서, 어떤 닷컴으로 찾아서 왔는지를 보고 얄코: 진열된 걸 가져오든 톰캣한테 주문 전달해서 요리 받아오든 얄코: 자기가 PHP로 라면 끓여서 내오든 하는거에요. 미토: 어떤 웹 프레임워크든 앞단에 아파치나 NginX를 두는게 미토: 이런 보안 측면에서의 이유가 큰 거네요. 얄코: 그렇죠. 구글에 '아파치 보안 설정' 등을 검색해보면 아시겠지만 얄코: 웹서버가 다양한 보안 기능들을 제공하기 때문에 얄코: 뭘 사용해서 웹이나 API를 만들든 그 앞단에는 얄코: 웹서버를 둬서 방문객을 맞도록 하는거에요. 얄코: 웹서버를 사용하는 또다른 이유로 얄코: 역시 리버스 프록시의 기능으로 치지만, 로드밸런싱이 있어요. 미토: 그거는 거 그거잖아요 톰캣이 여러개 돌고 있을 때 미토: 그것들 바란스 맞춰주는거요 바란스 얄코: 맞아요. 톰캣으로 하는 자바 서비스들 뿐 아니라 얄코: 다른 종류의 WAS들도 마찬가지죠. 얄코: 손님들이 여럿 몰릴 때 여러 요리사들에게 얄코: 분산해서 주문을 넣어주는 역할을 하는거에요. 미토: 근데 서버 한 대에서 이러쿵닷컴 사이트 하나를 돌릴 때 미토: 그 같은 사이트를 돌리는 톰캣을 여러개 두는거는 미토: 왜 그렇게 하는거에요? 얄코: 먼저 지속성을 위함이에요. 얄코: 스프링으로 만든 웹 등의 서비스에 새 기능을 추가해서 얄코: 동적부분까지 업데이트 해줘야 하는 경우에는 얄코: 돌던 서비스를 종료하고 다시 실행을 해줘야 하잖아요. 얄코: 짧은 찰나지만 그동안에 사용자가 해당 서비스에 접근하면 얄코: 다시 켜지고 있는 중이라 오류가 뜨게 돼죠. 얄코: 톰캣이나 이런 걸 여럿을 두고 서비스를 돌리게 되면 얄코: 이것들을 순서대로 차례차례 업데이트를 해서 얄코: 하나가 재부팅되는동안에는 웹서버가 다른 톰캣들로 얄코: 주문들을 분산해줘서, 사용자의 입장에서 얄코: 서비스를 끊김 없이 이용할 수 있도록 할 수 있죠. 미토: 요리사가 화장실에 갔다올 시간을 줄 수 있는거네요. 미토: 그동안 다른 요리사한테 주문 전달하면 되니까. 얄코: 그리고 환경에 따라 CPU 수나 메모리 등 변수들이 있지만 얄코: 톰캣 등의 인스턴스를 여럿 돌려서 작업을 분산하는게 얄코: 성능 측면에서 나은 경우들이 있기 때문에 미토: 인스턴스란게 프로그램이 돌아가고 있는 상태를 말하는거죠? 얄코: 지금은 그렇게 이해하시면 돼요. 하나의 프로세스죠 얄코: 여튼 이런 조건들을 감안해서 다수의 인스턴스로 얄코: 서비스를 돌리고 이를 웹서버로 밸런싱하는거에요. 얄코: 웹서버의 또 다른 중요 기능으로 캐싱이 있어요. 미토: 캐싱은 한 번 꺼내온 것들을 다시 힘들게 안 꺼내도 되게끄름 미토: 어디 가까운데 따로 모아두는거죠? 얄코: 네, 여기서 말하는 캐싱은 reverse proxy의 캐시인데요 얄코: 아까 말한 forword proxy의 캐싱 기능이 사용자 관점에서 얄코: 한번 받아온 이미지 등 정적 파일이 사용자와 서버 사이에 있는 얄코: 프록시 서버란 곳, 정류장 수하물센터에 쌓였다가 다음 요청때 얄코: 서버까지 다시 찾아갈 필요 없이 바로 받아와지는거라면 얄코: 웹서버가 reverse proxy로써 제공하는 이 캐시는 얄코: 서버 단에서의 캐시에요 얄코: 서버로 찾아오는 손님들이 자주, 반복적으로 찾을 만한 리소스들을 얄코: 응접실에 쌓아뒀다가 바로 건내주는거죠. 얄코: 어느쪽이든 사용자 입장에서 빨라지는 건 마찬가지에요. 얄코: 이 외에도 웹서버는 수많은 모듈들을 사용해서 얄코: 뒷단 WAS들이 정상동작하는지 주기적으로 헬스체크를 하는 등 얄코: 서비스를 안정적이고 안전하게 돌리기 위한 얄코: 다양한 기능들을 제공합니다. 미토: 오호라. 그러니까 정리를 하자면 미토: 이 웹서버와 WAS의 역할이 겹치는 부분도 있지만은 미토: 각자가 특화된 부분들을 활용해가지고다가 미토: 보안이랑 운영같은거를 더 잘 하는 웹서버가 미토: 응접실에서 손님을 직접 상대하고 미토: WAS나 다른 비슷한 어플리케이션들은 미토: 뒤에서 동적 요소들을 만들어내는데 집중을 하는거네요. 미토: 그럼 이 웹서버중에 아차피랑 이... 엔진엑스가 있다고 그랬는데 미토: 이 둘은 그럼 어떻게 다른거에요? 아무거나 갖다 쓰면 되나? 얄코: 아파치가 오래전부터 널리 사용되어오던 거고 얄코: NginX가 등장한 이후 아파치의 점유율을 따라잡는 추세인데요 얄코: 이 둘은 작동방식에 있어 근본적인 차이가 있어요. 얄코: 아파치는 다중 프로세스, NginX는 이벤트로 일을 처리한다는거에요. 얄코: 먼저 아파치는 MPM, 멀티 프로세스 모듈 방식으로 일하는데요 얄코: 손님이 올 때마다 프로세스 새로 생성하는 방식이 있고 얄코: 한 프로세스 안에서 스레드를 새로 생성하는 방식이 있어요. 미토: 이 프로세스와 스레드는 얄코씨의 예전 영상에서 찾아볼 수 있죠. 얄코: mpm_prefork, 즉 손님마다 프로세스를 두는 방식은 얄코: 말하자면 손님이 새로 올 때마다 상담 테이블을 따로 가져와서 앉히는거에요. 얄코: 그리고 이 테이블들을 계속 돌아다니면서 여러 손님들을 동시에 상대하는거죠. 얄코: mpm_worker, 한 프로세스에서 손님마다 스레드를 생성한다는 건 얄코: 가로로 길다란 테이블을 하나 두고, 손님이 올 때마다 나란히 앉힌 다음 얄코: 역시 좌우로 돌아다니면서 동시에 업무를 처리해드리는거에요. 미토: A손님 무슨 일로 오셨어요? B손님 이거 작성해주세요. 미토: C손님 아직 쓰고 계시는구나 D손님 다하셨으면 여기 싸인해주시구요 미토: 두 번째 방식이 그나마 낫겠지만 둘 다 이리저리 계속 돌아다니느라고 미토: 힘을 아주그냥 엄청 빼겠는데요. 이 자리들이 또 다 메모리잖아요. 미토: 컨텍스트 스위칭이라고 하죠? 미토: 프로세스나 스레드가 이거 하다 저거하러 가는거 얄코: 맞아요. 때문에 이 방식은 컴퓨터 자원을 많이 소모하죠. 얄코: 반면 NginX의 event driven 방식을 비유하자면 얄코: 작은 데스크 하나만 두고 손님들을 한 줄로 쭉 세우는거에요. 얄코: 그리고 다음 손님이 오는대로 업무별로 집중해서 일을 처리하는거죠. 미토: A손님 어떻게 오셨어요? 이거 작성해주시고 맨 뒤로 서주세요. 다음손님~ 미토: 이건 컴퓨터에 부담이 덜하겠네요. 성능으로는 NginX가 더 낫겠는데요? 얄코: 맞아요. 이를 보완하기 위해 아파치도 이벤트 방식을 추가했죠. 얄코: 여튼 그래서 성능과 가벼움을 중요시하는 서비스에서는 NginX, 얄코: 그리고 다양하고 검증된 기능들을 필요로 하는 곳에서는 얄코: 오랜 기간 사용되며 안정성을 갖춰온 아파치를 사용해요. 얄코: 자 오늘 이렇게, 웹서버와 WAS 개념을 비교해보면서 얄코: 아파치와 NginX, 톰캣 등의 소프트웨어들도 알아봤습니다. 얄코: 오늘은 미토씨가 드립 욕심도 안 부리고 얄코: 설명에 올인하는 모습 보여주셔서 더 좋았던 것 같네요. 미토: 와 제가요, 얄코씨 따라서 이 중성화 수술이란 걸 받아보니까 미토: 무슨 불만이나 욕구가 다 사라지고 이렇게 편하고 좋을 수가 없어요 미토: 덕분에 세상 좋은거 한 번 해보고 정말 감사한 마음입니다. 얄코: 네. 미토씨 대사때문에 집중 안 되고 짜증난다는 의견들이 있어서... 미토: 이거는 나중에 짝짓기하면 마누라랑 새끼들도 시켜줄 생각이에요. 미토: 내가 진짜 열심히 벌어놔야지. 얄코: ...얄코와 미토였습니다. 즐코하세요!




관련 태그의 다른 영상들

아파치, NginX, 톰캣이 뭔가요?
Web Server와 WAS의 정의와 역할, 그리고 이 둘의 차이를 알아봅니다.
# 웹서버
# WAS
# 아파치
# NginX
# 톰캣
# 로드 밸런싱
# 리버스 프록시
...
🌏 Why not change the world?