하나의 서버에서 Node.js, Python, Java 등 여러 애플리케이션을 운영할 때 Nginx를 리버스 프록시로 사용하면 도메인별 또는 경로별로 트래픽을 분산할 수 있습니다.
리버스 프록시 개념
클라이언트 → Nginx (80/443) → app1.example.com → Node.js (3000)
→ app2.example.com → Python (8000)
→ example.com/api → Java (8080)
도메인별 프록시 설정
# /etc/nginx/sites-available/app1
server {
listen 80;
server_name app1.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name app1.example.com;
ssl_certificate /etc/letsencrypt/live/app1.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/app1.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
핵심 프록시 헤더
location / {
proxy_pass http://127.0.0.1:3000;
# 원본 호스트명 전달
proxy_set_header Host $host;
# 클라이언트 실제 IP 전달
proxy_set_header X-Real-IP $remote_addr;
# 프록시 체인 전달
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# HTTP/HTTPS 여부 전달
proxy_set_header X-Forwarded-Proto $scheme;
# 업스트림 타임아웃 설정
proxy_connect_timeout 30s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# HTTP 버전
proxy_http_version 1.1;
# WebSocket 지원 (필요 시)
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
경로별 프록시 설정
server {
listen 443 ssl;
server_name example.com;
# 프론트엔드 (React, Vue 등 정적 파일)
location / {
root /var/www/html;
try_files $uri $uri/ /index.html;
}
# API 서버
location /api/ {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# WebSocket
location /ws/ {
proxy_pass http://127.0.0.1:3001/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
upstream으로 로드 밸런싱
# /etc/nginx/nginx.conf 또는 별도 파일
upstream app_servers {
# 기본: 라운드 로빈
server 127.0.0.1:3000;
server 127.0.0.1:3001;
server 127.0.0.1:3002;
# 가중치 설정
# server 127.0.0.1:3000 weight=3;
# server 127.0.0.1:3001 weight=1;
# 최소 연결 수 방식
# least_conn;
# 연결 유지 (성능 향상)
keepalive 32;
}
server {
location / {
proxy_pass http://app_servers;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
버퍼링 설정
location /api/ {
proxy_pass http://127.0.0.1:8080;
# 업스트림 응답 버퍼링
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
proxy_busy_buffers_size 8k;
# 대용량 파일 다운로드 시 임시 파일 사용
proxy_max_temp_file_size 1024m;
}
캐싱 설정
# nginx.conf의 http 블록에 추가
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m
max_size=1g inactive=60m use_temp_path=off;
server {
location /api/ {
proxy_pass http://127.0.0.1:8080;
proxy_cache my_cache;
proxy_cache_valid 200 10m;
proxy_cache_valid 404 1m;
# 캐시 상태 헤더 추가 (디버깅)
add_header X-Cache-Status $upstream_cache_status;
}
}
보안 헤더 추가
server {
# 보안 헤더
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'" always;
# 서버 버전 숨기기
server_tokens off;
}
설정 활성화
# 심볼릭 링크로 활성화
sudo ln -s /etc/nginx/sites-available/app1 /etc/nginx/sites-enabled/
# 설정 검사
sudo nginx -t
# 재로드
sudo systemctl reload nginx
트러블슈팅
# 업스트림 연결 오류 로그 확인
sudo tail -f /var/log/nginx/error.log | grep upstream
# 프록시된 헤더 확인 (앱에서 요청 헤더 출력)
curl -H "Host: app1.example.com" http://127.0.0.1:3000/headers
Nginx 리버스 프록시를 활용하면 하나의 서버에서 여러 애플리케이션을 효율적으로 운영할 수 있습니다. SSL 인증서도 Nginx에서 한 번만 설정하면 되어 관리가 편리합니다.