Flask를 설치하고 바로 실행하면 개발 서버로 올라가기 때문에 운영 환경에서 사용하기엔 성능 상 무리가 있습니다. Flask를 실행했을 때 표시되는 Warning 메시지에 따르면 WSGI 프로토콜로 서버를 실행하길 권장하고 있으므로, Flask를 WSGI로 실행하는 과정을 기록하려 합니다.
아키텍쳐
WSGI와 uWSGI
WSGI(Web Server Gateway Interface)는 웹 서버와 Python이 통신하기 위한 프로토콜을 의미하며, uWSGI는 이를 활용하여 요청과 응답 값을 Python이나 웹 서버가 이해할 수 있도록 변환해주는 서버를 의미합니다.
NginX 없이 uWSGI 만으로도 서버를 운영할 수 있지만, 기존 웹 서버(NginX, Apache, ...)와 만들어진 목적이 다르므로, 비교적 규모가 큰 애플리케이션에선 부적합하기 때문에 기존 웹 서버와 함께 사용하는 것이 좋습니다.
관련하여 읽어볼 만한 글..
https://serverfault.com/questions/590819/why-do-i-need-nginx-when-i-have-uwsgi
https://serverfault.com/questions/331256/why-do-i-need-nginx-and-something-like-gunicorn
http://www.ines-panker.com/2020/02/16/nginx-uwsqi.html
NginX와 uWSGI
NginX와 같은 웹 서버는 요청받은 데이터를 응답하기 위해 현재 백엔드 애플리케이션인 Django 또는 Flask에게 데이터를 요청해야 하는데, NginX는 Python을 모르기 때문에 uWSGI와 같은 중개자를 거쳐야 합니다.
웹 서버는 NginX 뿐만이 아닌, Apache 등을 사용할 수 있습니다만 이 글에선 NginX로 연동하는 방법으로 진행됩니다.
개발 환경
- macOS: 14.0
- docker: 24.0.2
- ubuntu 컨테이너: 16.04
- python: 3.8.1
- pip: 20.3.4
- Flask: 3.0.0
- Werkzeug: 3.0.0
이 글은 python, pip, flask가 설치됐다는 가정 하에 진행됩니다.
python, pip, Flask 설치는 아래 글을 참고해주세요
https://sty110357.tistory.com/184
python, flask 등의 프로그램 버전 호환성에 주의해야 합니다.
1. nginx 설치
$ sudo apt-get install nginx
2. uwsgi 설치
$ pip install uwsgi
3. hello.py 파일 생성
간단한 Flask 앱을 만듭니다.
# hello.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
@app.route("/meet")
def meet():
return "Nice to meet you!"
if __name__ == '__main__':
app.run(host='0.0.0.0')
4. uwsgi.ini 파일 생성
uwsgi 설정 파일을 만듭니다.
[uwsgi]
module = hello
callable = app
socket = /tmp/test.sock
chmod-socket = 777
vacuum = true
daemonize = /root/projects/uwsgi/uwsgi.log
pidfile = /root/projects/uwsgi/uwsgi.pid
die-on-term = true
processes = 8
threads = 16
enable-threads = true
- module: 실행할 python 모듈 파일명
- callable: 모듈 파일 내 Flask 변수명(app = Flask(__name__)에서 app과 일치시켜야 함)
- socket: nginx, flask와 통신할 socket 파일
- chmod-socket: test.sock이 생성될 때 test.sock의 chmod 설정(666이 권장됨)
- vacuum: uWSGI를 통해서 생성된 파일들을 삭제할지 여부
- demonize: 데몬 상태로 동작시키려면 log 파일 경로를 지정
- pidfile: pid 파일 경로 지정
- die-on-term: https://uwsgi-docs.readthedocs.io/en/latest/Upstart.html#what-is-die-on-term
- processes: 실행할 프로세스 수
- threads: 프로세스에서 실행할 스레드 수
- enable-threads: thread 사용 여부
5. NginX 설정 변경
$ vi /etc/nginx/sites-available/default
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri @app;
}
location @app {
include uwsgi_params;
uwsgi_pass unix:/tmp/test.sock;
}
}
$ sudo service nginx restart
6. start.sh 파일 생성
uwsgi --ini uwsgi.ini
7. start.sh 실행
$ chmod 777 start.sh
$ ./start.sh
8. log 확인
$ tail -f uwsgi.log
9. 브라우저에서 접속 시도
저는 도커를 사용하고 있으므로, 20001 -> 80 포트 포워딩이 된 컨테이너에 접속하기 위해 아래와 같은 주소를 사용했습니다.
localhost:20001
브라우저에 위와 같은 메시지가 표시되면 성공입니다.
10. stop.sh 파일 생성
uwsgi --stop uwsgi.pid
pkill uwsgi
11. stop.sh 실행
$ chmod 777 stop.sh
$ ./stop.sh
참고
- https://losskatsu.github.io/it-infra/flask-nginx-uwsgi-concept/#flask-nginx-uwsgi1-%EA%B0%9C%EB%85%90
- https://losskatsu.github.io/it-infra/flask-nginx-uwsgi/#flask-nginx-uwsgi-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0%EC%8B%A4%EC%8A%B5
'Python > Flask' 카테고리의 다른 글
도커 컨테이너(Ubuntu 16.04)에 python3.8, pip, flask 설치 (0) | 2023.10.10 |
---|