Web Server? WAS?

dleunji·2021년 8월 31일
0

CS

목록 보기
1/1

평소 nginx라는 용어는 많이 봤지만 정작 그 뜻은 몰라서
직접 유튜브에서 찾아보았다.
그 내용을 정리하면 다음과 같다.


웹 서버 :

(e.g. 아파치, nginx, IIS)

  • 인터넷을 기반으로 클라이언트에게 웹 서비스하는 컴퓨터
  • 서버의 특정 디렉토리에 웹사이트 서비스에 필요한 파일들을 저장하고, 이 폴더를 외부에서 접근 가능하도록 개방해둔다.

대신 이는 정적웹이다.
그 안의 내용들이 바뀔일이 없는 경우에만 이렇게 사용

그러면 동적웹은???
항상 같은 내용이 뜨는 웹사이트가 아니다.
사용자가 접속할 때마다 새로워진다.

옛날에는 Apache + PHP + MySQL = APM으로 동적 PHP 웹 사이트 제공

간혹 톰캣이나 Node.js, Django 내장 서버 등과 클라이언트 사이에서 중간 관리자 역할도 수행

톰캣?

요즘은 스프링 부트에 톰캣이 내장되기 때문에 직접 접하는 일은 거의 없다.
자바랑 JSP로 만든 웹 또는 API 어플리케이션을 실행할 때 톰캣같은 WAS(Web Application Server) 사용된다.
단순히 serving하는 것이 아니라 전문적으로 동적 사이트 처리하는 용도이다.

아파치나 nginx같은 웹서버는 PHP같은 종류는 처리 가능하나,
스프링으로 넘어가면 톰캣같은 전문적인 어플리케이션(WAS) 요구

자바 바이트코드로 컴파일되는 언어들에 쓰이는 것은 톰캣, Jetty..

톰캣 사용방법

스프링으로 코딩한 웹앱을 war 파일로 빌드하면
그 안에 .class 파일, jsp, 이미지, css, javascript 파일 등이 압축되어 있다.

톰캣을 다운받으면 여러 폴더들과 파일들이 들어있는 하나의 폴더로 되어있는데, 그 중 특정 폴더에 위의 war 파일을 넣고 명령어를 실행하면 스프링서비스가 톰캣을 사용해서 돌아간다.

요즘에는 스프링을 톰캣이 들어있는 jar파일로 빌드해서 배포한다.

아파치, nginx가 웹서버 톰캣은 WAS

JAVA 외에는 WAS를 명확히 구분하지 않는다.

사실 톰캣 같은 WAS도 아파치 없이 동적인 웹을 서빙할 수 있으나, 정적 리소스도 서빙 가능하다.
그리고 톰캣의 정적 리소스 제공도 빨라진 편

하지만 톰캣 뿐만 아니라 Node.js 서버 어플리케이션이나 닷넷 등 WAS를 뒷단에 두고, 아파치나 nginx같은 WebServer를 앞단에 두어 어플리케이션 서비스를 하는 데는 이유가 있다.

아파치와 nginx는 정적 또는 가벼운 동적 리소스를 제공하는 역할 외에도 다양한 역할을 수행한다.

  • reverse proxy : 외부의 클라이언트에게 보안상 서버의 정보를 감춘다. 서버 내부적으로 파일들이 어느 폴더에 들어있는지, 몇 번 포트에서 서비스를 제공하는지 등을 감춘다.
  • 로드밸런싱
    📱 왜 같은 사이트를 돌리는 톰캣을 여러 개 사용하는가?
    서비스를 업데이트하는 경우, 서비스를 종료하고 재시작해야한다.
    짧은 찰나이지만 그동안에 사용자가 해당 서비스에 접근하면 오류가 발생한다.
    톰캣이 여러 개면 이를 순서대로 업데이트해서, 하나가 재부팅되는 동안에는 웹서버가 다른 톰캣들로 분산해줘서 서비스를 끊김없이 제공할 수 있다.
    그리고 톰캣 등의 인스턴스를 여러 개 돌려서 작업을 분산하는 게 성능 측면에서 나은 경우들이 있기 때문에 다수의 인스턴스로 서비스를 돌리고, 이를 웹서버로 밸런싱한다.
  • 캐싱(reverse proxy):
    서버 단의 캐시
    서버로 찾아오는 클라이언트가 자주 찾는 리소스를 캐싱해둔다.
  • 이외에도 웹서버는 수많은 모듈을 활용해서 뒷단의 WAS가 정상작동하는 주기적으로 헬스체크를 하는 등 서비스를 안정적이고 안전하게 제공

WAS와 웹 서버가 겹치는 역할도 있지만 각자가 특화된 기능을 활용해 보안, 운영을 성공적으로 수행

아파치 vs nginx

작동방식에 큰 차이가 존재한다.

  • 아파치 : 다중 프로세스
  • nginx : 이벤트로 처리

아파치는 MPM(Multi Process Module) 방식으로 일을 한다.
프로세스를 새로 생성하거나(mpm_prefork), 프로세스 안에서 스레드를 생성하는 방식(mpm_worker) 으로 일을 한다.

이는 지나친 context switching으로 컴퓨터 자원을 많이 소비한다.

반면 nginx의 event driven 방식은 일을 한 줄로 세워서, 손님이 오는대로 차례차례 처리한다.

이를 보안하기 위해 아파치에도 이벤트 위주 처리 방식이 도입되었다.

참고

https://www.youtube.com/watch?v=Zimhvf2B7Es

profile
뚝딱뚝딱 개발일지

0개의 댓글