Search
Duplicate
📒

[Docker Container] 10-1. NGINX란 무엇인가?

상태
미진행
수업
Docker Container
주제
Nginx
4 more properties
참고

Nginx란?

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

Nginx가 만들어진 배경

Apache Server

NOTE

Apache Server의 탄생

Apache Server 구조
초창기 웹 서버는 버그가 굉장히 많아 불편함을 많이 느끼게되어서 Apache Server가 나오게 된다.
Apache 같은 경우 요청이 들어오면 connection을 생성하고, 그래서 새로운 클라이언트의 요청이 올 때마다 새로운 process를 생성한다.
Apache의 PREFORK
그런데 process를 생성하는 과정은 시간이 오래 걸리기 때문에 process를 미리 만들어 두는 PREFORK라는 방식을 이용했다.
새로운 클라이언트의 요청이 오면 미리 만들어 놓은 process를 할당했고, 없다면 추가로 process를 생성했다.

APACHE 서버의 확장성

APACHE의 뛰어난 확장성
이러한 구조 덕분에 개발자는 다양한 모듈을 만들어서 서버에 빠르게 기능을 추가할 수 있다.
즉 확장성이 높았고, Apache Server동적 컨텐츠를 처리할 수 있게 되었다.
확장성이 좋다는 장점은 결국 요청을 받고, 응답을 처리하는 과정을 하나의 서버에서 해결하기 좋았다.

Apache Server 문제점

NOTE

Apache Server의 문제점

connection이 너무 많이 생겨서 더 생성하지 못함!
1999년 이후 컴퓨터의 보급화가 시작되면서 서버에 요청이 많아지고, 동시에 연결된 connection이 많아지면서 새로운 connection을 생성하지 못하게 되었다.
이를 C10K(connection 10000 problem) 문제라고 하는데, connection 1만개의 문제라는 의미이다.
Apache 3대문제
Apache Server는 구조적으로 아래와 같은 문제점이 있다.
1.
메모리 부족
connection이 연결될 때 마다 프로세스를 생성
2.
무거운 프로그램
확장성이 좋다 → 리소스가 많다
3.
CPU 부하 증가
많은 connection 요청 → context switching을 많이한다 (CPU 부하 증가)

NGINX의 등장!

NOTE
Nginx + Apache
Apache Server는 현대로 올수록 사용하기 꺼려졌고, 이러한 구조를 해결하기 위해 NGINX가 등장했다!
초창기 NGINXApache와 함께 사용하기 위해 만들어 졌다!
웹 서버이지만, Apache를 대체하기 위해 만들어지지 않음
Apache Server가 지닌 구조적 한계를 NGINX를 사용하면서 극복하려고함

Nginx의 구조

NGINX의 등장!

NOTE
Nginx는 어떠한 구조로 되어있길래 그 많은 동시 connection을 유지할 수 있는가?
Nginx의 구조
Nginx는 설정파일을 일고, 설정에 맞게 worker process를 생성하는 master process가 존재한다.
worker process
실제로 일을 하는 프로세스, worker process가 만들어 질 때 지정된 listen 소켓을 배정받는다.
그리고 그 소켓에 새로운 클라이언트의 요청이 들어오면 connection을 형성하고 처리한다.
connection은 정해진 Keep-Alive 시간만큼 유지된다. 하지만 connection이 형성되어있다고 해서 worker process가 해당 connection 하나만 담당하지는 않는다.
형성된 connectinon으로부터 아무런 요청이 없다면 새로운 connection을 형성하거나 이미 만들어진 다른 connection으로 부터 들어온 요청을 처리한다.

NGINX의 이벤트

NOTE
Nginx의 connection 형성과 제거, 그리고 새로운 요청을 처리하는 것을 이벤트(event)라고 한다.
Nginx의 이벤트(event)
Nginx의 메모리 부족 현상 해결
그리고 이 이벤트들은 OS커널이 queue형식으로 worker process에게 전달한다.
이 이벤트들은 queue에 담긴 상태에서 비동기 상태로 대기한다. 그리고 worker process는 하나의 스레드로 이벤트를 꺼내서 처리해나간다.
이러한 방식은 worker process가 쉬지 않고 일을 하기에, 요청이 없을 때 프로세스를 방치시키는 Apache Server보다 훨씬 효율적으로 자원을 사용할 수 있다.
Apache 스레드 방식 (하나의 작업만 진행한다)
Nginx: Event-driven 방식 (queue에 있는 connection을 worker process가 계속해서 처리한다)

Nginx의 장단점

NGINX의 단점

NOTE
동적 컨텐츠를 기본적으로 처리할 수 없음
동적 콘텐츠에 대한 PHP 및 기타 요청을 처리하려면 NGINX를 실행하기 위해 외부 프로세서로 전달하고 렌더링 된 콘텐츠가 다시 전송 될 떄 까지 기다려야 한다 (프로세스 속도 저하)
동적 웹 페이지 콘텐츠를 가진 모든 요청을 위해 외부 자원과 연계(php-fpm)

NGINX의 단점

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