Apache Tomcat?
Apache Tomcat은 Apache + Tomcat의 합성어로 Apache는 Web server, Tomcat은 Web Container의 기능을 수행하는 소프트웨어이다.
그럼 Web server와 Web Container의 차이를 먼저 알아보자.
Web Server?
"웹서버의 주된 기능은 웹페이지를 클라이언트로 전달하는 것"이다 브라우저가 웹 서버에서 불려진 파일을 필요로 할 때, 브라우저는 HTTP를 이용해 "정적인" 콘텐츠를 보내준다. 따라서 어떤 사용자가 요청을 하든 동일한 콘텐츠를 제공한다.
ex) image, html,css와 같이 컴퓨터에 저장되어 있는 파일들
대표적인 Web server의 역할은 2가지가 있다.
1. 웹 리소스들을 클라이언트에게 전달 및 저장
2. 동적인 요청 처리를 위해 Web Container에 요청한다.
위와같이 Web Server는 정적인 콘텐츠만 처리가 가능하며 동적인 요청처리를 위해선 Web Container가 필요로 하다 .
Web Continaer?
웹 어플리케이션을 실행 할 수 있는 컨테이너를 의미한다.
정적인 콘텐츠의 한계를 극복하기 위해 등장 했으며 Web Server 요청에 의해 동적인 콘텐츠의 처리가 가능하다.
웹 서버와 애플리케이션 사이의 통신을 관리하고 웹 애플리케이션의 생명 주기를 관리한다.
WAS?
WAS와 Web Container가 합쳐진 것 대표적으로 아파치 톰캣이 있다.
그렇다면 왜 Web Server와 Web Container를 같이 사용할까?
일단, Web Container가 해야할 일의 부담을 덜어주기 위해 사용한다. 또한 Web Container의 파일을 외부에 노출시키지 않기 위해 사용을 한다. 클라이언트의 요청을 받으면 HTTP Connector를 통해 Web Server가 요청을 받고 Web Server를 통해 Web Container가 요청을 받는다(Web Server와 Web Container가 요청받는 포트가 다르다) 이렇게 중간에 Web Server를 통해 요청을 받고 Web Container포트에는 방화벽을 쳐서 보안을 강화할 수도 있다.
그렇다면 각각의 클라이언트와 Web Server Web Server와 Web Container에 포트가 다르다고 했는데 그 각각의 사이에는 어떤 연결이 있을까?
클라이언트와 Web Server
클라이언트와 Web Server와의 통신을 처리하기 위해서는 HTTP Connect가 필요로 하다.
HTTP Connector는 표준 HTTP 프로토콜로 요청을 받는 경우에 사용을 한다. 그 종류에는 BIO Connector, NIO Connector가 있으며 톰캣 9.0부터는 NIO Connector기반의 커넥터가 Defaut가 되었다.
NIO Connector은 하나의 스레드가 동시에 많은 채널을 관리하는 방식이다. 이름에서와 같이 Non-Block이며 BIO와 달리 새로운 연결이 발생할 때 새로운 Thread를 할당하지 않고 이벤트 루프를 통해 data에 대한 처리가 가능한 순간에만 Thread를 할당하는 방식을 사용한다. 이러한 특성 때문에 maxConnections > tomcat thread max이 가능하다.
Web Server와 Web Container
해당 구간에서는 AJP(Apache JServ Protocol)을 이용하여 통신을 한다.
AJP는 Web Server에서 받은 요청을 Web Container에 전달해주는 프로토콜이다.
마치며..
Nio Connectr에 대해 공부를 하다보니 톰캣이 나오고 톰캣에 대해 공부를 하다보니 여러 개념이 나왔는데, 아직 이해가 안가는 부분이 있다. WAS 와 Web Container에 관계가 아직은 확실하게 이해가 안간다. 어느 글에는 WAS = Web server(정적인 처리) + Web Container(동적인 처리) 라고 나와있으며 WAS자체가 동적인 처리를 하는 부분이라고 나온 글도 있다.
나는 전자로 이해 했다. 어느 특정 개념을 공부하기 위해 구글링을 하다보면 너무나 많은 글들이 나오지만 글마다 내용이 다른 부분이 존재하여 혼란스럽다. 이 부분은 다시한번 확인을 하여 다시 확인을 해야겠다.
'Programming > Back-end Language' 카테고리의 다른 글
Docker 환경에서 Nginx를 사용하여 letsencrypt SSL 설정 (1) | 2024.10.18 |
---|---|
K6를 이용한 서버 성능 테스트 이슈 (0) | 2024.09.06 |
트랜잭션 (0) | 2024.04.19 |
[Spring] WebClient 란? (0) | 2022.08.29 |
[Spring] @Valid를 이용한 유효성검증 (1) | 2022.06.17 |