📍nginx 개요
역할
- HTTP 웹 서버
- 리버스 프록시
- 콘텐츠 캐시
- 로드 밸런서
- TCP/UDP 및 메일 프록시 서버
📍역할 1. HTTP 웹 서버
- 정적 파일(HTML, 이미지, JS 번들)을 직접 서빙. Node.js 없이도 빠름
- 예시
# 서버 블록
# nginx 가상 호스트 또는 서버 인스턴스를 정의
server {
listen 80; # 포트: HTTP 표준 포트인 80번 포트로 들어오는 연결을 수신 대기하도록 지정
server_name example.com; # 도메인: 요청의 Host 헤더를 확인하여
# http://example.com 경로로 들어오는 요청을 처리하도록 지정
root /var/www/html; # 정적 파일 경로: example.com/page.html 요청이 있으면,
# nginx가 /var/www/html/page.html 파일을 찾음
index index.html; # 디렉토리 경로로만 요청이 들어왔을 때 기본으로 제공할 파일 이름
}
📍역할 2. 리버스 프록시
- 클라이언트 앞에서 받아 백엔드(예 - Node.js 서버 3000번 포트)로 전달
- TLS Termination, 압축, 헤더 보강, 라우팅을 프록시 층에서 담당
- 예시
upstream example_app { server 127.0.0.1:3000; } # nginx가 요청을 전달할 백엔드 서버 그룹 정의
# 여기에 정의된 이름 example_app 은 server 블록에서 사용됨
# 127.0.0.1:3000 은 요청을 전달할 실제 백엔드 서버 주소와 포트
server {
listen 443 ssl http2; # 443번 포트(HTTPS 표준 포트)로 연결 수신 대기하고 SSL/TLS 암호화, HTTP/2 사용
server_name api.example.com; # 요청 받을 도메인
ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem; # SSL 인증서 파일
ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem; # 개인 키파일
location / { # 모든 요청 경로(/)에 대해 블록 내 규칙 적용
proxy_set_header Host $host; # 원래 요청의 호스트 이름(api.example.com) 백엔드에 전달
proxy_set_header X-Real-IP $remote_addr; # IP 주소
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 프록시 거친 클라이언트 IP
proxy_set_header X-Forwarded-Proto $scheme; # 프로토콜(https)
proxy_pass http://example_app; # 이 위치로 들어온 요청을 example_app upstream 그룹으로 전달
# 리버스 프록시 핵심 동작
}
}
전체 동작
- 사용자가 https://api.example.com 으로 요청 보냄
- nginx는 443 포트로 요청을 받아 SSL/TLS를 이용해 암호화 해제
- 요청의 헤더 정보(클라이언트 IP, 호스트, 프로토콜 등)를 수정/추가
- 내부적으로 암호화되지 않은 HTTP 요청으로 변환하여 127.0.0.1:3000 서버 애플리케이션(예 - Node.js 서버)으로 전달
- Node.js 서버는 HTTP로만 구동
