Tech & IT/개발환경세팅하기

웹서버 만들기 Nginx, FastAPI 역할과 구조 및 기능 설명

해피콧 2025. 9. 11. 00:58
'); }
'); }

Nginx의 역할과 기능

  1. Reverse Proxy (리버스 프록시)

  [브라우저] → [Nginx:80] → [FastAPI:8000]

  역할:
  - 클라이언트의 요청을 FastAPI 서버로 전달
  - FastAPI 서버의 응답을 클라이언트로 전달
  - 내부 서버(FastAPI)를 외부에 직접 노출하지 않음

  설정 예시:
  upstream fastapi {
      server fastapi:8000;  # Docker 컨테이너 이름
  }

  location / {
      proxy_pass http://fastapi;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
  }

  2. Load Balancer (로드 밸런서)

  여러 FastAPI 인스턴스가 있을 때 요청을 분산:

  upstream fastapi {
      server fastapi1:8000;
      server fastapi2:8000;
      server fastapi3:8000;
  }

  3. Static File Server (정적 파일 서버)

  location /static/ {
      alias /usr/share/nginx/html/static/;
      expires 30d;
      add_header Cache-Control "public, immutable";
  }

  효과:
  - CSS, JS, 이미지 파일을 Nginx가 직접 서빙
  - FastAPI 서버 부하 감소
  - 빠른 정적 파일 전달

  4. Security Headers (보안 헤더)

  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;

  보안 기능:
  - XSS 공격 방어
  - 클릭재킹 방어
  - MIME 타입 스니핑 방지

  5. Rate Limiting (속도 제한)

  # 존 정의
  limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s;
  limit_req_zone $binary_remote_addr zone=auth:10m rate=5r/m;

  # 적용
  location ~ ^/(login|signup|logout) {
      limit_req zone=auth burst=2 nodelay;  # 5회/분 제한
  }

  location / {
      limit_req zone=general burst=20 nodelay;  # 10회/초 제한
  }

  효과:
  - DDoS 공격 방어
  - 무차별 로그인 시도 방지
  - 서버 리소스 보호

  6. Compression (압축)

  gzip on;
  gzip_vary on;
  gzip_min_length 1024;
  gzip_types text/plain text/css text/xml text/javascript application/json;

  효과:
  - 네트워크 대역폭 절약
  - 페이지 로딩 속도 향상
  - 사용자 경험 개선

  7. SSL/TLS Termination (SSL 종료)

  server {
      listen 443 ssl http2;
      ssl_certificate /path/to/certificate.pem;
      ssl_certificate_key /path/to/private.key;

      location / {
          proxy_pass http://fastapi;  # 내부는 HTTP 통신
      }
  }

  역할:
  - HTTPS 암호화/복호화 처리
  - FastAPI는 HTTP만 처리하면 됨
  - SSL 인증서 관리

  8. Caching (캐싱)

  location /static/ {
      expires 30d;  # 30일 캐시
  }

  location /api/ {
      proxy_cache my_cache;
      proxy_cache_valid 200 1h;  # 1시간 캐시
  }

  9. Health Check & Failover

  upstream fastapi {
      server fastapi1:8000 max_fails=3 fail_timeout=30s;
      server fastapi2:8000 backup;  # 백업 서버
  }

  내 프로젝트에서의 Nginx 역할

  현재 설정 분석:

  1. 포트 80에서 요청 받음
  2. 정적 파일 (/static/) 직접 서빙
  3. 인증 엔드포인트 특별 관리 (Rate Limiting)
  4. 모든 요청을 FastAPI:8000으로 프록시
  5. 보안 헤더 자동 추가
  6. Gzip 압축 적용

  장점:

  - 성능: 정적 파일을 Nginx가 직접 처리
  - 보안: Rate Limiting, 보안 헤더
  - 확장성: 여러 FastAPI 인스턴스로 확장 가능
  - 운영: 로그 관리, 모니터링

  FastAPI만 사용했을 때와의 차이:

  FastAPI만:
  [브라우저] → [FastAPI:8000]

  Nginx + FastAPI:
  [브라우저] → [Nginx:80] → [FastAPI:8000]

  Nginx가 웹 서버의 역할을, FastAPI가 애플리케이션 서버의 역할을 각각 담당하여 웹을 통해 보안토큰이 전송될 필요없이 효율적인 구조를 가집니다.