uWSGI NGINX 활용 Flask 서버 배포 가이드
이 포스트는 uWSGI, NGINX 를 활용해서 Python으로 빌드한 Flask 서버를 배포하는 방법에 관해 다룹니다. uWSGI와 같은 WSGI 서버는 멀티 스레드와 멀티프로세싱을 지원하여 Django, Flask와 같은 Python 애플리케이션의 요청 처리 효율을 향상하며, 프로덕션 환경에서의 구성은 필수적입니다.
NGINX는 uWSGI모듈(ngx_http_uwsgi_module)을 사용해서 uWSGI 서버로 요청을 전송할 수 있습니다. 이 모듈은 NGINX OSS, NGINX Plus 모두 사용 가능하며 별도의 매개변수를 통한 설치 없이도 기본적으로 사용할 수 있습니다.
목차
1. uWSGI란?
2. Flask, uWSGI 구성
3. NGINX uWSGI 구성
4. 결론
1. uWSGI란?
uWSGI는 Python으로 작성된 애플리케이션을 위한 WSGI(Web Server Gateway Interface) 서버입니다. 이는 Django나 Flask 같은 Python 웹 애플리케이션과 NGINX 같은 웹 서버 간의 연결을 관리합니다. uWSGI는 웹 서버가 받은 HTTP 요청을 WSGI 프로토콜로 변환하여 Python 애플리케이션에 전달하고, 응답을 다시 HTTP로 변환하여 웹 서버에 반환합니다.
또한 uWSGI는 멀티 스레드와 멀티프로세싱을 지원하여 Python 애플리케이션의 요청 처리 효율을 향상합니다.
2. Flask, uWSGI 구성
1. Flask와 uWSGI 구성을 위해 설치를 진행합니다.
$ sudo apt install python3-pip
$ sudo pip3 install uwsgi flask
2. Flask 애플리케이션을 구성합니다.
간단한 텍스트 응답을 반환하는 간단한 애플리케이션입니다.
myapp.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "Simple Flask app running...."
if __name__ == "__main__":
app.run(host="0.0.0.0")
테스트 실행/접속을 확인합니다.
$ python3 myapp.py
* Serving Flask app 'myapp'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:5000
* Running on http://192.168.201.44:5000
Press CTRL+C to quit

접속 시 설정한 텍스트가 나타나는 것을 확인할 수 있습니다.
3. uWSGI 설정 파일을 구성합니다.
uwsgi.ini
[uwsgi]
strict = true ; 설정 파일의 유효한 uWSGI 옵션만 허용 / 오타 문제 방지
vacuum = true ; 프로세스 종료 시 생성한 임시 파일과 소켓을 자동으로 정리
single-interpreter = true ; 단일 인터프리터 사용
need-app = true ; app 로드 실패 시 uWSGI가 실행되지 않도록 설정
module = myapp:app ; myapp.py 파일의 app 객체 실행
# 실행 사용자/그룹 설정
uid = py
gid = py
# uWSGI 서버 설정
socket = :8000
chmod-socket = 664
# 프로세스 관리
master = true ; master 프로세스 활성화
processes = 4
enable-threads = true ; 스레드 활성화
threads = 2
# worker 재시작
max-requests = 1000 ; 설정 횟수만큼 요청 수신 시 worker 재시작
max-worker-lifetime = 3600 ; 설정 시간(초) 이후 worker 재시작
reload-on-rss = 2048 ; 메모리 사용량이 지정된 mb를 초과할 경우 재시작
worker-reload-mercy = 60 ; 재시작 시 최대로 기다리는 시간 설정(초)
harakiri = 60 ; 요청 처리 시간이 지정 시간 초과 시 worker 종료
# 로그 설정
logto = /var/log/uwsgi/app.log ; 로그를 파일에 기록
log-date = true ; 로그에 날짜 추가
사용할 수 있는 전체 옵션은 uWSGI 옵션 문서에서 확인하실 수 있습니다.
4. 명령어를 통해 uWSGI 서버를 실행합니다.
$ uwsgi --ini uwsgi.ini
[uWSGI] getting INI configuration from uwsgi.ini

웹에서 직접 요청 시 uWSGI 프로토콜로 동작하는 인스턴스에 HTTP 프로토콜로 요청을 전송하여 위와 같이 정상적으로 접속되지 않습니다. NGINX를 통해서 연결하도록 구성이 필요합니다.
3. NGINX uWSGI 구성
2번 과정에서 구성한 uWSGI 서버로 요청을 프록시하기 위해 다음과 같은 설정을 적용했습니다.
uwsgi.conf
server {
listen 8888;
access_log /var/log/nginx/uwsgi_access.log main;
error_log /var/log/nginx/uwsgi_error.log;
# uWSGI 관련 timeout 설정
uwsgi_connect_timeout 60s;
uwsgi_read_timeout 60s;
uwsgi_send_timeout 60s;
location / {
include uwsgi_params;
uwsgi_pass uwsgi://192.168.201.44:8000;
}
}
- include uwsgi_params : uWSGI 연결 관련 환경 변수 설정을 위해 추가합니다.
- uwsgi_pass : 요청을 프록시할 uwsgi 서버를 설정합니다.
NGINX와 uWSGI, Flask 서버를 동일한 서버에서 구성하고, UNIX-도메인 소켓을 사용하여 통신할 경우 아래와 같이 UNIX 소켓의 경로를 구성합니다.
uwsgi_pass unix:/tmp/uwsgi.socket;
NGINX에서 사용할 수 있는 uWSGI 관련 전체 지시문은 ngx_http_uwsgi_module 문서를 참고하세요.
명령어를 사용해 추가한 설정을 적용하고, 직접 접속해 확인해 봅니다.
$ sudo nginx -s reload

성공적으로 NGINX를 통해 Flask 서버로 연결되는 것을 확인할 수 있습니다.
4. 결론
이번 포스트에서는 uWSGI, NGINX 를 활용해서 Python으로 빌드한 Flask 서버를 배포하는 방법을 알아봤습니다. 간단한 Flask 애플리케이션과 uWSGI 서버를 구성하고 uWSGI 구성 관련 옵션들에 대해서 알아보았으며, NGINX 설정을 통해 uWSGI 서버로 요청을 프록시 하도록 구성하는 방법을 알아봤습니다.
이와 같은 구성을 통해 간단하고, 프로덕션 환경에 맞는 방식으로 Flask 서버를 배포할 수 있으며, NGINX를 활용하여 연결되기 때문에, NGINX가 지원하는 SSL/TLS 설정, 캐싱 설정 등 다양한 옵션도 사용할 수 있습니다.
uWSGI 캐싱 설정 중 캐시 퍼지 기능을 지원하는 NGINX Plus를 체험해 보고 싶으시다면 NGINX STORE를 통해 문의해 무료로 NGINX Plus trial을 체험해 보세요.
댓글을 달려면 로그인해야 합니다.