반응형
개념정리
Web Server와 WAS(Web Application Server)
- Apache, NginX와 Tomcat -
회사에서 프로젝트 배포 전 WebServer와 WAS의 개념에 대해 공부해보라는 지시???가 있어서 겸사겸사 정리해보는 시간을 가졌다. 그냥 무조건 들이밀 수도 있는데 비전공자에 공부기간이 짧은 나에대한 많은 베려라고 생각해 감사한 마음이다. 아직 동기/비동기, 스레드 등 서버를 이해하기 위한 밑바닥 개념들조차 완벽하게 이해가 안되어 시간이 오래걸렸지만, 최대한 이해한대로, 다시봐도 이해가 가게끔 정리해보았다.
[차례]
1. Web Server와 WAS의 개념과 차이
2. Apache와 NginX
3. Tomcat
1. Web Server와 WAS의 개념과 기능
1. Web Server의 개념과 기능
Web Server의 개념
- 소프트 웨어와 하드웨어로 구분됨
- 하드웨어 : Web Server가 설치되어 있는 컴퓨터
- 소프트 웨어 : 웹 브라우저 클라이언트로부터 HTTP 요청을 받아 정적인 컨텐츠(.html .jpeg .css 등)를 제공하는 컴퓨터 프로그램. 파일 경로 이름을 받아 경로와 일치하는 file contents를 반환
- Web Server의 예 : Apache Server, Nginx, IIS(Windows 전용 Web 서버) 등
Web Server의 기능
- HTTP 프로토콜을 기반으로 하여 클라이언트의 요청을 서비스 하는 기능을 담당.
- 요청에 따라 두가지 기능 중 적절하게 선택하여 수행
- 정적인 컨텐츠 제공 : WAS를 거치지 않고 바로 자원을 제공
- 동적인 컨텐츠 제공을 위한 요청 전달: 클라이언트의 요청(Request)을 WAS에 보내고, WAS가 처리한 결과를 클라이언트에게 전달(응답, Response)
- Web Server를 통해 정적인 파일들을 Application Server까지 가지 않고 앞단에서 빠르게 보냄 -> Web Server에서는 정적컨텐츠만 처리하도록 기능을 분배하여 서버의 부담 감소
2. WAS(Web Application Server)의 개념과 기능
WAS의 개념
- DB조회나 다양한 로직 처리를 요구하는 동적인 컨텐츠 제공을 위해 만들어진 Application Server
- HTTP를 통해 컴퓨터나 장치에 애플리케이션을 수행해주는 미들웨어(소프트웨어 엔진)*
- '웹 컨테이너(Web Container)' 혹은 '서블릿 컨테이너(Servlet Container)'라고도 불림
- Container란 JSP*, Servlet*을 실행시킬 수 있는 소프트웨어
- 즉, WAS는 JSP, Servlet 구동 환경을 제공
- WAS의 예 : Tomcat, JBoss, Jeus, Web Sphere 등
미들웨어(MiddleWare)
- Client - MiddleWare Server - DB Server(DBMS)
- Client와 DBMS 사이에서 대부분의 로직이 수행되는 소프트웨어 엔진
JSP(JavaServer Pages) : HTML 코드에 JAVA 코드를 넣어 동적웹페이지를 생성하는 웹어플리케이션 도구. JSP 가 실행되면 자바 서블릿(Servlet) 으로 변환되며 웹 어플리케이션 서버에서 동작되면서 필요한 기능을 수행
Servlet : 클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술
WAS의 역할
- WAS = Web Server + Web Container
- Web Server 기능들을 구조적으로 분리하여 처리하고자하는 목적으로 제시
- 분산 트랜잭션, 보안, 메시징, 쓰레드 처리 등의 기능을 처리하는 분산 환경에서 사용
- 주로 DB 서버와 같이 수행됨
- 현재는 WAS가 가지고 있는 Web Server도 정적인 컨텐츠를 처리하는 데 있어서 성능상 큰 차이가 없음
WAS의 주요 기능
- 프로그램 실행 환경과 DB 접속 기능 제공
- 여러 개의 트랜잭션(논리적인 작업 단위) 관리 기능
- 업무를 처리하는 비즈니스 로직 수행
- 사용자의 요청에 맞게 동적 컨텐츠를 만들어서 제공
- 요청에 맞는 데이터를 DB에서 가져와서 비즈니스 로직에 맞게 그때그때 결과를 만들어서 제공함으로 써 자원을 효율적으로 사용
3. Web Server와 WAS(Web Application Server)를 같이 사용하는 이유
WAS가 Web Server의 기능도 모두 수행하면 되지 않을까?
- 기능을 분리하여 서버 부하 방지
- WAS는 DB 조회나 다양한 로직을 처리하느라 바쁘기 때문에 단순한 정적 컨텐츠는 Web Server에서 빠르게 클라이언트에 제공하는 것이 좋음
- WAS는 기본적으로 동적 컨텐츠를 제공하기 위해 존재하는 서버인데 정적 컨텐츠 요청까지 WAS가 처리한다면 정적 데이터 처리로 인해 부하가 커지게 되고, 동적 컨텐츠의 처리가 지연됨에 따라 수행 속도가 느려짐 -> 이로 인해 페이지 노출 시간이 늘어나게 될 것
- 물리적으로 분리하여 보안 강화
- SSL에 대한 암복호화 처리에 Web Server를 사용
- 여러 대의 WAS를 연결 가능
- Load Balancing을 위해서 Web Server를 사용 -> fail over(장애 극복), fail back 처리에 유리
- 특히 대용량 웹 어플리케이션의 경우(여러 개의 서버 사용) Web Server와 WAS를 분리하여 무중단 운영을 할 수 있고, 이를 통해 장애에 쉽게 대응
- 예를 들어, 앞 단의 Web Server에서 오류가 발생한 WAS를 이용하지 못하도록 한 후 WAS를 재시작함으로써 사용자는 오류를 느끼지 못하고 이용
- 여러 웹 어플리케이션 서비스 가능
- 예를 들어, 하나의 서버에서 PHP Application과 Java Application을 함께 사용하는 경우
- 기타
- 접근 허용 IP 관리, 2대 이상의 서버에서의 세션 관리 등도 Web Server에서 처리하면 효율적
즉, 자원 이용의 효율성 및 장애 극복, 배포 및 유지보수의 편의성 을 위해 Web Server와 WAS를 분리 -> Web Server를 WAS 앞에 두고 필요한 WAS들을 Web Server에 플러그인 형태로 설정하면 더욱 효율적인 분산 처리가 가능
2. Apache와 NginX
1. Apache
Apache의 개념
- 아파치 HTTP 서버(Apache HTTP Server)는 아파치 소프트웨어 재단에서 관리하는 무료 HTTP 웹 서버 소프트웨어
- 리눅스 등 유닉스 계열 뿐 아니라 마이크로소프트 윈도우에서도 무료로 운용
- Web Server 소프트웨어로 정적 컨텐츠를 효율적으로 제공하기 위해 사용
- Apache는 Tomcat에 다중 인스턴스 연결을 안정적으로 제공하는 가장 효율적인 서버
Apache의 구동방식
- Prefork MPM(multi Processing Module) 방식
- HTTP 연결 요청이 올 때마다 프로세스를 매번 복제하여 프로세스에서 싱글 스레드로 해당 HTTP 요청을 처리
- 사용자 요청 수 = 프로세스 수
- 구조가 간단하고 구현이 쉬움
- 사용자 동시 접속이 늘어날수록 프로세스마다 메모리를 할당하기 때문에 메모리가 부족해지고, 하나의 CPU가 여러 프로세스를 고속으로 번갈아 실행해야 하므로 CPU 부하가 높아지는 문제 발생
- 인터넷 사용이 급격히 증가하면서 서버가 동시에 처리해야 하는 소켓 수도 증가하게 되었는데, 동시에 연결된 커넥션이 1만 개가 넘어가면 하드웨어 성능이 좋아도 서버는 더 이상 커넥션을 형성하지 못하는 이른바C10K 문제가 발생
- Worker MPM 방식(멀티 스레드)
- 한 개의 프로세스가 여러 스레드를 생성하여 해당 HTTP 요청을 처리하므로 Prefork 방식보다 메모리 소모가 적음
- CPU 스케줄링을 위한 처리 시간과 문맥 전환 비용이 발생하는 단점이 있음
- 스레드를 분배하기 위해 사용되는 CPU 스케줄링에 대한 연산 작업과 쓰레드 간의 전환을 위해 전환하기 직전의 쓰레드를 저장해두는(나중에 복귀시킬 때를 대비) CPU 연산 작업으로 인해 스레드가 많아질수록 성능 저하가 발생
2. NginX
NginX의 개념
- 웹 서버 소프트웨어로, Apache의 C10K 문제를 해결하고자 등장
- 비동기 이벤트 기반 구조 : HTTP 요청이 수 천 개여도 정해진 수의 프로세스(worker procss)가 이 요청들을 이벤트로 등록하고 비동기 방식으로 대기시켜 완료되는 요청(이벤트)부터 응답(처리)해주는 것
- 정적인 컨텐츠들을 빠르게 처리하며, 동적 처리를 별도로 담당하는 소프트웨어 스택들과 연계해서 고성능 서버를 제공하는 데 적합
NginX의 주요기능
- 리버스 프록시
- 중계 기능을 하는 하는 서버
- 클라이언트가 서버를 호출할 때 직접 서버에 접근 하는 것이 아니라 리버스 프록시 서버를 호출하게 되고, 리버스 프록시 서버가 서버에게 요청을 하고 응답을 받아 클라이언트에 전달
- 클라이언트는 리버스 프록시 서버를 호출하기 때문에 실제 서버의 IP를 감출 수 있고, 이를 통해 보안을 높일 수 있음
- 로드밸런싱
- 이용자가 많아서 발생하는 요청이 많을 때, 하나의 서버에서 이를 모두 처리하는 것이 아니라 여러대의 서버를 이용하여 요청을 처리하게 되는데 이때 서버의 로드율과 부하량 등을 고려하여 적절하게 서버들에게 분산처리 하는 것 -> 부하 분산
- 하나의 서버가 멈추더라도 서비스 중단 없이 다른 서버가 서비스를 계속 유지할 수 있는 무중단 배포가 가능
NginX의 내부 구조
NGINX는 1개의 master process와 3종류의 자식 프로세스로 구성
- master process(Worker Process를 관리) : 특권 명령을 수행하고, Single Thread로 구성된 다수의 Worker Process 관리
- listen socket에 port를 바인딩
- NGINX 설정 읽기
- 아래 3가지 타입의 자식 프로세스 생성하고 관리
- child processes
- cache loader
- 디스크 기반 캐시를 메모리에 불러오고, 종료
- NGINX 시작 시 실행된다.
- 보수적으로 스케줄링되므로, 이 프로세스의 리소스 요구사항은 낮음
- cache manager
- 주기적으로 실행된다.
- 디스크 캐시를 설정된 사이즈로 유지하기 위해, 캐시 엔트리를 정리
- worker process(Single Thread)
- listen 소켓을 배정받는다.
- listen 소켓으로부터 클라이언트의 요청이 들어오면 커넥션을 형성하여 처리
- 초당 수천 개의 모든 http 요청을 한 프로세스에서 처리하고 응답
- CPU 코어당 1개의 worker 프로세스(싱글 스레드)를 생성하도록 설정하는 것을 권장
- 각 worker 프로세스들은 문맥 전환을 줄이기 위해, non-blocking 방식으로 동작한다.
- cache loader
NginX의 구동방식
- 이벤트(커넥션 생성 및 커넥션 제거, 새로운 요청 처리하는 것)들을 OS커널이 큐 형식으로 worker 프로세스에게 전달해주고, 이벤트가 큐에 담긴 상태에서 worker 프로세스가 처리할 때까지 비동기 방식으로 대기
- 워커 프로세스는 하나의 스레드로 이벤트를 꺼내서 처리
- 워커 프로세스가 쉴틈없이 일하기 때문에 아파치 서버에서 요청이 없다면 방치되던 프로세스보다 서버 자원을 더 효율적으로 사용
- 네모 칸(큐)에 있는 요청(이벤트) 중 하나가 시간이 오래걸리는 작업(ex. Disk I/O)일 때 그 뒤에 있는 이벤트는 요청을 처리하는 긴 시간동안 작업 지연 -> NginX는 시간이 오래 걸리는 작업은 따로 수행하는 스레드 풀(Thread Pool)을 만듦
- 워커 프로세스는 지금 처리할 요청이 시간이 많이 걸릴 것 같다면 스레드 풀에 그 이벤트를 위임하고 큐 안에 있는 다른 이벤트를 처리
3. Apache와 NginX
- Apach와 Nginx 중 하나를 선택해서 사용하는 때도 있지만, 함께 사용하는 경우도 있음
- 함께 사용하는 경우 Nginx는 정적 파일만 처리하며, 속도가 빨라서 앞단에서 사용하고, Apache는 Nginx에서 전달해주는 데이터를 받아 처리해주는 방식으로 사용
- 예시 : 네이버 메인페이지의 서버 아키텍처
3. Tomcat
Tomcat의 개념과 기능
- Tomcat이란 아파치 소프트웨어 재단에서 만든 오픈 소스(WAS)
- 자바 서블릿을 실행시키고 JSP코드가 포함되어 있는 웹 페이지를 만듦(동적 데이터를 처리하는 웹서버)
- DB연결 및 데이터조작, 다른 응용프로그램들과 상호 작용 가능
- 톰캣에 내장된 웹 서버로만 웹 시스템을 구성할 수 있지만, 대규모의 사용자가 사용하는 시스템을 구축하려면 웹서버와 연동하는 안정적인 시스템 구축 필요
- 톰캣은 웹 서버에서 넘어온 동적인 페이지를 읽어들여 프로그램을 실행하고 그 결과를 다시 html로 재구성하여 아파치에게 되돌려 줌
Tomcat의 구동방식
- Http Request를 Servlet Container에 전송
- Servlet Container는 HttpServletRequest, HttpServletResponse 두 객체를 생성
- 사용자가 요청한 URL을 분석해 어느 서블릿에 대한 요청인지 탐색
- 만약 해당 서블릿이 한 번도 실행된 적 없거나, 현재 메모리에 생성된 인스턴스가 없다면 새로 인스턴스를 생성하고 init() 메소드를 실행하여 초기화한 뒤 스레드를 하나 생성 이미 인스턴스가 존재할 경우에는 스레드만 하나 생성(각 서블릿 인스턴스는 서블릿 컨테이너 당 하나만 존재하기 때문)
- 컨테이너는 서블릿 service() 메소드를 호출하며, POST, GET 여부에 따라 doGet() 또는 doPost()를 호출
- 실행된 메소드는 동적인 페이지를 생성한 후 HttpServletResponse 객체에 응답을 보냄
- 응답이 완료되면 HttpServletRequest, HttpServletResponse 두 객체를 소멸
<References>
https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html
https://bentist.tistory.com/80
https://centbin-dev.tistory.com/entry/Apach와-nginx를-사용하는-이유
반응형
'개발 하나둘셋 > CS' 카테고리의 다른 글
웹소켓 개념과 원리 (0) | 2021.12.30 |
---|---|
[ Algorithm] 시간복잡도 / 공간복잡도 / 점근 표기법 (0) | 2021.12.04 |
SQL Injection이란? (SQL 삽입공격) (0) | 2021.12.03 |
TDD의 장단점 (0) | 2021.11.29 |
[네트워크] RESTful 하게 API를 디자인 한다는 것은? (0) | 2021.11.29 |