NginX란?

devkwon·2024년 9월 3일

BackEnd

목록 보기
4/7

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

우리가 소위 Web server(웹 서버)로 포괄적으로 부르는 부분엔 웹 서버와 WAS가 존재하는데, 각각 다음과 같은 차이가 있다.

항목Web ServerWAS
정의정적인 콘텐츠(HTML, CSS, 이미지 등)를 제공하는 서버동적인 콘텐츠(웹 애플리케이션)를 처리하고 제공하는 서버
기능HTTP 프로토콜을 이용해 클라이언트에게 웹 페이지 제공웹 애플리케이션 실행 및 데이터 처리, 웹 서버와 클라이언트 간의 중계 역할

Web Server

웹 서버는 클라이언트가 웹 브라우저를 통해 요청한 정적 콘텐츠를 제공하는 역할을 한다. 웹 서버는 주로 HTTP 프로토콜을 사용하여 작동하며, 클라이언트가 URL을 통해 요청한 웹 페이지를 찾아 전송해준다.

WAS(Web Application Server)

WAS는 웹 애플리케이션을 실행하여 동적 콘텐츠를 생성하고, 웹 서버와 클라이언트 간의 데이터 처리를 담당하는 역할을 한다. WAS는 클라이언트의 요청에 따라 데이터베이스에서 정보를 가져오거나, 웹 애플리케이션을 실행하여 동적인 웹 페이지를 생성한 후 결과를 웹 서버에 전달한다. 웹 서버는 이를 받아 클라이언트에게 전달한다.

왜 웹 서버를 사용하는가?

  1. WAS 부담을 줄여주기 위해. WAS는 로그인, 회원가입, 개인정보 수정 등 동적 작업을 처리하는 것만으로도 작업량이 많다. 이에 HTML, CSS, JS, 이미지 등 정적인 파일을 클라이언트에게 전달하는 역할을 웹 서버에게 위임함으로써 WAS 작업 부담을 줄일 수 있다.
  1. 보안 기능을 제공. 웹 서버는 보안 기능을 제공하여 웹 페이지에 대한 접근을 제어할 수 있다. 예를 들어, 웹 서버는 SSL/TLS 프로토콜을 사용하여 데이터를 암호화하고, 액세스 제어, 웹 방화벽 등의 보안 기능을 제공하여 웹 사이트를 보호할 수 있다.
  1. 높은 성능을 제공. 웹 서버는 대부분 비동기 처리 방식을 사용하여 높은 성능을 제공한다. 예를 들어, Nginx, Apache 등의 웹 서버는 이벤트 기반, 멀티 프로세싱, 스레드 풀 등의 기술을 사용하여 수천 대의 클라이언트 요청을 동시에 처리할 수 있다.

NginX의 구조

Nginx는 가장 먼저 마스터 프로세스(master process)라는 것을 볼 수 있다.
설정 파일을 읽고 워커 프로세스(worker process)를 생성하는 프로세스이다.

이 워커 프로세스가 실제로 일을 하는데, 워커 프로세스가 생성될 때 각자 지정된 listen 소켓을 배정받는다.
그 소켓에 새로운 클라이언트 요청이 들어오면 커넥션을 형성하고 처리한다.

커넥션은 정해진 Keep Alive 시간만큼 유지되는데, 이렇게 커넥션이 형성되었다고 해서 워커 프로세스가 커넥션 하나만 담당하진 않는다. 형성된 커넥션에 아무런 요청이 없으면 새로운 커넥션을 형성하거나 이미 만들어진 다른 커넥션으로부터 들어온 요청을 처리한다.

Nginx에서는 이러한 connection 형성과 제거, 그리고 새로운 요청을 처리하는 것을 이벤트(event)라고 한다.

이벤트들은 OS 커널이 큐 형식으로 워커 프로세스에게 전달해준다.

이벤트는 큐에 담긴 상태에서 워커 프로세스가 처리할 때까지 비동기 방식으로 대기한다.

그리고 워커 프로세스는 하나의 스레드로 이벤트를 꺼내서 처리해 나간다.

아파치 서버는 커넥션 연결 후 요청이 없다면 방치되는 반면, NGINX는 커넥션 연결 후 요청이 없으면 다른 커넥션의 요청을 처리하거나 새로운 커넥션을 형성하므로 아파치 서버에 비해 서버 자원을 효율적으로 쓰는 것을 알 수 있다.

만약 큐에 담긴 요청중 하나가 시간이 오래 걸린다면?

그럴 경우를 대비해서 스레드 풀(Thread Pool)을 만들어 그 요청은 따로 수행하게 된다.

워커 프로세스는 처리할 요청이 시간이 오래 걸릴 것 같으면 스레드 풀에 이벤트를 위임하고 다른 이벤트를 처리한다.

이런 워커 프로세스는 보통 CPU 코어 수만큼 생성하게 된다. 그래서 코어가 담당하는 프로세스를 바꾸는 횟수를 줄이기에 CPU의 컨텍스트 스위칭을 줄이게 된다.

이게 바로 Nginx가 사용하는 Event-Driven Model(이벤트 기반 구조)이다.

NginX의 장점

리버스 프록시

리버스 프록시를 사용해서 여러 대의 서버를 하나의 주소로 관리하여 로드밸런싱 효과를 얻을 수 있다.

로드밸런싱

nginx에 여러대의 서버가 연결되었을 시, 한 서버에 부하가 걸리지 않도록 균등하게 요청을 분배하는 역할을 한다.

SSL 터미네이션

Nginx가 클라이언트와 https 통신을 함
server와는 http통신을 한다.

  • 이 과정을 통해 서버가 복호화 과정을 담당하지 않도록 해준다.
  • 비즈니스 로직에 비중을 둘 수 있도록 부하를 줄여준다.
  • 보통 Nginx와 서버는 같은 네트워크 상에 있기 때문에 http통신을 해도 보안 이슈가 비교적 적다.

캐싱

Nginx를 클라이언트 쪽과 가깝게 배치하여, 한번 서버로부터 받은 응답을 보관하고 클라이언트에게 바로 응답할 수 있다.

0개의 댓글