NGINX

·2023년 4월 6일
0

개발 지식

목록 보기
54/96
post-thumbnail

NGINX

소개

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

웹서버의 역사

1995. Apache HTTP Server의 등장

유닉스 기반의 최초의 웹서버인 NCSA HTTPd가의 문제를 해결하기 위해 나타났다. 대표적인 문제점으로는 커넥션시 프로세스에 대한 생성에 시간이 오래걸린다는 것이었는데, Apache HTTP Server의 경우 이 문제를 미리 프로세스를 만들어 생성하는 PREFORK 방식을 사용하여 문제를 해결했다. 새로운 클라이언트의 요청이 들어오는 경우, 미리 만든 프로세스를 바로 전달해주는 것이다.

이러한 특징은 미리 필요한 모듈을 만드는 확장성의 이점도 존재했다. 개발자는 새로운 모듈을 만들어 빠르고 간편하게 서버에 추가하는 것이 가능해졌다.

1999. C10K

C10K 란 서버에 동시에 연결되는 커넥션 수가 10000개 이상이 되면, 커넥션을 형성하지 못하는 문제이다. 이 당시 컴퓨터의 보급이 점차 늘어나면서 웹의 사용이 점차 증가하던 시기이며 점점 많아지는 커넥션에 대해 웹서버가 감당하지 못하는 문제가 발생한 것이다. 이는 당시 웹 내부에 사용되는 용량을 생각했을 때, 하드웨어적인 문제보다 Apache HTTP server의 구조적 문제가 컸다.

커넥션에 따라 프로세스를 할당하는 Apache HTTP server 에서 동시 연결이 많아진다면 그만큼 처리해야하는 프로세스가 많아지게 되고, 이는 곧 메모리 부족 현상을 발생시키는 원인이 되었다. 더불어 모듈의 확장이 편하다는 장점도, 많은 모듈을 함께 처리해야한다는 단점으로 다가왔다.

2004. NGINX 등장

이러한 Apache HTTP server를 보완하기 위해 등장한 것이, NGINX 이다. Apache HTTP server의 문제를 고치기 위한 많은 업데이트를 진행해왔으나 근본적인 구조를 바꿀 수는 없는 노릇이였다. 이를 위해 이러한 문제를 처리하기 위한 새로운 구조의 서버를 설계한 것이 NGINX 이다.

Apache HTTP server에 대한 프록시 서버 역할을 하기 위해 만들어졌으며, 문제가 되었던 수 많은 동시 커넥션의 영역을 NGINX 가 대신 관리하여 Apache HTTP server의 처리 비용을 줄인다. 또한 NGINX 자체가 웹서버이기에 필요한 정적 컨텐츠를 대신 제공하는 것이 가능하다는 것도 Apache HTTP server 입장에서는 큰 도움이 되었다.

NGINX 가 대용량의 커넥션을 견딜 수 있는 이유는 비동기 이벤트 기반 구조를 사용하기 때문이다. NGINX에는 Master process 와 worker process 가 존재하는데, Master process 는 필요한 프로세스를 처리하기 위해 worker process 를 생성하고 작업을 할당하는 역할을 하며, worker process 는 실제 커넥션에서 요청한 프로세스를 처리하는 역할을 한다. 이러한 woker process 들은 단순히 하나의 작업만 처리하고 사라지기 보다는 큐를 통해 순서대로 들어오는 프로세스 요청에 맞춰 지속적으로 할당을 받아 프로세스를 처리하게 된다. 이는 기존 Apache HTTP server 에 비교했을 때 방치되어 있는 프로세스와 PREFORK 방식에서 할당되는 메모리를 생각하면 현저히 적은 메모리 만으로도 대량의 커넥션을 처리하는 것이 가능해진다.

또한 특정 시간이 오래걸리는 요청의 경우에는 쓰레드 풀에 할당하여 대신 프로세스를 처리하고, 기존의 worker process 는 다음 작업을 진행하게 되는 방식을 통해, Apache HTTP server 대비 같은 성능으로 초당 처리 횟수가 더 높아지는 이점을 가지게 되었다. 이러한 worker process 는 CPU의 코어만큼 설정되는 경우가 많아 CPU의 부하도 줄이는 이점이 있었다.

Apache vs NGINX

Apache

  • 모듈의 확장이 편리하다.
  • 어떠한 OS에서든 안정적이다.
  • NGINX 대비 동시 커넥션 허용량 및 초당 처리 횟수가 적다. (동일한 성능일 경우, 단 업데이트를 통해 지속적으로 문제를 해결하고는 있다.)

NGINX

  • 가벼우며, 동일 성능 대비 Apache 서버보다 훨씬 효율적인 비용으로 커넥션 처리가 가능하다.
  • 로드 밸런싱을 통해 서버 부하를 줄이는 것이 가능하다.
  • 기존의 웹서버처럼 정적 컨텐츠를 제공하는 것이 가능하다.
  • 프록시 서버의 캐싱 작업이 가능하다.
  • 동적 설정 변경으로, NGINX 를 종료하지 않은 체 서버 확장이 가능하다.
  • OS 에 따라 제대로 된 성능이 나타나지 않을 수 있다고 한다.
  • 모듈 확장이 어렵다.

참고
[10분 테코톡] 🐿 제이미의 Forward Proxy, Reverse Proxy, Load Balancer
[10분 테코톡] 🤫 피케이의 Nginx
Nginx란?
Nginx란 무엇인가?

profile
새로운 것에 관심이 많고, 프로젝트 설계 및 최적화를 좋아합니다.

0개의 댓글