Nginx 심층 분석: 아키텍처, 구성, 실용 예제
Source: Dev.to
번역을 진행하려면 전체 텍스트를 제공해 주시겠어요? 코드 블록, URL 및 마크다운 형식은 그대로 유지하면서 내용만 한국어로 번역해 드리겠습니다.
소개
Nginx (“Engine‑X”)는 웹 서비스, 로드 밸런싱, API 게이트웨이, 리버스 프록시, 정적 리소스 서버 등 다양한 시나리오에서 널리 사용되는 고성능 HTTP 및 리버스 프록시 서버입니다. 높은 성능, 낮은 리소스 소비, 유연한 설정 덕분에 Nginx는 많은 인터넷 기업, 기업, 개발자들이 선호하는 선택이 되었습니다.
이 글에서는 Nginx에 대한 기본 소개로 시작하여 작동 원리를 깊이 탐구하고, 실용적인 예제를 통해 독자들이 Nginx를 설정하고 최적화하는 방법을 보다 잘 이해할 수 있도록 돕겠습니다.
Introduction to Nginx Basics
History and Background of Nginx
Nginx는 원래 러시아 프로그래머 Igor Sysoev에 의해 개발되어 2004년에 공개되었습니다. 처음에는 C10K 문제(동시 10 000 연결 처리)를 해결하기 위해 설계되었으며, 따라서 높은 동시성 상황에서 뛰어난 성능을 보여줍니다. 뛰어난 성능과 확장성 덕분에 Nginx는 전 세계에서 가장 인기 있는 웹 서버 중 하나가 되었으며, 특히 정적 리소스 제공 및 리버스 프록시 역할에 강점을 가지고 있습니다.
Nginx’s Core Functions
- Reverse proxy – 클라이언트 요청을 백엔드 서버로 전달합니다.
- Load balancing – Round Robin, IP Hash, Least Connections와 같은 알고리즘을 지원합니다.
- Static file service – HTML, CSS, JavaScript, 이미지 등을 효율적으로 제공합니다.
- HTTP caching – 응답 콘텐츠를 캐시하여 접근 성능을 향상시킵니다.
- SSL/TLS support – HTTPS 서비스를 제공합니다.
- Reverse proxy + load balancing – 고가용성을 위해 트래픽을 여러 백엔드에 분산합니다.
- WebSocket support – 장기 연결을 처리합니다.
Source: …
Nginx 작동 방식
이벤트‑드리븐 모델
Nginx는 이벤트‑드리븐 아키텍처를 사용합니다. 기존의 다중 스레드 또는 다중 프로세스 모델과 달리, Nginx는 소수의 워커 프로세스가 클라이언트 연결을 비동기적으로 처리하도록 설계되었습니다. 새로운 요청이 들어오면 Nginx는 이를 이벤트 큐에 넣고, 워커 프로세스가 스케줄링합니다. 이러한 설계 덕분에 단일 프로세스가 많은 동시 연결을 처리할 수 있으며, 전통적인 멀티스레딩에서 발생하는 컨텍스트 스위칭 및 메모리 오버헤드 비용을 피할 수 있습니다.
요청 처리 흐름
- 요청 수신 – Nginx는 클라이언트 연결을 수신하고 이를 이벤트 큐에 추가합니다.
- 요청 파싱 – HTTP 요청 헤더(URL, 메서드, 호스트명 등)를 파싱합니다.
- 적절한 서비스 선택 – 설정에 따라 Nginx는 요청을 백엔드 서버로 전달하거나 정적 리소스를 직접 제공합니다.
- 응답 생성 – 백엔드의 응답이나 로컬 파일을 기반으로 응답을 구성하고 클라이언트에 전송합니다.
- 로그 기록 – 분석 및 디버깅을 위해 요청을 로그에 기록합니다.
Nginx 구성 파일 구조
주요 구성 파일은 일반적으로 **/etc/nginx/nginx.conf**에 위치합니다. 기본 계층 구조는 다음과 같습니다:
- Global 블록 – 전역 옵션을 설정합니다(워커 프로세스, 사용자, 로그 경로 등).
http블록 – HTTP와 관련된 설정을 구성합니다(캐싱, 압축, 로드 밸런싱 등).server블록 – 가상 호스트를 정의하고 서로 다른 도메인에 대한 요청을 처리합니다.location블록 – 요청 URI를 매칭하고 각 URI가 어떻게 처리될지 지정합니다.
Source: …
Nginx의 고급 기능
로드 밸런싱
Nginx는 여러 백엔드에 클라이언트 요청을 분산시키는 다양한 로드‑밸런싱 알고리즘을 제공합니다:
- 라운드 로빈 – 기본 방법; 요청을 고르게 분배합니다.
- 최소 연결 – 활성 연결 수가 가장 적은 서버에 트래픽을 보냅니다.
- IP 해시 – 클라이언트 IP 주소의 해시를 기반으로 요청을 라우팅합니다.
예시 구성
http {
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}
캐싱 및 압축
캐싱
정적 파일과 업스트림 응답을 캐싱하면 성능이 크게 향상되고 백엔드 부하가 감소합니다.
http {
proxy_cache_path /tmp/cache keys_zone=my_cache:10m;
server {
listen 80;
location / {
proxy_cache my_cache;
proxy_pass http://backend;
}
}
}
압축
gzip 압축을 활성화하면 네트워크를 통해 전송되는 데이터 양을 줄일 수 있습니다.
http {
gzip on;
gzip_types text/plain application/javascript text/css;
gzip_min_length 1000;
}
SSL/TLS 구성
Nginx는 SSL/TLS를 완벽히 지원하여 보안 HTTPS 사이트를 제공하고 사용자 프라이버시를 보호합니다.
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
# 권장 TLS 설정
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://backend;
}
}
Nginx 실용 사례 연구
1. 정적 파일 서버
server {
listen 80;
server_name www.example.com;
root /var/www/html;
index index.html index.htm;
location /images/ {
root /var/www/assets;
}
}
이 구성에서는 Nginx가 웹사이트 홈 페이지를 /var/www/html에서 제공하고 /images/ 경로 아래의 요청을 /var/www/assets의 리소스로 전달합니다.
2. 역방향 프록시 및 로드 밸런싱
http {
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
3. URL 재작성 및 리디렉션
모든 http 요청을 https로 리디렉션합니다:
server {
listen 80;
server_name www.example.com;
return 301 https://$host$request_uri;
}
4. 성능 최적화 및 모니터링
최적화 팁
- 워커 프로세스 수 조정 – CPU 코어 수에 따라
worker_processes를 설정합니다. - 캐시 사용 – 정적 리소스를 캐시하고 역방향 프록시 캐시를 활성화하여 백엔드 부하를 줄입니다.
- GZIP 압축 활성화 – 응답을 압축하여 대역폭 사용량을 줄이고 페이지 로드 속도를 향상시킵니다.
stub_status를 이용한 모니터링
server {
listen 80;
server_name status.example.com;
location /status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
}
Conclusion
고성능 웹 서버인 Nginx는 이벤트 기반 아키텍처, 역방향 프록시 기능, 로드 밸런싱 및 캐싱 기능 덕분에 현대 웹 서비스의 필수적인 구성 요소입니다. 이 문서는 Nginx의 강력한 기능에 대한 추가 논의와 심층 탐구를 위한 기반을 제공합니다.