WSGI(Web Server Gateway Interface)와 관련하여, 웹 애플리케이션 서버의 동작 방식과 역할에 대한 설명을 요약 및 정리해보겠습니다.
WSGI의 등장 배경
- 초기에는 웹 서버만 있었으며, 정적인 파일만 처리 가능했음.
- 동적인 요청에 대한 처리 필요성 증가.
- CGI(Common Gateway Interface) 등장: 파이썬 어플리케이션 서버의 동작 방식 정의.
- CGI는 요청마다 파이썬 스크립트를 처음부터 실행하여 처리하는 방식이어서 성능 이슈 발생.
WSGI의 등장과 WSGI 서버(Gunicorn, uWSGI)
- WSGI(Web Server Gateway Interface) 등장: 웹 서버와 파이썬 어플리케이션 간의 통신 규약.
- WSGI 서버 필요: 클라이언트의 요청을 받아 WSGI application 실행.
- Gunicorn과 uWSGI는 WSGI 서버의 역할 수행.
- Gunicorn: WSGI middleware로 웹 서버의 역할 수행.
- Nginx는 reverse proxy server, load balancer 등을 담당.
WSGI의 동작 과정
- WSGI application은 environ과 start_response 콜백함수를 받음.
- environ: HTTP 요청 정보를 담은 dictionary.
- start_response: HTTP 응답 헤더와 상태 코드를 설정하는 콜백함수.
- WSGI 서버는 클라이언트 요청마다 application을 호출하여 응답 생성.
Framework의 WSGI application
- Django와 Flask는 WSGI application을 내장.
- Django: wsgi.py에서 application 객체를 생성.
- Flask: app 객체를 생성하고 WSGI application으로 사용.
- 프레임워크에서 제공하는 서버는 개발용으로만 사용 권장, 배포용에는 Gunicorn 등을 사용.
정리
- Gunicorn을 사용하여 WSGI middleware로 웹 서버 역할 수행 가능.
- Nginx를 사용하여 reverse proxy나 load balancing 가능.
- Django와 Flask는 프레임워크 내에서 WSGI application 제공.
- Gunicorn, uWSGI를 사용하지 않고 Nginx만 사용하는 것도 가능하지만 제한적.
요약하자면, 웹 애플리케이션을 배포할 때는 보통 Nginx와 Gunicorn (또는 uWSGI)를 조합하여 사용합니다. Nginx는 웹 서버의 역할로 reverse proxy, load balancing 등을 수행하며, Gunicorn은 WSGI application을 실행하는 데 사용되는 WSGI 서버의 역할을 수행합니다. 이를 통해 웹 애플리케이션을 안정적이고 효율적으로 배포할 수 있습니다.
Flask 애플리케이션을 uWSGI를 사용하여 서비스하는 방법에 대한 간단한 예제를 제공하겠습니다.
먼저, Flask 애플리케이션을 작성한 다음, uWSGI를 사용하여 해당 애플리케이션을 서비스하는 과정을 설명하겠습니다.
- Flask 애플리케이션 작성
app.py
파일에 간단한 Flask 애플리케이션을 작성합니다.# app.py from flask import Flask app = Flask(__name__) @app.route('/') def hello(): return 'Hello, Flask and uWSGI!'
- 가상환경 설정 및 Flask 설치
가상환경을 생성하고 Flask를 설치합니다.python -m venv venv source venv/bin/activate # Linux/MacOS # 또는 # .\venv\Scripts\activate # Windows pip install flask
- uWSGI 설치
pip install uwsgi
- uWSGI 설정 파일 작성
uwsgi.ini
파일을 생성하여 uWSGI의 설정을 정의합니다.
여기서# uwsgi.ini [uwsgi] module = app:app master = true processes = 4 socket = 0.0.0.0:5000 protocol = http
module
은 Flask 애플리케이션의 모듈을 가리키며,socket
은 uWSGI가 리스닝할 주소 및 포트를 지정합니다. - uWSGI로 애플리케이션 실행
다음 명령을 사용하여 uWSGI로 Flask 애플리케이션을 실행합니다.
이제uwsgi --ini uwsgi.ini
http://127.0.0.1:5000
에서 Flask 애플리케이션이 실행됩니다.
uWSGI는 애플리케이션을 관리하고 여러 프로세스에서 동시에 처리할 수 있도록 도와줍니다. 이제 이 예제를 참고하여 실제 프로젝트에 적용할 수 있습니다. 필요에 따라 uWSGI 설정을 조정하고 확장하여 복잡한 환경에 맞게 사용할 수 있습니다.
728x90
댓글