Nginx란?

코딩을 합시다·2023년 4월 17일
0

Nginx란?

Nginx란 트래픽이 많은 웹사이트의 서버(WAS)를 도와주는 비동기 이벤트 기반구조의 경량화 웹 서버 프로그램입니다. 클라이언트로부터 요청을 받았을 때 요청에 맞는 정적 파일을 응답해주는 HTTP Web Server로 활용되기도 하고, 또는 Reverse Proxy Server로 활용하여 WAS의 부하를 줄일 수 있는 로드밸런서 역할을 하기도 합니다.

Nginx가 만들어진 배경

  1. 초기의 웹서버에 버그가 많아 개발자들의 불편함이 많았음
  2. 이 문제를 해결하기 위해 Apache Server를 개발
  3. Apache의 특징으로 요청이 들어오면 새로운 connection과 process를 생성함

  1. process를 생성하는 과정이 시간이 오래걸리는 문제가 발생
  2. 이를 해결하기 위해 process를 미리 만들어 두는 PREFORK 방식을 사용(만약 process가 없다면 추가로 process 생성)

  1. 이러한 구조로 Apache Server는 다양한 모듈을 서버에 추가할 수 있게 확장성이 좋아지고 동적 컨텐츠를 처리할 수 있게 됨.

  1. 1999년 많은 컴퓨터의 보급으로 서버에 동시에 연결된 connection이 많아져 더 이상 새로운 connection을 생성 못하는 문제가 발생
  2. Apache Server의 3가지 구조적인 문제가 발생하게 됨
    • 메모리 부족: connection이 연결될 때마다 프로세스를 생성
    • 무거운 프로그램: 확장성이 좋다는건 곧 리소스가 많다는 걸 의미
    • CPU 부하 증가: 많은 connection 요청이 들어오면 context switching을 많이 하기에 CPU 부하가 증가

  1. Apache는 현대로 올수록 사용하기 꺼려졌고 이러한 문제를 해결하기 위해 Nginx가 2004년에 등장함.

  1. 초창기 Nginx는 Apache와 함께 사용하기 위해 만들어짐(웹 서버이기는 하지만 Apache를 완전히 대체할 목적은 아니었음)
  2. 수많은 동시 connection을 Nginx가 유지
  3. Nginx도 웹 서버이기에 정적파일에 대한 요청을 스스로 처리하고 클라이언트로부터 동적 파일의 요청을 받았을 때만 Apache Server와 connection을 형성하여 Apache Server의 부하를 줄임

Nginx의 구조

그렇다면 Nginx는 어떠한 구조로 되어있길래 그 많은 동시 connection을 유지할 수 있을까요?

  1. Nginx는 설정파일을 읽고, 설정에 맞게 worker process를 생성하는 master process가 있음.
  2. worker process는 실제로 일을 하는 프로세스이며 worker process가 만들어질 때 지정된 listen 소켓을 배정받습니다.
  3. 그리고 그 소켓에 새로운 클라이언트의 요청이 들어오면 connection을 형성하고 처리합니다.
  4. connection은 정해진 Keep-Alive 시간만큼 유지됨 하지만 connection이 형성되었다고 해서 worker process가 해당 connection 하나만 담당하지는 않습니다
  5. 형성된 connection으로부터 아무런 요청이 없다면 새로운 connection을 형성하거나 이미 만들어진 다른 connection으로 부터 들어온 요청을 처리

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

  1. 이벤트들은 os커널이 queue형식으로 worker process에 전달
  2. 이벤트들은 queue에 담긴 상태에서 비동기 상태로 대기 그리고 worker process는 하나의 스레드로 이벤트를 꺼내서 처리
  3. 이러한 방식은 요청이 없을 때 process를 방치시키는 Apache Server보다 훨씬 효율적으로 자원을 사용할 수 있음

  1. Apache 방식인 스레드 기반은 하나의 커넥션 당 하나의 스레드를 잡아먹음
  2. Nginx는 이벤트 기반 방식으로 여러 개의 connection을 전부 Event Handler를 통해 비동기 방식으로 처리해 먼저 처리되는 것부터 로직이 진행되게끔 함.

이러한 이벤트 기반 구조가 바로 Nginx의 핵심임.

Nginx의 장단점

Nginx의 단점

  • 동적 컨텐츠를 기본적으로 처리 할 수 없음
  • 동적 콘텐츠에 대한 PHP 및 기타 요청을 처리하려면 NGINX가 외부 프로세서로 전달하고 렌더링 된 콘텐츠가 다시 전송 될 때까지 기다려야함(프로세스 속도 저하)

Nginx의 장점

  • 이벤트 중심 접근 방식을 사용하여 클라이언트 요청 제공
  • 제한된 하드웨어 리소스로도 여러 클라이언트 요청을 동시에 효율적으로 처리
  • 단일 스레드를 통해 여러 연결을 처리 가능
  • 최소한의 리소스로 웹 서버의 아키텍처를 개선하기 위해 독립형 HTTP 서버로 배치 가능

성능 비교

위 이미지는 동시 connection 수 당 메모리 사용률을 나타냅니다. Apache Server에 비해 Nginx는 동시 connection 수가 늘어나도 메모리 사용률이 낮고 일정한 사실을 알 수 있습니다.

동시 connection 수가 많아졌을 때 처리하는 초당 요청 수는 Nginx가 Apache에 비해 압도적으로 높은 모습을 보여줍니다.

정리

Apache의 한계

클라이언트 접속마다 Process 혹은 Thread 를 생성하는 구조입니다. 1만 클라이언트로부터 동시접속 요청이 들어온다면 CPU 와 메모리 사용이 증가하고 추가적인 Process/Tread 생성비용이 드는 등 대용량 요청에서 한계를 보입니다. 또한, Apache 서버의 프로세스가 blocking 될 때 요청을 처리하지 못하고 처리가 완료될 때까지 대기상태에 있습니다. 이는 Keep Alive(접속대기) 로 해결이 가능하지만, 효율이 떨어집니다.

Nginx 의 정리

Nginx 는 위에서 언급했듯이 Event-Driven 방식으로 동작합니다. 즉, 프로그램 흐름이 이벤트에 의해 결정이 됩니다. 한 개 또는 고정된 프로세스만 생성하고, 그 내부에서 비동기로 효율적인 방식으로 task 를 처리합니다. Apache 와 달리 동시접속자 수가 많아져도 추가적인 생성비용이 들지 않습니다.

  • 비동기 이벤트 기반으로 요청하여 적은양의 스레드가 사용되기 때문에 CPU소모가 적습니다.
  • Apache 와 달리 CPU 와 관계없이 I/O 들을 전부 Event Listener로 미루기 때문에 흐름이 끊이지 않습니다.
  • context switching 비용이 적습니다.

NGINX 기능

  • 웹 서버
  • 로드 밸런서
  • 웹 서버 가속기
  • SSL 터미네이션 : 클라이언트와 https 통신하고, 서버와 http 통신하는 것
  • 캐싱 : http 프로토콜을 사용하여 전달하는 콘텐츠를 캐싱할 수 있음, 한 번 서버에서 응답받은 것을 스스로 보관하고 클라이언트에 전달함.
  • HSTS(HTTP Strict Transport Security)
  • CORS 처리
  • TCP/UDP 커넥션 부하 분산
  • HTTP/2 등

참고

0개의 댓글