Provisioning, Nginx Architecture

Jeonghak Cho·2025년 3월 1일

Provisioning

목록 보기
3/44

Nginx 프로비저닝

개요

NGINX는 가볍고 빠른 웹 서버이자 리버스 프록시, 로드 밸런서, API 게이트웨이 역할을 수행하는 오픈소스 소프트웨어이다. 높은 동시 연결 처리 성능과 비동기 이벤트 기반 아키텍처를 통해 트래픽이 많은 환경에서도 안정적인 서비스를 제공한다.

주요 특징:

✔ 고성능 웹 서버
정적 콘텐츠 처리 속도가 빠름

✔ 리버스 프록시
백엔드 서버 보호 및 부하 분산

✔ 로드 밸런서
여러 서버로 트래픽을 분산하여 안정성 향상

✔ 보안 기능
SSL/TLS 종단, DDoS 방어 지원

✔ 마이크로서비스 지원
API 게이트웨이 및 컨테이너 환경과 잘 연동

클라우드, 마이크로서비스, 대규모 트래픽을 다루는 웹 서비스에서 필수적인 기술로 자리 잡고 있다.

리버스 프록시와 API Gateway 비교

웹 서버 최적화가 목적이라면 리버스 프록시 를 사용하고, API 관리와 보안이 필요하다면 API 게이트웨이를 사용한다.
| 기능 | 리버스 프록시 | API 게이트웨이 |
|----------------|--------------------------|----------------------------------|
| 주된 목적 | 요청 전달, 부하 분산, 보안 강화 | API 관리, 인증/인가, 로깅 |
| 주요 사용 사례 | 고성능 웹 서버, 트래픽 분산 | 마이크로서비스 관리, 인증 처리 |
| 사용 시점 | 단순 요청 전달 및 보안 기능이 필요할 때 | API 중심 서비스에서 복잡한 로직이 필요할 때 |

Ngnix 기능

리버스 프록시 (Reverse Proxy)

클라이언트 요청을 백엔드 서버(예: Node.js, Spring, Django)로 전달
여러 백엔드 서버를 숨기고 보안 및 성능 최적화

location /api/ {
    proxy_pass http://backend-server:8080;
}

로드 밸런서 (Load Balancer)

여러 개의 백엔드 서버에 트래픽을 분산하여 부하를 줄임
Round Robin, Least Connections 등의 로드 밸런싱 알고리즘 지원

upstream backend_servers {
    server backend1.example.com;
    server backend2.example.com;
}
location / {
    proxy_pass http://backend_servers;
}

SSL/TLS 보안 (HTTPS)

Let’s Encrypt 또는 자체 SSL 인증서를 사용하여 HTTPS 적용 가능

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/key.pem;
}

캐싱 (Caching)

정적 파일 및 API 응답을 캐싱하여 성능을 향상
FastCGI 캐시, Proxy Cache, Microcaching 등을 지원

NGINX 아키텍처

  • 마스터 프로세스가 워커 프로세스를 관리
  • 각 워커 프로세스는 비동기 이벤트 루프를 사용하여 여러 요청을 동시에 처리
                    ┌──────────────────┐
                    │   Master Process  │
                    └────────▲─────────┘
                             │
         ┌───────────────────┴───────────────────┐
         │                                       │
┌────────▼────────┐                     ┌────────▼────────┐
│  Worker Process │                     │  Worker Process │
│  (Event Loop)   │                     │  (Event Loop)   │
└────────▲────────┘                     └────────▲────────┘
         │                                       │
 ┌───────┴─────────┐                     ┌───────┴─────────┐
 │  Connection  1  │                     │  Connection  n  │
 │  (Request)      │                     │  (Request)      │
 └─────────────────┘                     └─────────────────┘

마스터 프로세스 (Master Process)

설정 파일을 읽고 파싱한 후 워커 프로세스를 관리한다. 클라이언트 요청을 직접 처리하지 않는다.
설정 파일(nginx.conf) 로드 및 검증, 워커 프로세스 생성 및 종료 관리를 하며 싱글 프로세스로 실행된다.

워커 프로세스 (Worker Processes)

클라이언트의 요청을 실제로 처리하는 프로세스이다. 이벤트 기반(event-driven) 아키텍처를 사용하여 동시 연결을 효율적으로 처리한다.
개수는 worker_processes 설정으로 조정 가능하다. (auto 설정 시 CPU 코어 수만큼 생성)
HTTP 요청 처리, 리버스 프록시 & 로드 밸런싱 수행, 정적 파일 제공한다.

이벤트 처리 (Event-Driven)

Non-blocking, 비동기 방식으로 요청을 처리한다. epoll (Linux) 또는 kqueue (BSD)를 사용하여 수천 개의 동시 연결을 효율적으로 관리한다. 한 개의 워커 프로세스가 여러 클라이언트 요청을 동시에 처리 가능하다.
이벤트 루프 구조로 새로운 연결이 들어오면 이벤트 루프에 등록한다. 읽기/쓰기 작업이 가능한 경우 비동기적으로 처리하며, 클라이언트 응답 후 연결을 유지할지 종료할지 결정한다. (Keep-Alive 지원)

유의점

루트 위치 확인

Nginx 를 실행한 후 제일 먼저 하는 일은 웹 화면이 정상 기동하는 지 확인하는 일이다. Nginx 루트 위치가 다를 수 있고 html 파일이 기본 제공되지 않아 화면이 나오지 않는 경우도 있다. 예를 들어 NGINX를 설치할 때 사용한 패키지 매니저(예: apt, yum, dnf)와 운영체제에 따라 기본 경로가 다를 수 있다.

Ubuntu/Debian 계열 (APT 사용): 기본적으로 /var/www/html
CentOS/RHEL 계열 (YUM/DNF 사용): /usr/share/nginx/html

설정 파일 내의 지정된 루트 경로를 환인한다. 기본적으로 NGINX 설정 파일은 /etc/nginx/nginx.conf에 위치한다. OS 유형에 따라 루트 위치 설정 파일 위치가 다를 수 있으니 확인이 필요하다.

  • cat /etc/nginx/sites-available/default # Debian 계열
  • cat /etc/nginx/nginx.conf # RedHat 계열

설정 파일의 다음 부분이 루트 위치를 지정하는 부분이다.

server {
    listen   80;
    root /var/www/html/public;
    charset utf-8;
    index index.php index.html index.htm;
}

설정을 바꾸었다면 nginx를 재시작한다.

sudo systemctl restart nginx
  • 기본 루트 디렉토리 예시 (버전 및 배포판별)
배포판설치 방법기본 루트 디렉토리
Ubuntu 20.04+APT/var/www/html
DebianAPT/var/www/html
CentOS 7/8YUM/DNF/usr/share/nginx/html
RHELYUM/DNF/usr/share/nginx/html
Alpine LinuxAPK/var/lib/nginx/html
소스 설치컴파일 옵션지정한 경로 (--prefix) 사용

루트 위치 확인 명령

nginx -T | grep root

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
          root   /usr/share/nginx/html;

0개의 댓글