우선 NginX(엔진엑스)에 대해 이야기 하기 전에 서버 구조를 확인하자.

우리가 소위 Web server(웹 서버)로 포괄적으로 부르는 부분엔 웹 서버와 WAS가 존재하는데, 각각 다음과 같은 차이가 있다.
| 항목 | Web Server | WAS |
|---|---|---|
| 정의 | 정적인 콘텐츠(HTML, CSS, 이미지 등)를 제공하는 서버 | 동적인 콘텐츠(웹 애플리케이션)를 처리하고 제공하는 서버 |
| 기능 | HTTP 프로토콜을 이용해 클라이언트에게 웹 페이지 제공 | 웹 애플리케이션 실행 및 데이터 처리, 웹 서버와 클라이언트 간의 중계 역할 |
웹 서버는 클라이언트가 웹 브라우저를 통해 요청한 정적 콘텐츠를 제공하는 역할을 한다. 웹 서버는 주로 HTTP 프로토콜을 사용하여 작동하며, 클라이언트가 URL을 통해 요청한 웹 페이지를 찾아 전송해준다.
WAS는 웹 애플리케이션을 실행하여 동적 콘텐츠를 생성하고, 웹 서버와 클라이언트 간의 데이터 처리를 담당하는 역할을 한다. WAS는 클라이언트의 요청에 따라 데이터베이스에서 정보를 가져오거나, 웹 애플리케이션을 실행하여 동적인 웹 페이지를 생성한 후 결과를 웹 서버에 전달한다. 웹 서버는 이를 받아 클라이언트에게 전달한다.

Nginx는 가장 먼저 마스터 프로세스(master process)라는 것을 볼 수 있다.
설정 파일을 읽고 워커 프로세스(worker process)를 생성하는 프로세스이다.
이 워커 프로세스가 실제로 일을 하는데, 워커 프로세스가 생성될 때 각자 지정된 listen 소켓을 배정받는다.
그 소켓에 새로운 클라이언트 요청이 들어오면 커넥션을 형성하고 처리한다.
커넥션은 정해진 Keep Alive 시간만큼 유지되는데, 이렇게 커넥션이 형성되었다고 해서 워커 프로세스가 커넥션 하나만 담당하진 않는다. 형성된 커넥션에 아무런 요청이 없으면 새로운 커넥션을 형성하거나 이미 만들어진 다른 커넥션으로부터 들어온 요청을 처리한다.
Nginx에서는 이러한 connection 형성과 제거, 그리고 새로운 요청을 처리하는 것을 이벤트(event)라고 한다.

이벤트들은 OS 커널이 큐 형식으로 워커 프로세스에게 전달해준다.
이벤트는 큐에 담긴 상태에서 워커 프로세스가 처리할 때까지 비동기 방식으로 대기한다.
그리고 워커 프로세스는 하나의 스레드로 이벤트를 꺼내서 처리해 나간다.
아파치 서버는 커넥션 연결 후 요청이 없다면 방치되는 반면, NGINX는 커넥션 연결 후 요청이 없으면 다른 커넥션의 요청을 처리하거나 새로운 커넥션을 형성하므로 아파치 서버에 비해 서버 자원을 효율적으로 쓰는 것을 알 수 있다.
그럴 경우를 대비해서 스레드 풀(Thread Pool)을 만들어 그 요청은 따로 수행하게 된다.
워커 프로세스는 처리할 요청이 시간이 오래 걸릴 것 같으면 스레드 풀에 이벤트를 위임하고 다른 이벤트를 처리한다.
이런 워커 프로세스는 보통 CPU 코어 수만큼 생성하게 된다. 그래서 코어가 담당하는 프로세스를 바꾸는 횟수를 줄이기에 CPU의 컨텍스트 스위칭을 줄이게 된다.
이게 바로 Nginx가 사용하는 Event-Driven Model(이벤트 기반 구조)이다.
리버스 프록시를 사용해서 여러 대의 서버를 하나의 주소로 관리하여 로드밸런싱 효과를 얻을 수 있다.
nginx에 여러대의 서버가 연결되었을 시, 한 서버에 부하가 걸리지 않도록 균등하게 요청을 분배하는 역할을 한다.
Nginx가 클라이언트와 https 통신을 함
server와는 http통신을 한다.
Nginx를 클라이언트 쪽과 가깝게 배치하여, 한번 서버로부터 받은 응답을 보관하고 클라이언트에게 바로 응답할 수 있다.