Nginx ?

동시 접속 처리 특화된 웹 서버 (로드밸런싱)

클라이언트로부터 http 요청을 받아 요청에 해당하는 파일을 http 통신을 통해 응답하는 웹 서버 프로그램

 

 

Apache 와의 차이점

기존 Apache의 구조는 요청이 들어올 때 마다 프로세스를 할당하는 구조

이용자 증가 시 프로세스도 비례하여 중가하게 되고, 이는 메모리 부족을 일으킬 수 있다

Apache의 장점이었던 확장성 덕분에 다양한 모듈 추가가 가능했고, 프로세스가 차지하는 리소스의 양도 그만큼 증가

많은 요청 처리를 위해 cpu코어가 계속해서 context-swiching 시도했고

대용량 트래픽을 감당하기에는 Apache 서버의 구조가 적합하지 않았다

 

 

Nginx 구조

master process

설정 파일을 읽고, 설정 파일에 맞게 worker process를 생성하는 작업

 

worker process

실제로 요청을 처리하는 작업

master process에서 배정받은 listen socket을 통해 클라이언트와 커넥션 형성

해당 커넥션은 keep-alive 시간동안 유지

 

worker process는 커넥션 하나만 담당하지 않음

형성된 커넥션에 아무런 요청이 없을 경우

1. 새로운 커넥션 형성

2. 이미 만들어진 기존 커넥션에 요청이 들어온다면 해당 요청을 처리

이러한 작업들을 통틀어 이벤트 라고 명칭

 

이벤트들을 OS커널이 큐 형식으로 worker process에게 전달

큐에 담긴 이벤트는 worker process가 처리해줄 때 까지 비동기 방식으로 대기

worker process는 이벤트를 하나씩 꺼내어 처리

 

>> worker process가 쉬는 시간 없이 작업 가능

>> apache구조에서 요청 없을 때 방치되던 프로세스와 리소스를 효율적으로 사용 가능

 

요청 중 하나가 시간이 오래걸린다면?

오래걸리는 요청을 처리하는 쓰레드풀 존재

특정 작업이 오래 걸리 경우 쓰레드풀에 작업 위임

>> context-swiching 최소화

이러한 구조를 이벤트 기반 구조 Event-driven model 라고 한다

 

Reverse Proxy?

 

Forward Proxy

클라이언트와 웹 사이에 위치

클라이언트의 요청을 서버에 대신 전달

클라이언트의 정보가 서버측에 노출되지 않는다

 

 

Reverse Proxy

 

포워드 프록시와는 반대로, 클라이언트의 요청을 서버 대신 받고, 이를 서버에 전달

클라이언트는 프록시 뒤의 서버의 존재를 인지할 수 없음

 

여러 가용 서비스 사이에서 부하분산과 고가용성 제공

클라이언트와 서버 사이의 트래픽 검사 및 보호

 

 

SSL 터미네이션

클라이언트는 Nginx에게 요청 보내고

Nginx는 서버와 http 통신

 

이 과정에서 서버가 직접 복호화 과정 담당하지 않도록 해줌

서버는 비즈니스 로직에 집중 가능

 

클라이언트 -- [https] --> Nginx --[http] --> 서버

 

 

+ Recent posts