새소식

🍪 Study/웹

Nginx - Flask 프록시 방법 (Feat. Gunicorn)

  • -
728x90

FlaskNginx, Gunicorn을 함께 사용하는 이유는 주로 성능, 안정성, 보안 등의 측면에서 애플리케이션을 더 효율적으로 운영하기 위해서이다. 각각의 역할을 이해하면, 왜 이 조합이 자주 사용되는지 명확해진다.

 

Flask

  • Python으로 작성된 마이크로 웹 프레임워크
  • 역할: 애플리케이션의 비즈니스 로직과 API 엔드포인트 처리.
  • 제한 사항
    • Flask의 내장 개발 서버는 단일 스레드로 동작하며, 고부하 상황에서 성능이 제한적.
    • 다중 클라이언트 요청을 효율적으로 처리하지 못함.
    • 프로덕션 환경에서의 고성능 처리를 위해 설계되지는 않음.

 

Gunicorn

  • WSGI(Web Server Gateway Interface) 서버
  • 역할
    • Flask와 같은 WSGI 애플리케이션을 효율적으로 운영하기 위해 사용.
    • 다중 워커를 사용하여 Flask 애플리케이션의 성능을 크게 향상시킴.
  • 장점
    • 병렬 처리: 여러 워커 프로세스를 통해 동시에 여러 요청 처리 가능.
    • 신뢰성: 잘못된 요청이나 비정상적인 상태에서 서버를 보호하고, 필요한 경우 워커를 재시작 가능.
    • 확장성: 서버의 CPU 코어에 맞게 워커 수를 조정하여 성능 최적화 가능.
  • 제한 사항
    • 정적 파일 처리와 같은 기능에 대해 최적화X.
    • 로드 밸런싱이나 SSL 처리와 같은 고급 기능을 제공X.

 

Nginx

  • 고성능 리버스 프록시 서버 및 웹 서버
  • 역할
    • HTTP 서버, 리버스 프록시, 로드 밸런서, 정적 파일 서빙, SSL 종료 등의 기능 수행.
    • 클라이언트 요청을 Gunicorn으로 전달하고, Gunicorn으로부터의 응답을 클라이언트에 반환.
  • 장점:
    • 리버스 프록시
      • 외부 요청 수신 및 Gunicorn에 전달.
      • Gunicorn 서버가 외부에 직접 노출되지 않으므로 보안 강화.
    • 정적 파일 서빙
      • 정적 파일(예: 이미지, CSS, JS 파일 등)의 매우 효율적인 처리.
      • 이를 직접 서빙함으로써 Gunicorn의 부하를 줄인다.
    • 로드 밸런싱
      • 여러 Gunicorn 인스턴스 간 트래픽을 분배하여, 고부하 상황에서 애플리케이션의 가용성을 높임.
    • SSL 종료
      • HTTPS를 지원하기 위해 SSL/TLS 인증서를 관리하고, 암호화된 요청을 처리하는 역할을 수행.
      • 이를 통해 Gunicorn은 복잡한 SSL 처리를 신경 쓸 필요가 없어짐.

 

사용 예

1. Nginx

: proxy_pass에 Gunicorn-flask server가 실행되는 주소를 넣어준다.

http {
    server {
        listen 80;
        listen [::]:80;

        charset utf-8;

        server_name domain.com;  # or public ip address

        # Frontend Proxy
        location / {
            ...
        }

        # Flask Proxy
        location /api/ {
            proxy_pass http://localhost:5000;  # 5000: Flask server port
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
            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;
        }

        # ... Additional Settings
    }
}

 

2. Gunicorn - Flask

: 터미널에서 gunicorn 커맨드로 실행한다.

gunicorn -w 4 -b 0.0.0.0:5000 run:app
# gunicorn -w [Number of workers] -b [Host:Flask server port] run:[Flask app name]

 

 

요약

Flask, Gunicorn, Nginx를 함께 사용하는 이유는 각 컴포넌트가 서로의 약점을 보완하면서 애플리케이션의 성능, 안정성, 보안을 극대화하기 위해서이다. 이 조합은 다음과 같은 이점을 제공한다:

  • Flask: 비즈니스 로직과 API 엔드포인트 처리.
  • Gunicorn: Flask 애플리케이션을 여러 워커 프로세스에서 효율적으로 실행하여 성능을 향상.
  • Nginx: 클라이언트 요청 처리 및 정적 파일 서빙, 로드 밸런싱, SSL 종료 등 다양한 고급 기능 제공.

이를 통해 애플리케이션이 더 많은 트래픽을 안정적으로 처리할 수 있고, 보안 및 성능 최적화가 가능해진다.

또한, 만약 서버 내에서의 API 호출만 수행된다고 하더라도, Nginx를 사용하는 것은 성능, 보안, 그리고 확장성 측면에서 많은 이점을 제공한다. 그러나 단순히 내부 호출만 처리하는 작은 프로젝트라면 꼭 필요하지는 않다.

728x90
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.