Nginx란?

이택승·2022년 8월 30일
0

Nginx란?

  • 오픈소스 기반의 경량 웹 서버이다.
  • 다음의 기능을 수행할 수 있다.
    1. web serving
    2. reverse proxing
    3. caching
    4. load balancing
    etc..

WebServer

  • 웹 사이트의 컨텐츠(텍스트, 이미지, 동영상 등등)를 저장하고, 클라이언트가 웹 사이트를 요청하면 전달해주는 역할을 한다.
  • 웹 서버는 브라우저와 HTTP 를 통해 통신한다. 이때 웹 페이지의 컨텐츠는 HTML 방식으로 인코딩된다.

C10K 문제란?

  • 1만개의 클라이언트를 동시에 처리할 수 있는 네크워크 I/O 모델의 설계 방법을 묻는 것이다.
  • 인터넷이 발전하면서 클라이언트가 늘어나게 되었고, 기존 I/O 모델로는 커넥션을 유지할 수 없는 문제가 발생하였다.
  • C10K 문제의 해결 답안으로 나온 것이 Nginx이다. 이때 사용한 방식이 비동기, Event-Driven이다.

비동기, Event-Driven

Background

기본적으로 이 방식을 이해하기 위해서는 Nginx의 프로세스 모델을 알 필요가 있다.
Nginx는 다음과 같이 master process, worker process 등으로 구성되어 있다.

다음 사진은 AWS EC2의 프리티어 서버를 개설하고 nginx를 설치한 후 실행중인 프로세스를 조회한 것이다.
사진에서 보면 worker process가 1개인 것을 볼 수 있는데 보통 CPU의 코어 개수와 worker process의 개수가 동일하다. (프리티어 코어 개수는 1개)

각 프로세스가 하는 일은 다음과 같이 정리할 수 있다.

  • master process: 설정 파일을 읽고, 포트를 바인딩하고 worker process를 생성한다.
  • worker process: 실제 일을 하는 프로세스, 네트워크 연결을 처리하거나 디스크에 읽거나 쓰는 역할 등을 수행한다.

worker process는 생성될 때 listen socket들을 할당받고 event(새로운 connection 생성)를 기다리게 된다.

체스를 통한 이해

  • Nginx에서 사용하는 Non-Blocking, Event-Driven 방식을 설명하기 위해 참고한 블로그처럼 체스에 빗대어 보겠습니다.

Blocking

ChessBlocking
대전 상대가 나타날 때까지 기다린다.listen socket에 새로운 연결 요청이 올 때까지 기다린다. (event를 기다린다.)
대전 상대가 나타나 게임을 받아들인다.소켓에 새로운 연결 요청이 나타나면 연결을 받아들인다.
게임이 시작되고, 말을 움직이고 상대방이 둘 때까지 기다린다.client의 응답(response)이 올 때까지 기다린다.
게임이 끝나면, 다시 게임을 진행할건지 보기 위해 기다린다.webserver는 연결의 keep-alive 시간만큼 기다린다.
만약 시간이 너무 지나거나 상대방이 안한다고 하면, 새로운 상대방을 기다린다.연결이 종료될 때(클라이언트가 연결을 종료하거나 타임아웃될 때), 웹 서버 프로세스는 새로운 연결 listening을 진행한다.

Non-Blocking

- 이번 체스 게임은 여러 명과 동시에 진행하는 경우이다.
- 엄청난 체스의 마스터라 한번 두고 옆의 테이블로 이동할 수 있다.

ChessNon-Blocking
대전 상대가 나타날 때까지 기다린다.listen socket에 새로운 연결 요청이 올 때까지 기다린다. (event를 기다린다.)
대전 상대가 나타나 새로운 게임을 시작한다.listen socket에 event가 발생하여 worker process가 새로운 connection socket 생성
상대가 말을 움직인다.connection socket에 event 발생
상대방이 움직인 것에 대응하여 나도 말을 움직인다.connection socket에 event 발생에 따라 대응한다.

Blocking vs Non-Blocking

  • Blocking
    • 각각의 active HTTP connection은 대응되는 쓰레드나 프로세스가 존재해야 한다.
    • 이는 연결 요청이 많아져 대응할 수 없는 쓰레드나 프로세스가 없어지게 되면 새로운 연결을 할 수 없는 문제가 생긴다.
    • 또한 비교적 가벼운 HTTP 요청을 각 쓰레드나 프로세스가 처리하기에는 심한 낭비가 예상된다.
  • Non-Blocking
    • 이 방식에서는 worker process는 상대방(클라이언트)의 응답을 기다리지 않고 event에 대응한 후 바로 다음 event를 진행한다.
    • 이를 통해 하나의 프로세스는 여러 개의 connection을 유지할 수 있게 된다.
    • 각 연결이 차지하는 메모리가 적어 context switching이 덜 발생한다.

Nginx Reverse Proxy

  • Load Balancing: 클라이언트 요청을 nginx 서버를 통해 분산할 수 있다. 대표적으로 프록시 서버 뒤에 여러 개의 웹 서버를 두어 부하를 나눌 수 있다.
  • SSL Termination: nginx 서버는 HTTPS를 통해 요청을 받고 웹 서버에는 HTTP를 통해 요청한다.
    (출처)
  • Caching: 웹 서버로 부터 받은 응답을 캐싱하였다가 해당 컨텐츠에 대한 요청이 들어오면 프록시 서버에서 캐싱해둔 컨텐츠를 전달한다.

참고

https://www.nginx.com/resources/glossary/nginx/
https://kanoos-stu.tistory.com/entry/Nginx
https://manhyuk.github.io/c10k-problem/
https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/

profile
백엔드 개발자입니다.

0개의 댓글