Apache와 Tomcat의 차이를 모른다..

min·2021년 11월 6일
0

항상 Apache Tomat을 사용하고 있지만 말 그대로 그냥 사용하고 있던 나 자신을 반성하며 스터디하면서 언급됬던 내용을 정리해봤다.
언제나 나 자신에게 놀라운건 이렇게까지 모른다고? 인 것 같다.

참고:
https://okky.kr/article/623715?note=1783265
https://limmmee.tistory.com/4

🎈 아파치(Apache) 웹 서버

  • 80번포트로 클라이언트 요청 (POST, GET, DELETE)등이 왔을 때 응답
  • 내용이 변하지 않는 정적인 페이지 처리 (.html, image, css)
  • Client가 동적인 웹 페이지를 요청 하는 경우 Web Container를 통해서(요청해서) 동적 페이지 결과를 생성하여서 응답함

🎈 웹 컨테이너 = 서블릿 컨테이너 (jsp 엔진, servlet)

  • 동적인 페이지 (.jsp, .java 등) : 요청이 올 때마다 페이지에 필요한 정보를 그때그때 생성함으로 서버의 리소스 부하를 줄일 수 있음.
  • 동적으로 페이지를 생성하여 웹 서버에 전달하고 동적이기 때문에 사용자마다 다른 결과 응답 가능
  • jsp를 servlet으로 변환하여 응답 페이지를 생성함 (?) - 웹 구현 기술로 사용하는 servlet을 관리하고 jsp 파일을 실행 할 수 있게 해줌.
  • reqeust,response 객체를 만들어서 서블릿에 넘겨주는 역할.

🎈 Tomcat = WAS (Web Application Server)

  • 웹 어플리케이션이 실행 될 수 있는 환경을 제공하는 서버
  • 톰캣은 자바 어플리케이션을 위해서 만들어졌기 때문에(=JSP 서블릿 파일 처리를 위해서 만들어졌기 때문에) php와 같은 언어들을 사용 할 때는 굳이 Tomcat을 사용하지 않아도 됨. 이유는 사실 잘 모르겠음.
  • WAS = Web Server + Web Container
    * 정적 페이지 처리 + 동적 페이지 처리를 모두 할 수 있음

🎈 아파치 톰캣

  • 톰캣에서 아파치의 일부 기능(웹 서비스 데몬, Httpd)등을 포함하고 있기 때문에 아파치 톰캣이라고 부른다.
  • 아파치 (포트 80) - http 기본 포트 80 톰캣 (포트 8080) - 실제로 http 포트는 80포트이므로 8080포트로는 아파치가 알아서 보내줌.

사용 방법

톰캣만 사용 가능
아파치만 사용 가능
아파치 톰캣으로 연동해서 사용 가능

Q. 그냥 WAS(Tomcat)만 사용하면 되지 웹 서버(Apache)가 필요한가요?

  1. WAS의 부담을 줄임
    * 웹 서버를 WAS의 앞에 둬서 정적인 문서만 처리하도록 하고, WAS는 애플리케이션 로직만 수행하도록 기능을 분배하여 서버의 부담을 줄이도록 함.

  2. WAS의 보안 문제
    클라이언트 요청 포트와 WAS가 직접적으로 연결되어있다면 중요한 설정 파일들이 노출 될 수 있음
    보안상의 이유로 웹 서버는 노출을 시켜서 아무나 접속 가능하게 하지만 servlet을 처리하는 WAS의 경우 아무나 접근하지 못하게 IP 차단하고 웹 서버 IP만 WAS에 통신이 되게 함 - DB 관련 접근을 Web Server에서 하지 않고 WAS에서 실행하기 때문
    * 물리적으로 웹 서버와 WAS 서버를 따로 놓음

  3. 복잡한 사이트의 경우
    * 단순한 사이트만 돌리게 된다면 Tomcat 하나만 돌리면 되지만 여러 사이트들을 하나의 서버에 연결시켜서 컨트롤 해야 하는 경우에는 Tomcat에서는 해당 기능을 제공하지 않음

  4. 로드 밸런싱
    • Q. 로드 밸런싱? 하나의 인터넷 서비스가 발생하는 트래픽이 많을 때 여러 대의 서버가 분산처리하여 서버의 로드율 증가, 부하량, 속도 저하들을 분산처리하여 해결해주는 서비스
    • 특정 서버에서 에러/과부화가 발생한 경우 다른 서버에서 정상적으로 서비스를 하기 위함

HTTP 요청 프로세스
1. WAS의 Servlet Container가 Servlet 객체 생성
* 서블릿은 로딩 시점에 생성될 수도 있고, 최초 요청 시점에서 생성될 수도 있다고 합니다. 요청시 서블릿 인스턴스가 메모리에 존재하지 않는다면 서블릿 컨테이너는 해당 서블릿을 로드하고 init() 메서드를 통해 초기화한 후, 적재한다고 합니다.
2. 클라이언트가 해당 servlet을 사용하는 http 요청 실행 -> Servlet Container에서 request, response 객체 생성
3. 스레드 sevlet 객체 호출 -> request, response 객체를 sevlet 객체에게 넘겨 줌
4. request 객체를 활용하여 servlet의 비즈니스 로직 실행
5. response 객체를 servlet container에 전달
6. servlet container가 http 응답 메세지 생성 후 클라이언트에게 전달

  • servlet: service() 로직을 수행하는 싱글톤 객체.
profile
발등에 불이 따뜻하다..

1개의 댓글

comment-user-thumbnail
2021년 11월 8일

좋은 정보 얻어갑니다~ㅎㅎ 총총

답글 달기