Nginx 심층 탐구: 아키텍처, 구성, 실용 예제
Source: Dev.to
번역할 텍스트가 제공되지 않았습니다. 번역을 원하는 본문을 알려주시면 한국어로 번역해 드리겠습니다.
Source: …
소개
Nginx(“Engine‑X”)는 웹 서비스, 로드 밸런싱, API 게이트웨이, 리버스 프록시 및 정적 리소스 서버와 같은 다양한 시나리오에서 널리 사용되는 고성능 HTTP 및 리버스 프록시 서버입니다. 높은 성능, 낮은 자원 소비, 유연한 설정 덕분에 Nginx는 많은 인터넷 기업, 기업 및 개발자들의 선호 선택이 되었습니다.
이 글에서는 Nginx에 대한 기본 소개부터 시작하여 작동 원리를 깊이 있게 살펴보고, 실용적인 예제를 통해 독자들이 Nginx를 구성하고 최적화하는 방법을 보다 잘 이해할 수 있도록 돕겠습니다.
Nginx 기본 소개
Nginx의 역사와 배경
Nginx는 원래 러시아 프로그래머 Igor Sysoev에 의해 개발되어 2004년에 공개되었습니다. 처음에는 C10K 문제(동시 10 000 연결 처리)를 해결하기 위해 설계되어, 높은 동시성 시나리오에서 뛰어난 성능을 보여주었습니다. 뛰어난 성능과 확장성 덕분에 Nginx는 전 세계에서 가장 인기 있는 웹 서버 중 하나가 되었으며, 특히 정적 리소스 제공 및 리버스 프록시 역할에 강점이 있습니다.
Nginx의 핵심 기능
- 리버스 프록시 – 클라이언트 요청을 백엔드 서버로 전달합니다.
- 로드 밸런싱 – 라운드 로빈, IP 해시, 최소 연결 수와 같은 알고리즘을 지원합니다.
- 정적 파일 서비스 – HTML, CSS, JavaScript, 이미지 등을 효율적으로 제공합니다.
- HTTP 캐싱 – 응답 내용을 캐시하여 접근 성능을 향상시킵니다.
- SSL/TLS 지원 – HTTPS 서비스를 제공합니다.
- 리버스 프록시 + 로드 밸런싱 – 다수의 백엔드에 트래픽을 분산시켜 고가용성을 확보합니다.
- WebSocket 지원 – 장기 연결을 처리합니다.
Nginx 작동 방식
이벤트‑드리븐 모델
Nginx는 이벤트‑드리븐 아키텍처를 사용합니다. 전통적인 멀티스레드 또는 멀티프로세스 모델과 달리, Nginx는 소수의 워커 프로세스가 클라이언트 연결을 비동기적으로 처리합니다. 새로운 요청이 들어오면 Nginx는 이를 이벤트 큐에 넣고, 워커 프로세스가 스케줄링합니다. 이 설계는 단일 프로세스가 많은 동시 연결을 처리하면서 전통적인 멀티스레딩의 컨텍스트 전환 및 메모리 오버헤드 비용을 피하게 합니다.
요청 처리 흐름
- 요청 수신 – Nginx는 클라이언트 연결을 수신하고 이를 이벤트 큐에 추가합니다.
- 요청 파싱 – HTTP 요청 헤더(URL, 메서드, 호스트명 등)를 파싱합니다.
- 적절한 서비스 선택 – 설정에 따라 Nginx는 요청을 백엔드 서버로 전달하거나 정적 리소스를 직접 제공합니다.
- 응답 생성 – 백엔드의 응답이나 로컬 파일을 기반으로 응답을 구성하고 클라이언트에 전송합니다.
- 로그 기록 – 요청은 분석 및 디버깅을 위해 로그에 기록됩니다.
Nginx 구성 파일 구조
주요 구성 파일은 일반적으로 **/etc/nginx/nginx.conf**에 위치합니다. 기본 계층 구조는 다음과 같습니다:
- Global block – 전역 옵션을 설정합니다 (worker 프로세스, 사용자, 로그 경로 등).
httpblock – HTTP 관련 설정을 구성합니다 (캐싱, 압축, 로드 밸런싱 등).serverblock – 가상 호스트를 정의하고 서로 다른 도메인에 대한 요청을 처리합니다.locationblock – 요청 URI를 매칭하고 각 URI가 어떻게 처리될지 지정합니다.
Nginx의 고급 기능
로드 밸런싱
Nginx는 여러 백엔드에 클라이언트 요청을 분산시키기 위한 여러 로드 밸런싱 알고리즘을 제공합니다:
- Round Robin – 기본 방식; 요청을 고르게 분산합니다.
- Least Connections – 가장 적은 활성 연결을 가진 서버로 트래픽을 보냅니다.
- IP Hash – 클라이언트 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;
# Recommended TLS settings
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. 성능 최적화 및 모니터링
최적화 팁
- 워커 프로세스 수 조정 –
worker_processes를 CPU 코어 수에 맞게 설정합니다. - 캐시 사용 – 정적 리소스를 캐시하고 리버스 프록시 캐싱을 활성화하여 백엔드 부하를 감소시킵니다.
- 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;
}
}
5. 결론
Nginx는 이벤트 기반 아키텍처, 리버스 프록시 기능, 로드 밸런싱 및 캐싱 특성 덕분에 고성능 웹 서버로서 현대 웹 서비스에 없어서는 안 될 구성 요소입니다. 이 글은 Nginx의 강력한 기능을 더 깊이 탐구하고 논의하기 위한 기초를 제공합니다.