본문 바로가기

Nginx

Nginx란 무엇인가?

Nginx(엔진엑스)는 오픈 소스 웹 서버 소프트웨어이다. 또 다른 오픈 소스 웹 서버인 Apache와 마찬가지로 정적 콘텐츠 제공, 리버스 프록시 역할 등을 수행한다. Nginx는 높은 성능, 낮은 리소스 소비, 높은 동시 연결 처리 능력으로 유명하다.

 

Nginx와 Apache의 주요 차이점

특징 Nginx Apache
아키텍처 비동기 이벤트 기반 멀티스레드/멀티프로세스 기반
동시 연결 처리 능력 높은 동시 연결 처리 성능 연결 수 증가 시 리소스 사용량 증가
정적 콘텐츠 처리 성능 매우 빠름 상대적으로 느림
동적 콘텐츠 처리 백엔드 서버를 통해 처리 모듈을 통해 직접 처리 가능 (예: PHP-FPM)
로드 밸런싱 기본적으로 로드 밸런싱 기능 제공 로드 밸런싱은 별도의 설정 필요
모듈화 정적 모듈 방식 동적 및 정적 모듈 지원 (유연한 확장 가능)
설정 복잡도 상대적으로 간단 유연하지만 복잡한 설정
HTTP/2 및 최신 프로토콜 기본적으로 지원 최신 프로토콜 지원 가능 (별도 설정 필요)
SSL/TLS 처리 간단하고 빠름 OpenSSL 기반으로 유사하게 처리
사용 사례 고성능, 고부하 환경에서 적합 소규모 또는 복잡한 기능 요구 사항에 적합

Nginx의 특징

  1. 비동기 이벤트 기반 아키텍처
    • 이벤트 기반으로 요청을 처리하며, 다수의 요청을 효율적으로 처리
    • 낮은 리소스 소비높은 동시 연결 처리 가능. 높은 동시 요청 처리에도 메모리 사용량이 적어, 저사양 서버에서도 효과적으로 작동.
  2. 정적 파일 처리 성능
    • HTML, CSS, JS, 이미지 등 정적 콘텐츠 제공에서 최고의 성능.
  3. 리버스 프록시와 로드 밸런싱
    • 로드 밸런싱백엔드 서버 프록싱에 최적화.
  4. 확장성
    • 모듈식 설계로 필요한 기능만 추가하거나 구성 가능.
  5. HTTP/2 및 최신 프로토콜 지원
    • HTTP/2, WebSocket, gRPC 같은 최신 웹 기술을 지원.

Apache의 특징

  1. 멀티스레드/멀티프로세스 기반 아키텍처
    • 정적 콘텐츠 등의 요청을 별도의 프로세스 또는 스레드로 처리.
    • 유연하지만, 연결 수가 많아질수록 리소스 사용량이 크게 증가.
  2. 동적 콘텐츠 처리
    • PHP, Python 같은 스크립트 언어를 모듈 형태로 실행 가능.
    • 예: mod_php, mod_python.
  3. 유연한 설정 및 모듈 지원
    • 다수의 동적 모듈 제공(로깅, 인증, 동적 콘텐츠 등).
    • 사용자 정의 설정을 .htaccess 파일로 쉽게 변경 가능.

Nginx가 적합한 경우:

  1. 정적 콘텐츠 중심의 서비스 정적 파일(HTML, CSS, 이미지 등)을 빠르게 제공해야 하는 경우.
  2. 고성능 및 고부하 환경 동시 요청 수가 많은 대규모 웹 애플리케이션.
  3. 리버스 프록시 또는 로드 밸런싱 백엔드 서버 앞단에서 프록시와 부하 분산이 필요한 경우.
  4. 최신 프로토콜 지원 HTTP/2, WebSocket, gRPC 등 최신 기술을 사용하는 서비스.

Apache가 적합한 경우:

  1. 동적 콘텐츠 처리 PHP, Python, Perl 같은 스크립트를 직접 실행해야 하는 경우.
  2. 기존 레거시 시스템 기존 Apache 기반의 설정 또는 시스템이 많은 경우.
  3. 복잡한 설정 필요 .htaccess 파일을 활용하여 사용자별 맞춤 설정을 적용해야 하는 경우.
  4. 소규모 프로젝트 트래픽이 많지 않고 간단한 설정이 필요한 경우.

Nginx의 주요 역할

  1. 웹 서버:
    • HTTP 요청을 처리하고 정적 콘텐츠(HTML, CSS, JS, 이미지 등)를 제공.
    • 동적 요청은 백엔드 서버(예: Gunicorn, uWSGI)로 전달.
  2. 리버스 프록시:
    • 클라이언트 요청을 받아 백엔드 서버로 전달하고, 백엔드의 응답을 클라이언트로 반환.
    • Gunicorn, Node.js, PHP-FPM 등과 함께 사용.
웹 서버와 리버스 프록시 서버의 공통 역할

1. 동적 요청 처리
- 리버스 프록시 서버: 클라이언트의 동적 요청(예: API 호출)을 백엔드 애플리케이션 서버(예: Flask, Django, Node.js)로 전달하고, 해당 서버의 응답을 클라이언트로 반환한다.
- 웹 서버:스스로 동적 요청을 처리하거나, 처리할 수 없는 경우 백엔드 서버로 전달.

2. 정적 파일 제공
둘 다 CSS, JS, 이미지와 같은 정적 파일을 직접 클라이언트에 제공할 수 있다.
Nginx와 같은 리버스 프록시 서버는 웹 서버 역할도 겸할 수 있으므로, 정적 파일 처리를 효율적으로 수행한다.

3. 요청 라우팅
요청 URL을 기반으로 적절한 서버 등으로 라우팅한다.
예를 들면, /api는 백엔드로 전달하고, /static은 로컬에서 제공한다.

4. SSL/TLS 암호화
클라이언트와 서버 간 HTTPS 연결을 처리할 수 있다.
리버스 프록시 서버는 HTTPS를 해독한 뒤 백엔드로 HTTP 요청을 전달할 수도 있다.

 

웹 서버와 리버스 프록시 서버의 차이점

주요 목적 클라이언트 요청을 처리하고 응답 제공 백엔드 서버와 클라이언트 사이의 중계 역할
요청 처리 주체 클라이언트의 요청을 직접 처리하거나 백엔드로 전달 클라이언트 요청을 받아 백엔드 서버로 전달
백엔드 서버와의 관계 백엔드 서버 없이도 단독으로 동작 가능 백엔드 서버가 반드시 필요
정적 파일 제공 주된 역할 (HTML, CSS, JS 제공) 선택적 역할, 보통 백엔드 서버와 통합
로드 밸런싱 보통 지원하지 않음 요청을 여러 백엔드 서버로 분산
SSL/TLS HTTPS 트래픽 처리 가능 클라이언트와 백엔드 서버 간 암호화 해제 및 전달 가능
사용 사례 정적 웹 사이트, 간단한 애플리케이션 서비스 복잡한 애플리케이션 배포 환경에서 백엔드 서버 보호 및 확장

왜 리버스 프록시를 별도로 사용하는가?

웹 서버와 리버스 프록시 서버는 겹치는 기능(예: 동적 요청 전달, 정적 파일 제공 등)을 가지지만, 웹 서버는 주로 요청을 직접 처리하고, 리버스 프록시는 요청을 백엔드로 전달하는 중간 역할에 더 중점을 둔다. 또한 리버스 프록시 서버는 주로 백엔드 서버 보호와 부하 분산, 최적화 같은 고급 기능을 수행하기 위해 대규모 서비스엥서 자주 사용된다.

  1. 보안 강화:
    • 백엔드 서버가 외부에 노출되지 않도록 보호.
    • Nginx 같은 리버스 프록시가 DDoS 방어, SSL 처리, 요청 필터링 수행.
  2. 성능 향상:
    • 정적 콘텐츠를 리버스 프록시에서 처리하여 백엔드 서버 부하 감소.
    • 요청을 캐싱하여 반복적인 동적 요청의 부하를 줄임.
  3. 확장성:
    • 로드 밸런싱을 통해 요청을 여러 백엔드 서버로 분산 가능.
  4. 유연성:
    • URL 라우팅, 프로토콜 변환(예: HTTPS -> HTTP) 등을 손쉽게 처리.

 

Nginx의 주요 구성 요소

  1. Worker Process:
    • 클라이언트 요청을 실제로 처리하는 프로세스.
    • 비동기 이벤트 기반으로 요청을 처리.
  2. Master Process:
    • Nginx의 설정 파일을 읽고 Worker Process를 생성 및 관리.
  3. Modules:
    • Nginx는 다양한 모듈을 통해 기능을 확장.
    • 예: gzip 압축, 캐싱, 리버스 프록싱 등.
  4. Configuration 파일:
    • Nginx의 동작을 정의하는 설정 파일. (nginx.conf).
    • 서버 블록(server block)으로 구성되어, 각 블록은 특정 호스트나 URL 패턴을 처리.

 

'정글' 카테고리의 다른 글

WSGI, Gunicorn  (0) 2024.12.18
OpenSSL와 자체 서명 인증서  (0) 2024.12.18
PINTOS 4주차 Stack Growth  (0) 2024.10.22
PINTOS 3주차 가상 메모리 관리 시스템  (0) 2024.10.15
PINTOS 2주차 Argument Parsing  (0) 2024.10.08