
Nginx란?#
Nginx(엔진엑스)는 경량 고성능 웹 서버 소프트웨어입니다. 웹 서버로 동작할 뿐만 아니라 리버스 프록시, 로드 밸런서, HTTP 캐시로도 사용됩니다.
Nginx는 높은 동시 접속 처리를 위해 설계되었으며, 현재 전 세계 수많은 대규모 웹사이트에서 사용되고 있습니다.
왜 Nginx가 필요했을까?#
과거에는 Apache 웹서버가 업계 표준이었습니다. 하지만 2000년대 초반, 인터넷 사용자가 폭발적으로 증가하면서 C10k 문제라는 병목 현상이 발생했습니다.
C10k 문제#
C10k 문제는 “Connection 10,000"의 약자로, 하나의 서버에서 동시에 10,000개의 클라이언트 연결을 처리하는 것을 의미합니다.
중요한 개념 구분
- 동시 처리 (Concurrent): 많은 연결을 동시에 유지하고 관리
- 처리 속도 (Throughput): 초당 처리할 수 있는 요청의 개수
동시 접속 처리는 빠른 속도보다는 효율적인 자원 관리와 스케줄링이 핵심입니다.

Apache의 구조적 한계#
기존 Apache는 다음과 같은 구조적 문제를 가지고 있었습니다:
1. 프로세스 기반 처리#
- 요청이 들어올 때마다 새로운 프로세스 또는 스레드를 생성
- 사용자가 많아질수록 프로세스 수가 비례 증가
- 결과적으로 메모리 부족 발생
2. 높은 리소스 소비#
- Apache의 강력한 확장성 덕분에 다양한 모듈 추가 가능
- 하지만 각 프로세스가 모든 모듈을 메모리에 로드
- 프로세스당 메모리 사용량 증가
3. Context-Switching 오버헤드#
- CPU 코어가 여러 프로세스를 번갈아 실행
- 프로세스 전환 시 Context-Switching 비용 발생
- 요청이 많을수록 CPU 오버헤드 증가
이러한 문제로 인해 Apache는 대규모 동시 접속 환경에 부적합했습니다.
Nginx의 탄생#

2002년, 러시아의 개발자 **이고르 시쇼브(Igor Sysoev)**가 이 문제를 해결하기 위해 Nginx 개발을 시작했고, 2004년 첫 릴리즈를 공개했습니다.
Nginx의 핵심 목표#
- 높은 동시 접속 처리
- 낮은 메모리 사용량
- 높은 성능과 안정성
Nginx의 주요 역할#
- HTTP Server: 정적 파일(HTML, CSS, JS, 이미지)을 빠르게 제공
- Reverse Proxy Server: 백엔드 애플리케이션 서버 앞단에서 요청 중계
- Load Balancer: 여러 서버로 트래픽 분산
- Mail Proxy Server: 메일 서버 프록시 기능
Nginx의 내부 구조#

Nginx는 1개의 Master Process와 여러 개의 Worker Process로 구성됩니다.
Master Process의 역할#
Master Process는 다음 작업을 담당합니다:
- 설정 파일 읽기 및 유효성 검증
- Worker Process 생성 및 관리
- 설정 변경 시 Worker Process 재시작
# Master Process 확인
ps aux | grep nginx
Worker Process의 역할#
Worker Process가 실제 클라이언트 요청을 처리합니다:
1. 커넥션 관리#
- Master Process로부터 listen socket 할당받음
- 클라이언트와 커넥션 형성
- Keep-Alive 시간 동안 커넥션 유지
- 하나의 Worker가 수천 개의 커넥션 동시 처리
2. Non-blocking I/O#
- 커넥션에 요청이 없으면 다른 작업 처리
- 요청이 들어오면 즉시 응답
- 비동기 Event-Driven 방식으로 효율적 처리
3. Thread Pool#
- 시간이 오래 걸리는 작업(파일 I/O, DB 쿼리)은 Thread Pool에 위임
- Worker Process는 다른 요청 계속 처리
- Blocking 작업의 영향 최소화
4. CPU 코어 최적화#
- Worker Process는 CPU 코어 개수만큼 생성 권장
- 각 Worker를 특정 CPU 코어에 고정 (CPU Affinity)
- Context-Switching 최소화로 성능 향상
# nginx.conf 설정 예시
worker_processes auto; # CPU 코어 수만큼 자동 생성
worker_cpu_affinity auto; # CPU 친화성 자동 설정
Event-Driven 아키텍처#
Nginx는 멀티프로세스 + 싱글스레드 + Event-Driven 방식으로 동작합니다:
- 여러 커넥션을 Event Handler가 관리
- 비동기 Non-blocking 방식으로 처리
- 먼저 준비된 이벤트부터 순차 처리
- 대기 중인 프로세스 없이 자원 효율성 극대화
이는 Apache처럼 요청을 기다리며 방치되는 프로세스가 없어 메모리와 CPU를 효율적으로 사용합니다.
Nginx의 장단점#
장점#
1. 높은 동시 접속 처리 능력#
- Apache 대비 동시 커넥션 수 10배 이상 증가
- 동일 커넥션에서 처리 속도 2배 향상
2. 낮은 리소스 사용#
- 적은 수의 프로세스로 동작
- 메모리 사용량 최소화
- 경량 구조로 빠른 응답 속도
3. 무중단 설정 리로드#
nginx -s reload # 서비스 중단 없이 설정 적용
- Master Process가 새 설정 읽기
- 기존 Worker는 현재 요청 완료 후 종료
- 새 Worker가 새 설정으로 요청 처리
- 서비스 중단 없이 설정 변경 가능
4. 우수한 정적 파일 처리#
- 이미지, CSS, JS 등 정적 콘텐츠를 빠르게 제공
- Apache보다 정적 파일 처리 성능 우수
단점#
1. 동적 모듈 개발의 어려움#
- 모듈 추가 시 Worker Process 재시작 필요
- Apache처럼 손쉬운 모듈 개발 어려움
- 대신 Lua 스크립팅으로 어느 정도 보완 가능
2. Windows 환경 제한#
- Linux/Unix 환경에 최적화
- Windows에서는 성능과 안정성 저하
- 프로덕션 환경에서는 Linux 사용 권장
3. .htaccess 미지원#
- Apache의
.htaccess파일 사용 불가 - 모든 설정을 중앙 설정 파일에서 관리
- 호스팅 환경에서 유연성 떨어질 수 있음
Nginx의 주요 기능#

1. 리버스 프록시 (Reverse Proxy)#
리버스 프록시는 클라이언트와 백엔드 서버 사이에서 중계자 역할을 합니다.

주요 이점#
- 보안 강화: 실제 서버 IP 숨김
- 캐싱: 자주 요청되는 응답 캐싱
- 압축: 응답 데이터 압축으로 대역폭 절약
- SSL 처리: HTTPS 암호화/복호화 담당
# 리버스 프록시 설정 예시
location / {
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
실무 활용 패턴#
- Nginx + Apache: Nginx가 정적 파일 처리, Apache가 동적 처리
- Nginx + Node.js/Python/Java: Nginx가 프론트엔드, 백엔드 애플리케이션 보호
- Nginx + Nginx: 여러 Nginx 서버를 계층적으로 구성
2. 로드 밸런싱 (Load Balancing)#
여러 백엔드 서버로 트래픽을 분산하여 부하를 균등하게 배분합니다.

로드 밸런싱 알고리즘#
Round Robin (기본값)#
- 순차적으로 요청을 각 서버에 분배
- 가장 간단하고 공평한 방식
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
Least Connections#
- 현재 연결 수가 가장 적은 서버로 전송
- 처리 시간이 다른 요청에 적합
upstream backend {
least_conn;
server backend1.example.com;
server backend2.example.com;
}
IP Hash#
- 클라이언트 IP 해시값으로 서버 결정
- 세션 유지(Session Persistence)에 유용
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
}
Weight (가중치)#
- 서버 성능에 따라 가중치 부여
- 고성능 서버에 더 많은 요청 전달
upstream backend {
server backend1.example.com weight=3;
server backend2.example.com weight=2;
server backend3.example.com weight=1;
}
Health Check (헬스 체크)#
upstream backend {
server backend1.example.com max_fails=3 fail_timeout=30s;
server backend2.example.com max_fails=3 fail_timeout=30s;
}
max_fails: 실패 허용 횟수fail_timeout: 서버를 다운으로 간주할 시간- 장애 서버 자동 제외로 가용성 향상
3. SSL/TLS 터미네이션#
Nginx가 클라이언트와 HTTPS 통신, 백엔드와 HTTP 통신을 담당합니다.

주요 이점#
- 백엔드 서버의 SSL 처리 부담 제거
- 중앙화된 인증서 관리
- 백엔드는 비즈니스 로직에 집중
- Nginx와 백엔드는 같은 내부 네트워크에서 HTTP 통신 (보안상 안전)
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://backend;
}
}
HTTP/2 지원#
Nginx는 HTTP/2를 지원하여:
- 멀티플렉싱: 하나의 커넥션으로 여러 요청 동시 처리
- 헤더 압축: 대역폭 절약
- Server Push: 클라이언트 요청 전 리소스 전송
4. 캐싱 (Caching)#
서버 응답을 메모리나 디스크에 저장하여 반복 요청 시 빠르게 응답합니다.
# 캐시 경로 설정
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g;
server {
location / {
proxy_cache my_cache;
proxy_cache_valid 200 60m; # 200 응답은 60분 캐싱
proxy_cache_valid 404 10m; # 404 응답은 10분 캐싱
proxy_pass http://backend;
}
}
캐싱 전략#
- 프록시 캐싱: 백엔드 응답 캐싱
- FastCGI 캐싱: PHP-FPM 등 동적 콘텐츠 캐싱
- 정적 파일 캐싱: 브라우저 캐시 헤더 설정
# 정적 파일 캐시 헤더 설정
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
5. 압축 (Gzip)#
응답 데이터를 압축하여 네트워크 대역폭 절약
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css text/xml text/javascript
application/x-javascript application/xml+rss
application/json application/javascript;
- 텍스트 기반 콘텐츠 60-80% 압축
- 전송 시간 단축으로 사용자 경험 개선
6. Rate Limiting (속도 제한)#
DDoS 공격 방어 및 서버 보호
# Zone 정의
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
server {
location /api/ {
limit_req zone=mylimit burst=20 nodelay;
proxy_pass http://backend;
}
}
- IP당 초당 요청 수 제한
- burst: 순간적인 트래픽 증가 허용
- API 서버 보호에 필수적
Nginx vs Apache: 어떤 것을 선택할까?#
Nginx를 선택해야 하는 경우#
- 높은 동시 접속 처리가 필요한 경우
- 정적 파일 서비스가 주요 목적인 경우
- 리버스 프록시/로드 밸런서가 필요한 경우
- 리소스 효율성이 중요한 경우
- 최신 프로토콜(HTTP/2, HTTP/3) 지원 필요
Apache를 선택해야 하는 경우#
.htaccess파일 기반 설정이 필요한 경우- 다양한 써드파티 모듈이 필요한 경우
- Windows 환경에서 사용해야 하는 경우
- 레거시 애플리케이션 호환성이 중요한 경우
- 동적 모듈 개발이 빈번한 경우
최적의 조합: Nginx + Apache#
많은 기업이 Nginx를 프론트엔드, Apache를 백엔드로 사용합니다:
[클라이언트] → [Nginx] → [Apache] → [애플리케이션]
정적 파일 동적 처리
SSL 처리 PHP/Python
캐싱 모듈 활용
실무 팁#
1. Worker Connections 설정#
events {
worker_connections 1024; # Worker당 처리 가능한 커넥션 수
use epoll; # Linux에서 최적의 이벤트 모델
}
2. Keepalive 최적화#
http {
keepalive_timeout 65;
keepalive_requests 100;
}
3. 버퍼 크기 조정#
http {
client_body_buffer_size 16K;
client_header_buffer_size 1k;
client_max_body_size 8m;
large_client_header_buffers 4 8k;
}
4. 로그 최적화#
http {
access_log /var/log/nginx/access.log combined buffer=32k;
error_log /var/log/nginx/error.log warn;
}
5. 보안 강화#
# 버전 정보 숨기기
server_tokens off;
# 보안 헤더 추가
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
마무리#
Nginx는 현대 웹 인프라의 핵심 구성 요소로 자리잡았습니다. Event-Driven 아키텍처를 통한 높은 성능과 효율성으로 Netflix, Airbnb, GitHub 등 대규모 서비스에서 사용되고 있습니다.
Apache의 안정성과 확장성도 여전히 가치가 있지만, 대규모 트래픽 처리와 리소스 효율성이 중요한 현대 웹 환경에서는 Nginx가 더 적합한 선택입니다.
추천 학습 경로
- 로컬 환경에서 Nginx 설치 및 기본 설정 실습
- 리버스 프록시 구성해보기
- 로드 밸런싱 설정 및 테스트
- SSL 인증서 적용 (Let’s Encrypt)
- 성능 모니터링 및 최적화
참고 자료#
다만 주의할 점: Nginx는 Windows 환경에서 제한적인 성능과 호환성을 보이므로, 프로덕션 환경에서는 반드시 Linux/Unix 시스템을 사용하는 것을 권장합니다!

