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를 사용하는 것은 성능, 보안, 그리고 확장성 측면에서 많은 이점을 제공한다. 그러나 단순히 내부 호출만 처리하는 작은 프로젝트라면 꼭 필요하지는 않다.