[참고 링크]
Web Server - WAS (참고:https://velog.io/@allsilver94/2-SpringBoot-Http-Socket)
https://www.youtube.com/watch?v=Zimhvf2B7Es
경량 웹 서버
Event-Driven 구조(비동기 이벤트 방식)의 웹 서버 소프트웨어
HTTP Web Server - 클라이언트로부터 요청을 받았을 때 요청에 맞는 정적 파일(이미 생성되어 있는 데이터:html,css,img 등)을 응답
Reverse Proxy Server - WAS 서버의 부하를 줄일 수 있는 로드 밸런서로 활용
장애에 대한 대응 - NginX에 내장된 모듈 upstream module를 통해 부사분산, 속도 개선. 장애 발생시 다른 서버와 연결하여 사용자가 서비스 이용에 불편함이 없도록 구성가능.
리버스 프록시 (Reverse Proxy)
리버스 프록시 서버는 쉽게 설명하면 중계 기능을 하는 하는 서버이다. 클라이언트가 서버를 호출할 때 직접 서버에 접근 하는 것이 아니라 리버스 프록시 서버를 호출하게 되고, 리버스 프록시 서버가 서버에게 요청을 하고 응답을 받아 클라이언트에 전달을 한다.
(WAS, 웹 어플리케이션 서버는 대부분 DB 서버와 연결되어 있기 때문에 WAS가 최전방에 있으면 보안에 취약해짐)
클라이언트는 리버스 프록시 서버를 호출하기 때문에 실제 서버의 IP를 감출 수 있고(서버 내부적으로 파일들이 어느 폴더에 있는지, 어느 서비스가 어느 포트에서 작업 중인지 등 서버의 정보를 감춤) 이를 통해 보안을 높일 수 있다는 장점이 있다.
클라이언트와 WAS 사이의 중계자로서 둘 사이의 통신을 담당. WAS는 서버 확장에 있어 자유로워짐. 클라이언트가 요청하는 End Point는 프록시 서버의 도메인임.
!- 포워드 프록시 : 클라이언트(사용자)가 인터넷에 직접 접근하는게 아니라 포워드 프록시 서버가 요청을 받고 인터넷에 연결하여 결과를 클라이언트에 전달 (forward) 해준다. 프록시 서버는 Cache 를 사용하여 자주 사용하는 데이터라면 요청을 보내지 않고 캐시에서 가져올 수 있기 때문에 성능 향상이 가능.
(장점)
1.보안
프록시 서버를 사용하면 클라이언트나 서버 모두 IP를 숨길 수 있다. 실제 서버 또는 클라이언트의 IP를 숨기고 프록시 서버의 IP만 공개함으로써 해킹을 대비한다.
2.성능
프록시 서버를 사용하여 캐싱 기능과 트래픽 분산으로 성능 향상을 가져올 수 있다. 캐싱 기능은 자주 사용되는 동일한 요청을 캐싱하여 재활용하는 방식이다. 실제 서버로 다시 호출하지 않고 프록시 서버가 대신 응답을 주어 서버의 자원 사용을 줄여준다.
3.트래픽 분산
일부 프록시 서버는 로드 밸런싱도 제공하여 여러 대의 분산된 서버가 있다면 서버의 트랙픽을 분산시켜준다. 그리고 앤드 포인트(URL)마다 호출하는 서버를 설정할 수 있어 역할에 따라 서버의 트래픽을 분산할 수 있다.
HTTPS의 인증서 관리를 하나의 프록시 서버가 담당하고 뒤에 동작하고 있는 서버는 HTTP로 서비스할 수 도 있다. 이렇게 되면 서버를 실행할 때마다 인증서를 관리하지 않아도 되는 장점이 있다.
로드밸런싱
로드밸런서는 직역하면 부하 분산으로, 서버에 가해지는 부하를 분산해주는 역할을 하는 것이다.
이용자가 많아서 발생하는 요청이 많을 때, 하나의 서버에서 이를 모두 처리하는 것이 아니라 여러대의 서버를 이용하여 요청을 처리하게 한다.
이때 서버의 로드율과 부하량 등을 고려하여 적절하게 서버들에게 분산처리 하는 것을 로드 밸런싱이라고 한다.
하나의 서버가 멈추더라도 서비스 중단 없이 다른 서버가 서비스를 계속 유지할 수 있는 무중단 배포가 가능하다는 장점이 있다. (무중단 배포)
Event-Driven 처리 기반 구조
Context Swiching
Context: 스레드가 작업을 진행하는 동안 작업정보(레지스터, 커널스택, 사용자스택 등)를 보관.
OS가 A작업을 진행할 때 A스레드의 Context를 읽어오며, B스레드로 전환 할 때 A스레드의 Context를 저장하고 B스레드의 Context를 읽어오는 일련의 반복을 수행.
스레드의 갯수가 많아질 수록 context swiching 작업은 더 빈번하게 일어나고, 이 때문에 성능이 저하될 수 있음.
NginX 1개의 master process와 3종류의 자식 프로세스로 구성
master process(Worker Process를 관리)
(1) 특권 명령을 수행하고, Single Thread로 구성된 다수의 Worker Process 관리
child processes
(1) cache loader
(2) cache manager
(3) worker process(Single Thread)
NginX에서는 커넥션 생성 및 커넥션 제거, 그리고 새로운 요청을 처리하는 것을 이벤트라고 부른다. 이 이벤트들은 OS커널이 큐 형식으로 worker 프로세스에게 전달해주고, 이벤트가 큐에 담긴 상태에서 worker 프로세스가 처리할 때까지 비동기 방식으로 대기한다. 그리고 워커 프로세스는 하나의 스레드로 이벤트를 꺼내서 처리해 나간다. 이렇게 되면 워커 프로세스가 쉴틈없이 일하기 때문에 아파치 서버에서 요청이 없다면 방치되던 프로세스보다 서버 자원을 더 효율적으로 쓸 수 있게 되는 것이다.
그러나 네모 칸(큐)에 있는 요청(이벤트) 중 하나가 시간이 오래걸리는 작업(ex. Disk I/O)이면 어떻게 될까?
그 뒤에 있는 이벤트는 요청을 처리하는 긴 시간동안 블로킹이 된다. 그래서 NginX는 시간이 오래 걸리는 작업은 따로 수행하는 스레드 풀(Thread Pool)을 만들어놓고, 워커 프로세스는 지금 처리할 요청이 시간이 많이 걸릴 것 같다면 스레드 풀에 그 이벤트를 위임하고 큐 안에 있는 다른 이벤트를 처리하러 가게 된다.
https://juneyr.dev/nginx-basics
https://icarus8050.tistory.com/
Apache는 멀티 프로세스 모듈(MPM) 방식으로 처리하고, NginX는 이벤트 기반(Event-Driven) 방식으로 처리한다.
잦은 IO를 처리하는 서비스는 성능과 가벼움이 강점으로 여겨지는 NginX, 안정성이 중요시되는 서비스에는 Apachi를 사용
네이버 메인 페이지의 서버 아키텍쳐