Nginx (엔진엑스)

이도형·2026년 9월 19일

Web 기본개념📶

목록 보기
11/11

Nginx 개요

동시 접속 처리에 특화된 고성능 웹 서버이자 리버스 프록시 (Reverse Proxy) 서버

주요 핵심 기능

1. 정적 파일 웹 서버

HTML, CSS, JavaScript, 이미지 같은 정적 콘텐츠 빠르게 제공

백엔드 (WAS) 까지 요청이 가지 않도록 앞단에서 차단하여 서버 부하를 줄임

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

클라이언트 요청을 받아 내부 백엔드 서버 (Tomcat, Node.js 등)로 전달하는 중개자 역할

백엔드 서버의 IP를 외부에 노출하지 않아 보안성이 높아짐

3. 로드 밸런싱 (Load Balancing)

대규모 트래픽이 올 때 여러 대의 백엔드 서버로 부하를 균등하게 분산

특정 서버가 다운되어도 다른 서버로 요청을 보내 서비스가 중단되지 않게 함.

4. SSL/TLS 암호화 (종단점)

HTTPS 통신을 위한 암호화/복호화 처리를 NGINX가 대신 수행

무거운 암호화 연산을 NGINX가 전담하므로 백엔드 서버 부담이 줄어듬

5. 콘텐츠 캐싱 (Caching)

자주 요청받는 데이터를 메모리나 디스크에 저장해두고 클라이언트에 즉시 반환

백엔드 서버의 반복 연산을 줄이고 응답 속도를 끌어올림

vs. Apache

아키텍처 구조 차이

기존 웹 서버인 Apache (아파치)와 비교헀을 때, 아키텍처(구조)의 차이 존재

  • Apache : 프로세스/스레드 기반 처리 모델
    event MPM 등을 통해 효율적인 방식으로 동작할 수 있기 때문에 "Apache = 요청 하나당 프로세스 하나"

  • Nginx : event-driven architecture 사용
    많은 연결을 적은 수의 Worker가 이벤트 기반으로 처리

Nginx의 장점

  • 빠른 동시 처리 능력 : 프로세스 비동기 처리로 C10K 문제 (동시 접속자 1만 명 이상 처리 문제) 해결
  • 정적 파일 처리 속도 : Nginx는 정적 콘텐츠 (HTML, CSS, JS, 이미지, 비디오 등)를 디스크에서 직접 읽어 속도가 빠름
  • 적은 메모리 및 CPU 자원 사용 : Nginx는 접속자가 늘어나도 메모리 사용량이 일정 수준을 유지하여, 리소스 최소화해야 하는 환경(컨테이너, 마이크로서비스 등)에 적합

Nginx의 단점

  • 복잡한 동적 모듈 확장 방식 : Apache는 모듈을 동적으로 로드 (DSO, Dynamic Shared Object) 하여 사용할 수 있어 서버 재시작 없이 기능을 더하거나 뺄 수 있지만, Nginx는 전체를 다시 컴파일 해야함.
  • 분산 설정 미지원 .htaccess : Apache는 .htaccess 설정 파일을 두어, httpd.conf 파일을 수정하지 않고도 전체 서버 재시작 없이 권한 제어나 URL rewrite 규칙을 개별 설정할 수 있지만, Nginx는 중아 nginx.conf파일에서만 관리되며 반드시 Nginx 프로세스를 Reload 해야함.

.htaccess
이는 웹 사이트 디렉터리 (ex. /var/www/html/.htaccess)에 파일을 만들어 특정 디렉터리에 대한 설정을 적용 가능.
이는 공유 호스팅 (shared hosting)에서 편리하여, 사용자가 서버 전체 설정 권한을 가지고 있지 않아도 일부 설정 변경 가능

  • 동적 콘텐츠 직접 처리 불가 : Apache는 mod_php, mod_python 등 내장 모듈을 통해 서버 내부에서 PHP나 Python 코드를 직접 해석하고 실행할 수 있지만, Nginx는 외부 앱 서버로 요청을 넘겨주는 (FastCGI / Proxy) 방식만 가능.

Nginx 설정 파일 구조 이해

nginx.conf : Nginx 설정 파일

구조

  • Main : 전체 시스템 수준 설정 (Nginx 프로세스의 실행권한, 프로세스 개수, 에러 로그)
  • events : 네트워킹 동작 방식, 동시 접속 처리 관련 설정
  • http : HTTP 웹 트래픽 처리에 관한 전반적인 설정 (캐싱, 로그, 타임아웃 등)
  • server : 하나의 가상 호스트(웹사이트, 도메인) 설정
  • location : 요청된 URL 경로에 따른 개별 처리 규칙
  • upstream : 로드 밸런스 대상이 되는 백엔드 서버 그룹 정의

예시 (코드)

# =========================================================
# 1. Main (Global) Context
# =========================================================
user  nginx;                       # Nginx Worker 프로세스를 실행할 OS 사용자
worker_processes  auto;            # 생성할 Worker 프로세스 수 (auto = CPU 코어 수)
error_log  /var/log/nginx/error.log notice; # 에러 로그 저장 경로 및 출력 레벨
pid        /var/run/nginx.pid;     # Master 프로세스의 PID가 저장될 경로

# =========================================================
# 2. Events Context
# =========================================================
events {
    worker_connections  1024;      # Worker 프로세스 1개당 최대 동시 접속 수
    # (총 최대 동시 접속 수 = worker_processes * worker_connections)
}

# =========================================================
# 3. HTTP Context
# =========================================================
http {
    include       /etc/nginx/mime.types;     # 파일 확장자별 MIME 타입 매핑 정보 불러오기
    default_type  application/octet-stream; # 기본 파일 타입 지정

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main; # 접근 로그 경로

    sendfile        on;            # OS의 sendfile()을 사용해 디스크I/O 감축 (파일 전송 속도 향상)
    keepalive_timeout  65;         # 클라이언트 연결을 유지할 시간(초)
    gzip  on;                      # 응답 데이터 압축 전송 여부

    # =====================================================
    # Upstream Context (로드 밸런싱 대상 그룹 설정)
    # =====================================================
    upstream my_backend {
        server 10.0.0.1:8080;
        server 10.0.0.2:8080;
    }

    # =====================================================
    # Server Context (가상 호스트 1)
    # =====================================================
    server {
        listen       80;             # 바인딩할 포트 번호
        server_name  example.com;    # 요청을 받을 도메인 주소

        # Location Context 1: 정적 파일 처리
        location / {
            root   /usr/share/nginx/html; # 파일이 위치한 실제 서버 디렉토리
            index  index.html index.htm;  # 기본 문서 파일
        }

        # Location Context 2: API 프록시 처리
        location /api/ {
            proxy_pass http://my_backend; # Upstream 그룹으로 요청 전달
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }

        # 에러 페이지 설정
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }

    # 외부 설정 파일(conf.d 디렉토리) 포함하기
    include /etc/nginx/conf.d/*.conf;
}

include 구문

nginx.conf 하나의 파일에 수많은 server 블록 작성 시 파일 관리가 힘들어 지므로,
include문을 넣어 도메인/사이트별 설정 파일 분리

http {
    ...
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

nginx.conf 설정 후 수행할 명령

# 1. 설정 파일 문법 검증 (오류 유무 확인)
sudo nginx -t

# 2. 문법 이상이 없으면 서비스 중단 없이 설정 재로드
sudo nginx -s reload
# 또는
sudo systemctl reload nginx
profile
열심히 살고 싶습니다! 일하고 싶습니다 :)

0개의 댓글