하나의 서버에서 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에서 한 번만 설정하면 되어 관리가 편리합니다.