Nginx

본 글은 네이버 부스트캠프 과정을 위해 별도 학습 후 작성한 노션 문서를 이전한 글입니다.


1. 서론

1.1. Nginx란

  • 경량 웹 서버
    1. 클라이언트로부터 요청을 받았을 때 요청에 맞는 정적 파일을 응답해주는 HTTP Web Server로 활용
    2. WAS 서버의 부하를 줄일 수 있는 로드 밸런서 역할을 하는 Reverse Proxy Server로 활용

1.2. Nginx 흐름

image

  • Nginx는 Event-Driven 구조로 동작하기 때문에 한 개 또는 고정된 프로세스만 생성하여 사용
    • 비동기 방식으로 요청들을 Concurrency(동시성)하게 처리할 수 있음
  • 새로운 요청이 들어오더라도 새로운 프로세스와 쓰레드를 생성하지 않기 때문에 프로세스와 쓰레드 생성 비용이 존재하지 않음
    • 적은 자원으로도 효율적인 운용이 가능
  • 이러한 Nginx의 장점 덕분에 단일 서버에서도 동시에 많은 연결을 처리할 수 있음

1.3. Nginx 구조

image

  • 하나의 Master Process와 다수의 Worker Process로 구성되어 실행됨
  • Master Process
    • 설정 파일을 읽고 유효성을 검사 및 Worker Process를 관리
  • Worker Process
    • 모든 요청을 처리
    • Nginx는 이벤트 기반 모델을 사용하고, Worker Process 사이에 요청을 효율적으로 분배하기 위해 OS에 의존적인 메커니즘을 사용
    • Worker Process의 개수는 설정 파일에서 정의, 정의된 프로세스 개수와 사용가능한 CPU 코어 숫자에 맞게 자동으로 조정

2. 웹 서버와 NginX

2.1. 웹 서비스의 발전

  • 초기 웹 서비스는 대부분 정보 전달이 목적인 문서 위주의 정적 페이지였음
    • 그렇기 때문에 HTML과 같은 마크업 언어로 작성된 문서를 서버에서 보내주기만 하면 됐었음
  • 이후 조금 발전된 형태로 스크립트 언어를 얹은 동적 페이지 등장
    • 이때까지만 하더라도 서버에서 데이터를 처리하고 클라이언트로 전송해주는데 큰 부담이 되지 않았음
  • SPA(Single Page Application)라는 개념이 등장하면서 서버가 분리될 필요성이 생김
    • SPA
      • 기존 웹 페이지와는 달리 페이지 갱신에 필욯나 데이터만을 전달받아 페이지를 갱신
      • 이때 필요한 데이터는 사용자마다 달라졌고, 복잡한 연산이 필요하기도 하였음
  • 웹 페이지에 필요한 정적 데이터와 페이지 갱신에 필요한 동적 데이터를 하나의 서버에서 처리할 경우
    • 부하가 커지게 되고 처리가 지연됨에 따라 수행 속도가 느려지질 것
    • Web Server와 WAS(Web Application Server) 같은 개념이 생겨나게 됨

2.2. 웹 서버(Web Server)

  • 클라이언트의 요청을 처리하는 기능을 담당
  • 클라이언트가 HTML, CSS와 같은 정적 데이터를 요청하면 앞단에서 빠르게 제공하고, 동적 데이터가 필요하면 WAS에 요청을 보냄

⇒ NginX는 바로 이 Web Server의 구축을 도와주는 소프트웨어

2.3. WAS(Web Application Server)

  • DB 조회나 다양한 로직을 처리하는 기능을 담당
  • Web Server의 요청을 통해 WAS가 처리한 데이터를 클라이언트에 전달

2.4. 엔진 엑스 (NginX)

  • Web Server의 구축을 도와주는 소프트웨어
    • 웹 서버 소프트웨어라고도 함
      • Nginx
        • 비동기 이벤트 기반으로 하는 방식으로 처리
        • 요청이 들어오면 어떤 동작을 해야하는지만 알려주고 다음 요청을 처리하는 방식으로 진행
        • 흐름이 끊기지 않고 응답이 빠름
        • 공식 홈페이지에 가볍고 빠른 성능을 추구한다고 강조되어 있음
      • Apache가 있음 (둘의 차이는 클라이언트의 요청을 처리하는 동작 방식의 차이)
        • 스레드/프로세스 기반으로 하는 방식으로 요청을 처리
        • 요청 하나당 스레드 하나가 처리하는 구조
        • 사용자가 많아지면 CPU와 메모리 사요잉 증가해서 성능이 저하될 수 있음
  • 웹 어플리케이션을 안정적으로 제공할 수 있도록 도와주는 역할을 수행

2.5. Nginx의 기능

2.5.1. 리버스 프록시 (Reverse Proxy)

  • 중계 기능을 하는 서버
  • 클라이언트가 서버를 호출할 때 직접 서버에 접근하는 것이 아닌 리버스 프록시 서버를 호출
    • 리버스 프록시 서버가 서버에게 요청을 하고 응답을 받아 클라이언트에 전달
  • 클라이언트는 리버스 프록시 서버를 호출하기 때문에 실제 서버의 IP를 감출 수 있고, 이를 통해 보안을 높일 수 있음

2.5.2. 로드 밸런싱

  • 부하 분산, 서버에 가해지는 부하를 분산해 주는 역할
  • 이용자가 많아서 발생하는 요청이 많을 때, 하나의 서버에서 이를 모두 처리하는 것이 아닌 여러 대를 이용하여 요청을 처리하게 됨
    • 이 때 서버의 로드율과 부하량 등을 고려하여 적절하게 서버들에게 분산 처리하는 것
  • 하나의 서버가 멈추더라도 서비스 중단 없이 다른 서버가 서비스를 계속 유지할 수 있는 무중단 배포가 가능

3. Nginx 배포 방법

3.1. Nginx - React

Nginx로 React를 배포하는 방법

3.2. Nginx 동영상

https://www.youtube.com/watch?v=6FAwAXXj5N0


Reference

웹 서버와 NginX