아파치, NginX, 톰캣이 뭔가요? (+ 웹서버, WAS, 로드밸런싱, 프록시)

박제욱·2024년 5월 13일

!img[아파치, NginX, 톰캣이 뭔가요? (+ 웹서버, WAS, 로드밸런싱, 프록시)
](http://img.youtube.com/vi/Zimhvf2B7Es/0.jpg)

  • 어떤 컴퓨터가 서버의 역할을 하게 해주는 소프트웨어를 무슨무슨 서버라고도 부른다.
  • 웹 서버도 이와 같은 개념이다.
  • 아파치, NginX, IIS가 대표적인 웹 서버이다.
  • 이들은 웹 사이트를 제공하는 서버로 만들어주는 서비스들이다.
  • 웹 사이트는 웹 브라우저에서 제공 된다.
  • 따라서 웹 사이트가 서비스될 때 필요한 것은 브라우저가 읽을 수 있는 파일들이 필요하다.
  • 정확히는 HTML, CSS, JS, 각종 이미지, 기타 여러 데이터들을 가지고 서버에서 사용자의 컴퓨터에 보내주는 것이 필요하다.
  • 이 파일들은 원래 서버 컴퓨터에 저장되어 있다.
  • 이 서버의 특정 디렉토리에 저장해두면 이 디렉토리를 외부에서 접근 가능하도록 개방해서 서버에 지정된 웹사이트 주소로 접속하면 이를 받아갈 수 있도록 하는 것이 웹 서버의 기본 기능이다.
  • IIS는 윈도우 서버에서 쓰인다.
  • 윈도우로 서버를 돌리는게 아닌 이상 아파치, 엔진엑스(NginX) 중 하나를 접하는 것이 일반적이다.
  • 이 프로그램들로 서버 컴퓨터에 있는 어떤 디렉토리를 개방하여 거기 든 파일들로 웹 사이트를 제공할 수 있게 된다.
  • 서버에 정해진 사이트로 접속하면 그 파일들을 꺼내 웹 사이트를 띄우게 된다.
  • 이는 정적 웹다.
  • 정적 웹은 블로그 페이지나 회사 소개 페이지처럼 그 안의 내용들이 바뀔 일이 없는 내용들을 고정된 HTML, CSS, JS로 제공한다.
  • 동적 웹은 게시판 페이지처럼 항상 같은 내용이 나오는 것이 아닌 것들을 말한다.
  • 사용자가 글을 올리기 때문에 고정된 HTMl 파일을 사용할 수 없다.
  • DB에 있는 데이터나 변수들에 따라서 사용자가 접솔할 때마다 그때그때 페이지가 만들어진다.
  • 이런 동적 웹을 제공하는 것도 웹 서버의 고유 역할로 정의해야 할지는 애매하지만 아파치나 NginX는 할 수 있다.
  • 예를 들어, 아파치랑 PHP, MySQL를 연동시켜 동적인 PHP 웹 사이트를 제공하는 것을 들 수 있다.
  • 이를 줄여서 APM이라고도 부른다.
  • 아파치에 PHP를 해석할 수 있는 모듈을 세팅해두면 웹 접근이 있을 떄마다 PHP 코드에 적힌 대로 MySQL에 있는 데이터를 가져와서 아파치가 이를 이용하는 것이다. 이는 NginX로도 가능하다.
  • 이들은 톰캣이나 Node.js, Django 등과 함께 사용되기도 한다.
  • 톰캣이란 자바와 JSP로 만든 웹 또는 API 어플리케이션을 실행할 때 톰캣 같은 Web Application Server, 줄여서 'WAS' 또는 '와스'가 사용된다.
  • 와스는 단순히 뭘 갖다주는 것이 아니라 뭔가 프로그래밍을 더 한다는 것이다
  • 이는 동적 사이트를 전문적으로 처리해주는 거라고 보면 된다.
  • 아파치나 NginX 같은 서버는 PHP는 사용할 수 있지만 스프링 등은 사용할 수 없다.
  • 그래서 스프링 등에 사용하기 위해 WAS가 사용된다.
  • 자바 바이트코드로 컴파일되는 언어들에 쓰이는 걸로 가장 흔히 사용되는 톰캣이나 Jetty, Undertow 등이 있다.
  • 결론은 아파치와 NginX는 웹 서버, 톰캣은 WAS다.
  • 아파치 같은 웹 서버와 자주 묶여서 언급되는 것이 톰캑 같은 WAS다.
  • 사실 톰캣 같은 와스들도 방문자들에게 직접 동적으로 만든 웹을 건낼 수 있고 정적 리소스들을 건내줄 수 있다.
  • 즉, 아파치 없이 톰캣만으로도 웹 사이트를 제공할 수는 있다.
  • 그러나 그렇게 안하는 이유가 있었다.
  • 예전엔 톰캣이 정적 요소를 넘겨지는 작업이 좀 느려서 아파치가 이를 대신해주었다.
  • 톰캣 뿐 아니라 Node.js 서버 어플리케이션이나 닷넷 등의 WAS를 앞 단에 두고 웹 서버를 앞단에 둬서 사용자를 맞이하는 이유는 따로 있다.
  • 아파치와 NginX는 위에 나온 기능 외에 다양한 기능을 제공한다.
  • 그 중 하나가 reverse proxy가 있다.
  • 이는 사용자들에게서 서버의 정보를 감추는 것이다.
  • 서버도 보안상 내부구조를 감출 필요가 있기 때문이다.
  • 정적 리소스들이 있는 곳은 어디고 톰캣 등이 독적 요소를 이용하는 곳은 어디인지 등을 드러내지 않고 아파치나 NginX가 사용자를 맞이하고 데이터를 불러오는 것이다.
  • 이는 서버 내부적으로 파일들이 어느 폴더에 들어있고 서비스가 몇 번 포트로 돌고 있는지 등을 감추는 것이다.
  • 한 서버에서 뭐뭐 닷컴, 떙땡 닷컴이 제공될 때 이들 중 어느 주소로 사용자들이 접속하든 웹 서버가 사용자를 맞아서 어느 닷컴으로 찾아왔는지를 보고 정적 웹를 받아오든 동적 웹을 받아오든 하는 것이다.
  • 이 외에 forward proxy가 있다.
  • 이는 사용자들이 사이트 등에 접속할 때 본인의 아이피 주소를 숨기기 위해 중간에 프록시를 둬 이를 통해 데이터를 주고 받는다.
  • 더 알고 싶다면 구글에 아파치 보안 설정을 검색해보면 좋다.
  • 웹 서버를 가용하는 또 다른 이유로 로드 밸런싱이 있다.
  • 이는 톰캣이 여러 개 돌고 있을 때 이들의 균형을 맞춰준다.
  • 이는 톰캣으로 하는 자바 서비스들 뿐 아니라 다른 종류의 와스들도 마찬가지다.
  • 사용자들이 몰릴 때 분산해서 데이터를 보내는 역할을 하는 것이다.
  • 서버 한 대에서 뭐뭐 닷컴 같은 사이트 하나를 돌릴 때 같은 사이트를 돌리는 톰캣을 여러 개 두는 것은 왜 일까?
  • 먼저 지속성을 위함이다.
  • 스프링으로 만든 웹 등의 서비스에 새로운 기능을 추가해 동적 기능까지 업데이트해줘야 하는 경우 돌던 서비스를 중단하고 다시 실행해줘야 한다.
  • 짧은 찰나지만 그동안 사용자가 해당 사이트에 접속하면 다시 켜지는 중이라 오류가 나온다.
  • 톰캣 등을 여럿두고 서비스를 돌리게 되면 이것들을 순서대로 차례차례 업데이트를 해서 하나가 재부팅되는 동안 웹 서버가 다른 톰캣으로 요청들을 분산해줘서, 사용자의 입장에서 서비스를 끊김 없이 사용할 수 있게 된다.
  • 환경에 따라 CPU 수나 메모리 등의 변수가 있지만 톰캣 등의 인스턴스를 여렷 돌려 작업을 분산하는 것이 성능면에서 나은 면이 있기 때문에 다수의 인스턴스로 서비스를 돌리고 웹 서버로 밸런싱을 하는 것이다.
  • 여기서 인스턴스는 하나의 프로세스라고 보면 된다.
  • 웹 서버의 또다른 중요 기능으로 '캐싱'이 있다.
  • 여기서 말하는 캐싱은 reverse proxy의 캐싱이다.
  • 웹 서버가 reverse proxy로써 제공하는 캐시는 서버 단에서의 캐시이다.
  • 서버로 찾아오는 사용자들이 자부, 반복적으로 찾을만한 리소스들을 모아두었다가 사용자에게 제공하는 것이다.
  • forward proxy의 캐싱 기능은 한 번 꺼내온 것을 다시 힘들게 꺼내오지 않게끔 어디에 따로 모아두는 것이다.
  • forward proxy의 캐싱 기능이 사용자 관점에서 한 번 받아온 이미지 등의 정적 파일이 사용자와 사이에 있는 프록시 서버에 모였다가 다음 요청 때 다시 불러올 필요없이 바로 받아와진다.
  • 어느 쪽이든 사용자 입장에서 빨라지는 것은 마찬가지이다.
  • 이 외에도 웹 서버는 수많은 모듈을 사용하여 뒷단 와스들이 정상작동하는지 주기적으로 헬스체크를 하는 등 서비스를 안정적이고 안전하게 돌리기 위한 다양한 기능들을 제공한다.
  • 정리하자면 웹 서버와 와스의 역할이 겹치는 부분도 있지만 각자가 특화된 부분들을 활용해 보안과 운영 등을 더 잘하는 웹 서버가 사용자를 먼저 맞이하여 응대하고 와스나 다른 비슷한 어플리케이션들은 뒷에서 동적 요소들을 만드는데 집중한다.
  • 그럼 아파치와 NginX의 차이는 뭘까?
  • 아파치는 오래 전부터 널리 사용되어왔고 NginX가 등장한 후 이를 따라잡고 있다.
  • 이 둘은 작동방식에 있어 근복적인 차이가 있다.
  • 아파치는 다중 프로세스, Nginx는 이벤트로 일을 처리한다.
  • 아파치는 Mpm, 즉 멀티 프로세스 모듈 방식으로 작동하는데 이는 사용자들이 올 때마다 프로세스를 새로 생성하는 방식과, 한 프로세스 안에서 스레드를 새로 생성하는 방식이 있다.
  • 이 방식을 손님 응대에 비교해보자.
  • mpm_prefork, 즉 사용자마다 프로세스를 두는 방식은 손님들이 새로 올 때마다 상담 테이블을 따로 가져와서 앉히는 것이다.
  • 그리고 이 테이블들을 계속 돌아다니면서 여러 손님을 상대하는 것이다.
  • mpm_worker는 한 프로세스에서 손님마다 스레드를 생성한다.
  • 이는 가로로 길다란 테이블을 하나 두고 손님이 올 때마다 나란히 앉힌 다음, 좌우로 돌아다니며 동시에 업무를 처리해주는 것이다.
  • mpm_worker가 그나마 괜찮지만 힘을 엄청 빼간다.
  • 이들은 다 메모리이다.
  • 프로세스나 스레드가 이거하다가 저거 하러 가는 것이다.
  • 이를 컨텍스트 스위칭이라고도 한다.
  • 그래서 이 방식은 컴퓨터 자원을 많이 소모한다.
  • 반면, NginX의 event driven 방식을 설명하자면, 작은 데스크를 하나만 두고 손님들을 한 줄로 쭉 세우는 거다.
  • 그리고 다음 손님이 오는데로 업무별로 집중해서 이를 처리한다.
  • 이렇게 하면 컴퓨터에 부담이 덜하다.
  • 아파치에서도 이벤트 방식을 추가했다.
  • 성능과 가벼움을 중요시하는 서비스에는 NginX, 다양하고 검증된 기능들을 필요로 하는 곳에서는 아파치를 주로 사용한다.

참고 영상 : https://www.youtube.com/watch?v=Zimhvf2B7Es&t=12s

0개의 댓글