Nginx 소개

Jayson·2024년 12월 23일
post-thumbnail

Nginx에 대해 궁금하거나 Nginx를 처음 도입하려는 분들을 위해 이 글을 작성했습니다. 본격적으로 Nginx를 알아보기 전에, 무중단 배포라는 개념을 간단히 짚고 넘어가겠습니다.

배포 과정에서의 어려움

서버와 클라이언트 개발자는 다음과 같은 배포 과정을 반복합니다:

  1. 새로운 기능이 추가될 때마다 코드 작성
  2. 커밋
  3. 푸시
  4. PR(Pull Request)
  5. Merge
  6. EC2에서 Pull
  7. 서버 중단
  8. 빌드
  9. 실행

이 과정을 반복하는 도중, 클라이언트로부터 새로운 요청이 들어오거나 시스템 결함이 발견되면 혼란이 가중됩니다. 이러한 어려움을 개선하기 위해 무중단 배포가 도입됩니다.

무중단 배포란?

무중단 배포를 사용하면 배포 과정이 간소화됩니다:

  1. 기능 수정 코드 작성
  2. 커밋
  3. PR
  4. Merge
  5. 자동 배포

무중단 배포 방법 중 하나로 블루-그린 배포를 들 수 있습니다. 이 방식은 두 가지 환경(블루와 그린)을 번갈아 사용하여 배포 중에도 서비스를 중단 없이 제공할 수 있습니다.

우리가 Nginx를 사용하는 이유

Nginx는 여러 역할을 수행합니다. 그중에서도 포트 변경 및 요청 분배 역할이 유용합니다.

Nginx는 Apache의 Prefork 방식 문제를 해결하기 위해 등장했습니다. Prefork 방식에서는 클라이언트 요청마다 프로세스를 할당하지만, 인터넷 사용이 폭증하면서 이러한 방식은 한계를 드러냈습니다.

Nginx는 이를 해결하기 위해 Event-Driven 방식을 도입했습니다. 클라이언트의 요청을 이벤트로 처리하여 메모리 낭비를 최소화합니다. Event-Driven 방식에 대해 더 자세히 알고 싶다면 검색을 추천합니다.


Nginx의 핵심 기능

Nginx 공식 홈페이지에서는 다음과 같은 문장을 볼 수 있습니다:

"Advanced Load Balancer, Web Server, & Reverse Proxy"

  1. Load Balancer
    • Nginx 설정을 통해 특정 포트와 서버를 매칭하여 외부 요청을 적절히 분배합니다.
    • 이를 통해 서버의 부하를 효과적으로 분산시킬 수 있습니다.
  2. Web Server
    • 정적 데이터를 처리하여 웹 서비스 응답 속도를 향상시킵니다.
    • 예시: 이미지, HTML, CSS, JS 파일
  3. Reverse Proxy
    • 클라이언트 요청과 서버 처리의 중계자 역할을 합니다.
    • 왜 필요한가요?
      • 보안: 서버가 외부에 직접 노출되지 않도록 보호합니다.
      • 부하 분산: 요청을 조건에 따라 분산 처리합니다.
      • 캐싱: 정적 콘텐츠를 미리 저장하여 빠른 응답 속도를 제공합니다.

이러한 장점 덕분에 많은 개발자와 운영자가 Nginx를 선택하고 있습니다. 현재 참여 중인 프로젝트에 Nginx를 적용해보는 것도 좋은 방법입니다. Nginx의 필요성을 느꼈다면 이제 본격적으로 Nginx에 대해 알아봅시다.


Nginx란 무엇인가요?

Nginx(엔진엑스)는 가장 널리 사용되는 웹 서버 중 하나로, 성능과 효율성을 중시하는 환경에서 주로 사용됩니다.

그렇다면 웹 서버란 무엇일까요?

웹 서버의 정의

웹 서버는 하드웨어와 소프트웨어를 포함하는 개념입니다.

  1. 하드웨어: 웹 서버에 필요한 소프트웨어와 데이터를 저장하는 물리적인 컴퓨터를 말합니다.
  2. 소프트웨어: 사용자가 요청한 데이터를 처리하고 전달하는 프로그램입니다. 주로 HTTP 프로토콜을 통해 데이터를 주고받습니다.

WAS도 정적 파일을 전송할 수 있는데, 왜 굳이 웹 서버가 필요할까요?

웹 서버는 더 효율적인 서버 운영을 가능하게 합니다!

웹 서버가 필요한 이유

  • 정적 파일 처리: Nginx는 HTML, CSS, JS 같은 정적 파일을 WAS 대신 빠르게 처리하여 부담을 줄여줍니다.
  • 접근 제어: 클라이언트 요청이 WAS에 도달하기 전에 보안을 강화하거나 요청을 제한할 수 있습니다.
  • 고성능 제공: Nginx는 이벤트 기반 Non-Blocking 처리 방식으로 높은 성능을 제공합니다.

Nginx의 동작 구조

Nginx의 내부는 아래 그림과 같이 구성됩니다.

주요 구성 요소

1. Master Process

역할 및 기능

  • 설정 파일 로드 및 검증
    • Nginx가 시작되면 설정 파일(nginx.conf)을 읽고 문법 오류를 검사합니다.
    • 설정 파일이 올바른 경우에만 Worker Process를 생성합니다.
  • Worker Process 관리
    • Worker Process를 시작, 중지, 재시작 등의 작업을 수행합니다.
    • 설정 변경 시 Worker Process를 점진적으로 교체하여 다운타임 없이 설정을 반영합니다.
  • 시그널 처리
    • 종료 요청(SIGQUIT, SIGTERM)이나 설정 재로드(SIGHUP) 같은 신호를 처리합니다.
    • 신호를 Worker Process로 전달하여 상태를 조율합니다.

동작 흐름

  1. 설정 파일 로드:
    • nginx.conf 파일을 읽고 유효성을 검사합니다.
  2. Worker Process 생성:
    • 설정 파일이 유효하다면, 지정된 개수만큼 Worker Process를 시작합니다.
  3. 시그널 전달 및 처리:
    • 운영 중 Master Process는 시스템 신호를 수신하고, 이를 Worker Process로 전달하여 상태를 변경하거나 종료를 관리합니다.

2. Worker Process

역할 및 기능

  • 클라이언트 요청 처리
    • HTTP, HTTPS, TCP/UDP 요청을 수신하고 응답합니다.
    • 요청 처리 중 비동기 이벤트 기반 구조로 높은 처리량과 효율성을 제공합니다.
  • 멀티플렉싱 및 이벤트 기반 아키텍처
    • 단일 Worker Process는 수천 개의 연결을 동시에 처리할 수 있습니다.
    • epoll, kqueue 등의 이벤트 통지 메커니즘을 활용합니다.

동작 흐름

  1. 클라이언트 요청 수신:
    • 포트(예: 80, 443)에서 들어오는 요청을 비동기적으로 수신합니다.
  2. 요청 처리:
    • 정적 콘텐츠 제공 (HTML, 이미지 등)
    • 프록시 역할 수행 (백엔드 서버와 클라이언트 간 데이터 전달)
    • 요청에 따라 캐시된 데이터 반환
  3. 응답 반환:
    • 요청 결과를 클라이언트에 반환하며, Keep-Alive 설정이 활성화된 경우 연결을 유지합니다.

3. Cache Manager & Cache Loader (옵션)

역할 및 기능

  • Cache Loader:
    • Nginx 시작 시 디스크에 저장된 캐시 파일을 메모리에 로드합니다.
    • 캐시된 데이터를 효율적으로 활용할 수 있도록 준비합니다.
  • Cache Manager:
    • 캐시 공간을 모니터링하며, 캐시가 설정된 크기를 초과하지 않도록 관리합니다.
    • 오래된 캐시 파일을 제거하거나 새 캐시 데이터를 생성합니다.

동작 흐름

  1. 캐시 로드 (Cache Loader):
    • Nginx 시작 시, 디스크에 저장된 캐시 파일을 확인하고 메모리로 로드합니다.
    • 로드된 데이터를 통해 초기 요청 시 빠른 응답을 보장합니다.
  2. 캐시 관리 (Cache Manager):
    • 캐시 사용량을 모니터링하여 설정된 최대 크기를 초과할 경우, 오래된 캐시 파일을 제거합니다.
    • 필요한 경우 새로 생성된 콘텐츠를 캐싱하여 저장합니다.

Nginx의 주요 프로세스 간 협업

  1. Master Process와 Worker Process:

    • Master Process는 Worker Process를 생성하고 관리합니다.
    • Worker Process는 클라이언트 요청을 처리하며, 설정 변경 시 Master Process의 지시에 따라 재시작됩니다.
  2. Cache Manager/Loader와 Worker Process:

    • Worker Process는 요청 처리 중 캐시된 데이터가 필요한 경우 Cache Loader/Manager와 협력하여 데이터를 제공합니다.
    • Cache Manager는 Worker Process에서 생성된 새로운 데이터를 저장하고 오래된 데이터를 정리합니다.

Nginx의 주요 기능

Nginx는 아래와 같은 기능을 제공합니다:

  1. 정적 콘텐츠 제공: 정적 파일 처리에서 강력한 성능.
  2. 리버스 프록시: 클라이언트 요청을 중간에서 처리하여 보안 및 부하 분산.
  3. 로드 밸런싱: 여러 서버에 트래픽을 분산.
  4. SSL 지원: HTTPS를 통한 보안 통신.
  5. 캐싱: 자주 요청되는 데이터를 저장하여 응답 속도 향상.
  6. 가상 호스팅: 한 서버에서 여러 도메인 처리.
  7. 웹소켓 지원: 실시간 통신.

실습: Nginx 설치와 기본 설정

Nginx 설치 (Ubuntu 기준)

  1. 패키지 업데이트

    sudo apt update
    
  2. Nginx 설치

    sudo apt install nginx
    

Nginx 실행 확인

설치가 완료되었으면 아래 명령어로 실행 상태를 확인하세요.

systemctl status nginx

출력 예시:

● nginx.service - A high performance web server and a reverse proxy server
     Active: active (running)

기본 화면 확인

브라우저에서 서버의 IP 주소로 접속하면 아래와 같은 화면을 볼 수 있습니다.


Nginx 설정 파일 구조

Nginx 설정 파일은 /etc/nginx/nginx.conf에 있습니다. 주요 블록은 다음과 같습니다:

  1. events: 네트워크 연결 설정.
  2. http: HTTP 서버 설정.
  3. server: 가상 호스트 설정. 도메인별로 설정을 분리할 수 있습니다.
  4. location: 특정 URL에 대한 설정.

리버스 프록시 설정하기

리버스 프록시는 클라이언트 요청을 중간에서 검증 후 서버로 전달합니다. 아래는 간단한 리버스 프록시 설정 예제입니다.

server {
    listen 80;
    server_name yourdomain.com;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

주요 지점 설명

  1. listen:

    • 서버가 요청을 수신할 포트를 지정합니다. 기본적으로 HTTP는 80번 포트를 사용합니다.
  2. server_name:

    • 클라이언트가 요청하는 도메인 이름을 설정합니다.
    • 예: www.example.com, api.example.com
  3. proxy_pass:

    • 클라이언트 요청을 전달할 백엔드 서버 주소를 지정합니다.
    • 위 예제에서는 http://localhost:8080으로 전달됩니다.
  4. proxy_set_header:

    • 백엔드 서버로 요청을 전달할 때 추가적인 헤더를 설정합니다.
      • Host: 클라이언트가 요청한 원래 호스트 정보를 전달합니다.
      • X-Real-IP: 클라이언트의 실제 IP 주소를 전달합니다.
      • X-Forwarded-For: 클라이언트와 모든 프록시 서버의 IP 목록을 전달합니다.

동작 흐름

  1. 클라이언트 요청 수신:

    • 브라우저에서 yourdomain.com으로 요청을 보냅니다.
  2. 도메인 및 포트 매칭:

    • server_namelisten 설정에 따라 요청을 처리할 서버 블록이 선택됩니다.
  3. 요청 전달:

    • proxy_pass 설정에 따라 요청이 백엔드 서버(http://localhost:8080)로 전달됩니다.
  4. 응답 반환:

    • 백엔드 서버에서 처리된 응답을 클라이언트에게 반환합니다.

로드 밸런싱 설정

Nginx는 여러 서버로 트래픽을 분산하는 로드 밸런싱 기능을 제공합니다.

upstream loadbalance {
    least_conn; # 연결이 가장 적은 서버로 요청 전달
    server localhost:8080;
    server localhost:8081;
    server localhost:8082;
}

server {
    listen 80;

    location / {
        proxy_pass http://loadbalance;
    }
}

주요 지점 설명

  1. upstream 블록:

    • Nginx에서 로드 밸런싱을 설정하기 위해 사용하는 블록입니다.
    • 서버 그룹을 정의하며, 요청이 전달될 서버들을 나열합니다.
  2. least_conn:

    • 연결이 가장 적은 서버로 요청을 전달합니다.
    • 트래픽을 효율적으로 분산하기 위한 전략 중 하나입니다.
    • 다른 전략으로는 round_robin(기본값), ip_hash 등이 있습니다.
  3. server:

    • localhost:8080, localhost:8081, localhost:8082로 요청을 분산합니다.
    • 각 서버 주소는 IP 또는 도메인 이름으로 지정할 수 있습니다.
  4. proxy_pass:

    • 요청을 정의된 upstream 블록(http://loadbalance)으로 전달합니다.

동작 흐름

  1. 클라이언트 요청 수신:

    • 브라우저에서 Nginx 서버로 요청을 보냅니다.
  2. upstream 블록 처리:

    • Nginx는 설정된 upstream 그룹에서 적절한 서버를 선택합니다.
    • 예제에서는 연결이 가장 적은 서버를 선택합니다.
  3. 요청 전달:

    • 선택된 서버로 요청을 전달합니다.
  4. 응답 반환:

    • 선택된 서버에서 처리된 응답을 클라이언트에게 반환합니다.

알고리즘 종류

Nginx는 다양한 로드 밸런싱 알고리즘을 지원하며, 각각의 알고리즘은 특정한 분산 전략을 제공합니다.

  1. round-robin:

    • 설명:
      • 기본적으로 모든 요청을 서버에 순차적으로 분산합니다.
      • 각 서버가 동일한 요청 수를 처리하도록 보장합니다.
    • 특징:
      • 서버 간 균등 분산이 가능합니다.
      • 서버의 부하 상태를 고려하지 않으므로 각 서버의 처리 능력이 다를 경우 비효율적일 수 있습니다.
    • 사용 사례:
      • 모든 서버가 유사한 성능과 자원을 제공할 때 적합합니다.
  2. least_conn:

    • 설명:
      • 현재 활성 연결 수가 가장 적은 서버를 선택합니다.
      • 부하가 적은 서버로 트래픽을 분산하여 효율성을 극대화합니다.
    • 특징:
      • 각 서버의 실시간 부하 상태를 고려합니다.
      • 연결이 길게 유지되는 요청(예: 파일 다운로드, 스트리밍)에 특히 유용합니다.
    • 사용 사례:
      • 요청 처리 시간이 길거나 연결 지속 시간이 긴 트래픽에 적합합니다.
  3. ip_hash:

    • 설명:
      • 클라이언트의 IP 주소를 해시하여 특정 서버에 요청을 분산합니다.
      • 동일한 클라이언트는 항상 같은 서버로 연결됩니다.
    • 특징:
      • 클라이언트-서버 간 세션 일관성을 유지할 수 있습니다.
      • 특정 서버에 트래픽이 몰릴 수 있는 단점이 있습니다.
    • 사용 사례:
      • 세션 기반 애플리케이션(예: 로그인 상태 유지)이 필요할 때 적합합니다.

알고리즘 비교

알고리즘특징사용 사례
round-robin서버 간 균등 분산모든 서버가 유사한 성능일 때
least_conn현재 연결 수가 적은 서버 선택요청 지속 시간이 긴 트래픽 처리 시
ip_hash클라이언트 IP를 기반으로 동일 서버에 연결세션 일관성이 필요한 애플리케이션

HTTPS 설정

SSL 인증서를 적용하여 HTTPS를 활성화하려면 다음과 같이 설정합니다.

server {
    listen 443 ssl;
    server_name yourdomain.com;

    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;

    location / {
        proxy_pass http://localhost:8080;
    }
}

마무리

이 글에서는 Nginx의 기본 동작 방식, 주요 기능, 실습을 통해 사용법을 살펴보았습니다.

Nginx는 가볍고 강력하며, 다양한 확장 기능을 제공하여 웹 애플리케이션의 성능을 극대화할 수 있는 도구입니다.

profile
Small Big Cycle

0개의 댓글