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

2024. 9. 24. 18:57·💻 Study/웹
728x90

Flask와 Nginx, 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
저작자표시 (새창열림)

'💻 Study > 웹' 카테고리의 다른 글

Nginx - Streamlit 프록시 설정 방법  (0) 2024.08.30
[Node.js] MySQL2 모듈 장기간 연결 문제 해결  (0) 2024.07.02
[React] map() vs forEach(): Array.prototype.map() expects a return value from arrow function.  (0) 2024.06.27
[MySQL] java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver | MySQL JDBC Driver Not Found  (0) 2022.07.18
[netlify] Page Not Found Error (React Router)  (1) 2022.01.03
'💻 Study/웹' 카테고리의 다른 글
  • Nginx - Streamlit 프록시 설정 방법
  • [Node.js] MySQL2 모듈 장기간 연결 문제 해결
  • [React] map() vs forEach(): Array.prototype.map() expects a return value from arrow function.
  • [MySQL] java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver | MySQL JDBC Driver Not Found
soyang.
soyang.
코딩 및 개발 일지를 기록합니다.
  • soyang.
    소소한 코딩일지
    soyang.
  • 전체
    오늘
    어제
  • 링크

    • Github 🐾
    • 포트폴리오 📓 (리뉴얼중)
    • LinkedIn 👩🏻‍💼
  • 공지사항

    • 소소한 코딩일지
  • 블로그 메뉴

    • 방명록
    • 분류 전체보기 (181)
      • 🚩 목표 & 회고 (9)
      • 📓 Papers (10)
      • 🧇 Algorithm (44)
        • 이론 (1)
        • LeetCode (2)
        • 프로그래머스 (30)
        • 백준 (11)
      • 💻 Study (47)
        • 🤖 AI 인공지능 (3)
        • Python 파이썬 (3)
        • Docker 도커 (4)
        • 웹 (20)
        • 안드로이드 (2)
        • JAVA 자바 (1)
        • Firebase (3)
        • Linux 리눅스 (10)
      • 🍪 Projects (2)
      • 🎒 학교 (44)
        • 대학원 도비 (2)
        • 21 동계 모각코: 슈붕팥붕 (13)
        • 21 하계 모각코: 와팬호 (13)
        • 20 동계 모각코: 와팬호 (13)
      • 활동들 (16)
        • 인프런 대학생 LEAF 2기 (9)
        • 2021 Silicon Valley Online .. (7)
  • 태그

    Python
    리액트
    알고리즘스터디
    Linux
    programmers
    Gentoo
    인프런대학생Leaf
    Ai
    노마드코더
    알고리즘
    프로그래머스
    React
    공부
    모각코
    Algorithm
    error
    목표
    코딩테스트
    백준
    Artificial Intelligence
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
soyang.
Nginx - Flask 프록시 방법 (Feat. Gunicorn)
상단으로

티스토리툴바