본문 바로가기
Web

[Web] 웹 서버 : apache, NginX, Tomcat

by DuncanKim 2022. 7. 7.
728x90

[Web] 웹 서버
: apache, NginX, Tomcat

 

 

1. 웹이 우리에게 오기까지


HTML, CSS, JavaScript 등의 파일은 페이지를 구현하기 위해 필요한 문서들이다. 이 문서들은 클라이언트에 있는 것이 아니라, 그 정보를 저장하고 있는 어느 서버에 들어있다. 자사 서비스를 제공하는 네이버의 경우 네이버의 서버실에 그 문서가 들어있을 것이고, 어떤 클라우드에 그 문서를 올려놓았을 경우, 예를 들어 깃허브 저장소를 사용할 경우 깃허브 서버 어딘가에 그 문서가 들어있는 것이다.

그 서버에 있는 문서 파일들은 특정 디렉토리에 넣어두는데, 이 디렉토리를 외부에서 접근 가능하도록 개방해서 서버에 지정된 웹 사이트 주소로 접속하면 이것들을 받아갈 수 있도록 하는 것이 웹 서버이다. 이 구동 방식은 '정적 웹'이다.

2022.06.24 - [IT 지식/Web] - [Web]정적 웹과 동적 웹(static web, dynamic web)

 

[Web]정적 웹과 동적 웹(static web, dynamic web)

[Web]정적 웹과 동적 웹(static web, dynamic web) 정적웹, 동적웹 각각의 개념과 두 가지 방식의 차이를 알아볼 것이다. 정적 웹 : 언제 접속해도 같은 리소스를 건네주는 웹사이트. 서버는 프로그래

masterpiece-programming.tistory.com


2. 웹서버의 역할과 세부 기능


이러한 정적 웹, 동적 웹을 클라이언트에게 제공하는 것이 웹서버의 역할이다.

1) 데이터 전달의 기능(정적 웹과 동적 웹)


아파치나 NginX의 모듈로 동적웹을 제공하는 것이 가능하다.
아파치, php, mysql을 연동시켜서 동적인 php 웹사이트를 제공하는 방식이 있다. 이것을 APM이라고 한다. 아파치에 php를 해석할 수 있는 모듈을 세팅해놓으면 MySQL에 있는 데이터를 가져와서 아파치가 가공을 해준다. NginX도 이와 동일한 기능을 제공할 수 있다.

정적 웹일 때는 데이터를 가져다주는 기능을 하고, 동적 웹일 때는 직접 구현을 하여 사용자에게 전달해주는 역할을 하는 것이다.

또한 동적 웹을 직접 실행하지 않고, Tomcat이나 Node.js, Django와 같은 내장 서버가 실행한 동적 웹을 전달해주는 역할도 한다.

2) Tomcat의 역할, WAS

요즘은 스프링 부트에 톰캣이 내장되기 때문에 직접 접할 일은 자주 없다.
자바랑 JSP로 만든 웹 또는 API 어플리케이션을 실행할 때 톰캣 같은 Web Application Server가 사용된다. 줄여서 WAS라고 한다. 이것은 단순히 무엇을 가져다주는 것이 아니라, 프로그래밍된 것을 더 진행한다는 의미이다. 동적 사이트를 전문적으로 처리해주는 것이다.

아파치나 NginX와 같은 웹서버는 php와 같은 것은 직접 처리를 할 수 있지만, 스프링과 같은 것은 직접 처리를 할 수 없어 톰캣과 같은 WAS의 손을 빌려 처리한다.

자바 바이트코드로 컴파일되는 언어들에 쓰이는 것으로 가장 흔하게는 톰캣, Jetty, Undertow가 있다.

3) 톰캣의 사용방법


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

아파치와 NginX는 웹서버, 톰캣은 WAS인 것이다. (WAS는 자바 진영에서 명칭하는 것이다. WO 등 다른 것으로 WAS를 칭하는 것도 많다.)

++ 톰캣은 정적 요소를 넘겨주는 기능이 조금 느려서 아파치와 같이 사용했는데, 요즘에는 톰캣의 정적 리소스 제공도 빨라져서 차이는 없다.

 

4) 보안의 기능


톰캣뿐만 아니라 Node.js 서버 어플리케이션이나 닷넷 등 WAS를 백엔드에 두고 WebServer를 프론트에 둬서 아파치나 NginX가 클라이언트를 맞이하도록 하는 이유가 따로 있다. 아파치, NginX는 정적, 동적 리소스를 제공하는 것 이외의 기능을 하기 때문에 그렇다.

reverse proxy가 대표적이다.

forward proxy : 사용자들이 사이트를 접속할 때, 자신의 아이피 주소를 숨기려고 중간에 프록시를 두어 그것을 통해 데이터를 주고 받는 것.
reverse proxy : forward proxy와는 다르게 사용자들에게 서버의 정보를 감추는 것.

서버도 보안상 내부 구조를 감출 필요가 있다. 정적 리소스가 들어있는 디렉토리는 어디인지, 톰캣이 어디에서 작동을 하는 지, 서비스가 몇 번 포트로 돌고 있는 지 등 내부 정보를 드러내지 않고 아파치나 NginX가 서비스를 실행시켜주는 것이다. 쉽게 말해 '보안' 측면의 기능을 하기 때문에 필요한 것이다.

cf. 구글 아파치 보안 설정


5) 프로세스 관리의 기능


로드 밸런싱의 기능도 아파치, NginX 같은 웹서버가 해주는 기능이다. 사용자의 요청을 분산시켜 톰캣을 여러 개 돌려서 사용자에게 서비스를 제공하는 것을 매니징하기도 한다. CPU, Memory와 같은 변수가 존재하지만, 톰캣 인스턴스를 여럿 돌려서 작업을 분산하는 것이 성능 측면에서 더 나은 경우가 있기 때문에 로드 밸런싱을 웹서버가 한다.

캐싱도 웹서버의 중요 기능이다.



3. 아파치와 NginX의 차이


아파치는 다중 프로세스로 일을 처리하고 NginX는 이벤트로 처리한다는 차이점이 있다(아파치도 이벤트 처리 방식을 일부 가지고 있다.)
성능과 가벼움을 중요시하는 서비스는 NginX, 다양하고 검증된 기능을 필요로 하는 곳에서는 오랜기간 사용되며 안정성을 갖춘 아파치를 사용한다.



728x90

댓글