본문 바로가기
Infra | DevOps

nginx

by Jiyoung Oh 2025. 4. 4.

nginx란?

nginx는 가볍고 빠른 웹 서버이자 리버스 프록시 서버입니다.
처음에는 정적 파일을 빠르게 서빙하는 용도로 개발되었지만, 지금은 리버스 프록시, 로드 밸런서, API 게이트웨이 등 다양한 역할로 쓰이고 있습니다. 특히, 높은 동시접속 처리 성능 때문에 고성능 백엔드 서버 앞단에 자주 배치됩니다.

 

nginx 등장 배경 - Apache의 성능 한계

2000년대 초, 웹은 점점 복잡해지고 트래픽이 폭발적으로 늘어나기 시작했습니다.
당시 널리 쓰이던 웹 서버인 Apache HTTP Server프로세스 기반 구조였기 때문에 아래와 같은 문제점이 있었습니다.

  • 동시 접속자 수가 많아질수록 메모리와 CPU 사용량이 폭증
  • 각 요청마다 프로세스/쓰레드가 새로 생성 → 스레드 오버헤드
  • 정적 파일 처리 성능이 낮음

C10K 문제

한 대의 서버에서 10,000개의 동시 접속(Client) 을 처리하는 것이 어렵다는 문제입니다.

기존 Apache는 구조적으로 C10K 문제를 해결하기 어려웠습니다.

당시 러시아의 대형 포털사이트 Rambler에서 일하던 개발자 Igor Sysoev는 이 문제를 비동기 방식으로 풀고자 했습니다.

 

Igor Sysoev는 위와 같은 문제점들을 해결하고자 nginx를 개발하게 됩니다.

 

nginx의 주요 특징

특징 설명
이벤트 기반 아키텍처 하나의 워커 프로세스가 수천 개의 요청을 논블로킹 방식으로 처리
비동기 / 논블로킹 I/O I/O 작업에서 대기하지 않고 이벤트 루프로 처리
낮은 리소스 사용량 수천 개의 요청을 처리해도 CPU 및 메모리 효율적
모듈화된 구성 기능이 작고 단순한 블록 단위로 구성되어 설정과 유지보수가 쉬움
정적 파일 처리 성능 최상 HTML, JS, 이미지 등 빠르게 서빙 가능
리버스 프록시 및 로드밸런싱 내장 기본 기능으로 제공 (Apache는 모듈 추가 필요)
Hot Reload 지원 설정 변경 시 서버 재시작 없이도 반영 가능 (서비스 중단 없음)

 

nginx vs Apache

nginx는 성능과 가벼움을 중심으로 설계되었고, Apache는 다양한 설정과 모듈 중심입니다.

  nginx Apache
아키텍처 비동기 이벤트 기반 멀티 프로세스/쓰레드 기반
요청당 프로세스 수천 요청 = 1 워커 가능 1 요청 = 1 쓰레드
정적 파일 처리 매우 빠름 상대적으로 느림
메모리 효율 좋음 상대적으로 높음
리버스 프록시 기본 내장 모듈 필요
설정 유연성 낮음 높음

 


nginx의 주요 기능

nginx의 주요 기능은 아래와 같이 있습니다. 실제 서버 운영에서 가장 많이 쓰이는 기능은 리버스 프록시 + HTTPS 설정입니다.

기능 설명 주요 목적
정적 파일 서빙 HTML, JS 등 빠른 전달 백엔드 부하 감소
리버스 프록시 요청을 백엔드로 전달 보안, 라우팅 통합
로드 밸런싱 요청 분산 성능 향상, 확장성
HTTPS 지원 암호화 통신 보안 확보
캐싱 응답 저장 속도 개선
요청 제한 초당 요청 수 제한 공격 방어
Gzip 압축 응답 크기 감소 네트워크 효율
URL 리다이렉션 주소 변경 SEO, 유지보수
접근 제어 IP 필터링 관리자 보호 등

 

1. 정적 파일 서버 기능 (Static File Serving)

정적 파일: 서버 측 로직 없이 클라이언트에 그대로 전달되는 파일 (예시: HTML, CSS, JavaScript, 이미지, 폰트 등)

 

정적 파일을 빠르게 클라이언트에게 전달하는 기능입니다. 백엔드 서버(Spring, Node 등)에서 정적 리소스를 처리하면 리소스를 낭비하게 됩니다.

nginx는 비동기 이벤트 기반으로 요청을 매우 빠르게 처리합니다. 정적 파일은 CPU나 메모리 연산 없이 디스크에서 읽어 그대로 보내기만 하면 되기 때문에, nginx의 처리 성능이 극대화되는 작업입니다. 따라서 nginx는 정적 리소스를 대신 처리함으로써 백엔드 서버 부하를 줄이고, 파일 전달 속도를 대폭 향상시킵니다.

설정 예시 코드

server {
    listen 80;
    server_name example.com;

    location / {
        root /var/www/html;
        index index.html;
    }
}

 

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

프록시 참고 게시글

출처: https://www.cloudflare.com/ko-kr/learning/cdn/glossary/reverse-proxy/

 

프록시 (proxy)중간에 위치한 서버로, 클라이언트와 서버 사이에서 요청을 전달하거나 가로채는 역할을 합니다.

리버스 프록시 (Reverse Proxy) 는 사용자의 요청을 받아 백엔드 서버로 전달하고, 응답도 대신 받아서 사용자에게 반환하는 구조입니다. 따라서 클라이언트 입장에서는 백엔드가 숨겨져 있고, 오직 nginx (리버스 프록시)만 보입니다.

nginx는 이러한 리버스 프록시 서버로 활용됩니다.

클라이언트는 nginx에 요청 → nginx가 백엔드 서버에 요청 전달 → 백엔드 응답을 nginx가 받아서 클라이언트에게 전달

리버스 프록시의 장점

  • 백엔드 서버를 직접 노출하지 않음 → 보안 향상
  • SSL 인증, 캐싱, 요청 제한 등을 nginx에서 통합 처리
  • 여러 서비스를 한 도메인에 통합 (예: /api, /admin 등)
  • 로드 밸런싱 추가 가능

설정 예시 코드

server {
    listen 80;

    location /api {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

 

3. 로드 밸런싱 (Load Balancing)

출처: https://www.smileshark.kr/post/what-is-a-load-balancer-a-comprehensive-guide-to-aws-load-balancer

 

nginx를 로드 밸런서로 사용하여 여러 백엔드 서버에 요청을 자동으로 분산시킬 수 있습니다.

로드 밸런서는 클라이언트의 요청을 여러 서버에 분산시켜 주는 역할을 합니다. 하나의 진입점이 있고, 내부적으로 다수의 서버가 그 요청을 처리합니다.

로드 밸런서가 필요한 이유

  • 단일 서버가 처리할 수 있는 요청 수에는 한계가 있음
  • 서비스 확장(Scale-out)을 위해 여러 서버를 두고 부하를 분산시켜야 함
  • 장애 발생 시, 다른 서버로 자동 우회 가능 → 고가용성(HA) 확보

지원 방식 (알고리즘)

  • Round-robin: 순차적으로 분산 (기본)
  • Least Connection: 연결 수가 가장 적은 서버 선택
  • IP Hash: 클라이언트 IP 기반으로 고정 분배

설정 예시 코드

upstream backend_servers {
    server 127.0.0.1:3000;
    server 127.0.0.1:3001;
}

server {
    location / {
        proxy_pass http://backend_servers;
    }
}

 

4. HTTPS(SSL/TLS) 지원

HTTPS란 HTTP에 보안을 추가한 프로토콜로, TLS(구 SSL)를 통해 암호화된 통신을 제공합니다. 중간자가 요청/응답 내용을 훔쳐보거나 변조하는 것을 막아줍니다. 따라서 데이터를 암호화하여 클라이언트와 서버 간 통신을 보호합니다.

Nginx에서 HTTPS

  • SSL 인증서를 등록하고 HTTPS 트래픽을 수신
  • 백엔드 서버는 HTTP로 운영하더라도 nginx에서 HTTPS 처리 가능
  • Let's Encrypt + Certbot 등을 통해 자동화 가능

 

nginx는 SSL 인증서를 쉽게 연동할 수 있고, Certbot 등으로 자동화도 가능합니다.

HTTPS를 적용하면 보안 인증서가 필요합니다. Let's Encrypt + Certbot을 이용하면 무료로 인증서를 발급받을 수 있습니다.

설정 예시 코드

server {
    listen 443 ssl;
    server_name mydomain.com;

    ssl_certificate     /etc/letsencrypt/live/mydomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;

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

 

5. 캐싱 (Caching)

캐싱(Caching) 자주 요청되는 데이터나 파일을 디스크 또는 메모리에 저장해두고, 다음 요청 시 빠르게 응답하는 기법입니다. 따라서 데이터가 자주 바뀌는 경우, 캐시 갱신 전략을 잘 설계해야 합니다. (시간 기반, 헤더 기반 등)

nginx는 자주 요청되는 리소스를 메모리나 디스크에 캐싱해 성능을 향상시킬 수 있습니다.

캐싱 장점 

  • 정적 파일뿐 아니라 API 응답도 캐싱 가능
  • 동일한 요청이 반복될 경우 백엔드 호출 없이 처리 가능
  • 서버 부하 감소 + 응답 속도 향상

설정 예시 코드

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m;
server {
    location /api {
        proxy_cache my_cache;
        proxy_pass http://localhost:8080;
    }
}

 

요청 제한(Rate Limiting) & Gzip 압축 설정: 서버 응답 속도와 트래픽 효율을 동시에 개선

 

6. 요청 제한 (Rate Limiting)

지나치게 많은 요청을 보내는 사용자(IP)를 제한하여 DDoS 및 봇 공격 방어에 효과적입니다. DDoS 공격, 크롤러 남용, API 오용 등을 막기 위해 필수적이며, 공공 API나 무료 서비스에선 보안적으로 특히 중요합니다.

nginx의 요청 제한 방식

  • 클라이언트 IP별 요청 수를 메모리로 추적
  • 초당 허용 요청 수 + 버스트 허용량 설정
  • 초과 시 429 Too Many Requests 응답 반환

설정 예시 코드

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;

server {
    location / {
        limit_req zone=mylimit burst=5;
    }
}

 

7. Gzip 압축

Gzip이란 웹에서 가장 많이 쓰이는 텍스트 기반 압축 포맷입니다. 특히 텍스트 기반 파일(CSS, JS, JSON 등)은 최대 80% 이상 압축이 가능합니다.

nginx의 Gzip 방식

  • 응답 데이터를 실시간으로 압축
  • 클라이언트 브라우저가 Gzip 지원 시, 자동으로 압축된 응답을 전달

효과

  • 전송되는 데이터 크기 감소 → 페이지 로딩 속도 향상
  • 특히 모바일 환경에서 성능 체감이 큼

설정 예시 코드

gzip on;
gzip_types text/plain application/json application/javascript text/css;
gzip_min_length 1000;

 

8. URL 리다이렉션 / 리라이트

nginx는 URL 리다이렉션 / 리라이트 를 지원합니다.

 

리다이렉션(Redirection) 이란 클라이언트가 요청한 URL을 다른 URL로 이동시키는 기능입니다. 301(영구), 302(임시) 상태 코드로 동작합니다.

리라이트(Rewrite) 란 내부적으로 URL을 다른 경로로 변경하지만, 클라이언트는 그걸 모르게하는 것 입니다. URL 정리, 경로 통합 등에 사용합니다.

URL 리다이렉션 / 리라이트 사용 예시

  • HTTP 요청 경로를 다른 경로로 변경하거나 도메인 변경 시 사용
  • www.domain.com → domain.com 통합
  • /old-path → /new-path 자동 전환
  • SEO 최적화, 경로 리팩토링 시 필수 기능

설정 예시 코드

server {
    listen 80;
    server_name oldsite.com;
    return 301 https://newsite.com$request_uri;
}

 

9. 접근 제어 (IP 허용/차단)

nginx는 특정 IP에 대해 요청을 차단하거나 허용할 수 있습니다.

접근을 제어하는 경우

  • 관리자 페이지 /admin 같은 민감한 경로는 특정 IP만 접근 허용
  • 보안 위협이 감지된 IP 차단 (ex. 해외 IP 대량 접속 등)
  • 방화벽 수준의 1차 필터링 역할

설정 예시 코드

location /admin {
    allow 192.168.0.1;
    deny all;
}

nginx 설정

🔸nignx.conf

server {
    listen 80;
    server_name myproject.com;
    
    location /api {
        proxy_pass http://localhost:8080;
    }

    location / {
        proxy_pass http://localhost:3000;
    }
}
  • listen: 포트 번호
  • server_name: 도메인 지정
  • location: URI 경로에 따라 처리 방식 지정
  • proxy_pass: 실제 백엔드 서버로 요청 전달

[참고 자료]