Ubuntu 16.04 환경에서 패키지 매니저를 최대한 많이 이용하여 설치하는 방법을 소개함
Flask 설치
pip install Flask
pip install Flask-Cors
mod-wsgi 설치
sudo apt install libapache2-mod-wsgi-py3
wsgi란 Web Server Gateway Interface를 의미하는데, Apache나 Nginx 등의 웹서버에서 Python 애플리케이션을 서비스로 구동시킬 수 있는 인터페이스임
node [Apache (mode_wsgi)]
node [wsgi 인터페이스]
node [wsgi를 구현한/호환되는 Python 애플리케이션]
[Apache (mode_wsgi)] -> [wsgi 인터페이스]
[wsgi 인터페이스] -> [wsgi를 구현한/호환되는 Python 애플리케이션]
여기서는 Apache에서 mod_wsgi를 이용하여 Flask 애플리케이션을 서비스로 구동하는 것에 해당함
node [Apache (mode_wsgi)]
node [wsgi 인터페이스]
node [Flask 애플리케이션]
[Apache (mode_wsgi)] -> [wsgi 인터페이스]
[wsgi 인터페이스] -> [Flask 애플리케이션]
Apache 설정
<VirtualHost *:80>
<IfModule wsgi_module>
WSGIDaemonProcess Flask앱이름 user=사용자아이디 group=그룹아이디 threads=4
WSGIScriptAlias /flask /Flask_앱의_경로/index.wsgi
<Directory /Flask_앱의_경로>
WSGIProcessGroup Flask앱이름
WSGIApplicationGroup %{GLOBAL}
WSGIScriptReloading On
Require all granted
</Directory>
</IfModule>
</VirtualHost>
- http://localhost/flask로 접근 가능함
- 앱 이름은 그다지 중요하지 않지만 index.wsgi 파일의 경로는 중요함 (파일 이름은 변경할 수 있으나 실제 파일로 존재해야 함)
- 기존 80포트와 443 포트에 대한 VirtualHost 요소가 정의되어 있는지 미리 확인하고 그 안에 포함시킬 수 있음
- virtual host를 사용하지 않거나 http와 https 모두에 적용이 필요한 경우에는 VirtualeHost 요소 외부에 위치시켜도 됨
<VirtualHost *:80>
...
</VirtualHost>
<VirtualHost *:443>
...
</VirtualHost>
<IfModule wsgi_module>
WSGIDaemonProcess myflaskapp user=사용자아이디 group=그룹아이디 threads=4
WSGIScriptAlias /flask /...Flask 앱의 경로.../index.wsgi
<Directory /...Flask 앱의 경로...>
WSGIProcessGroup myflaskapp
WSGIApplicationGroup %{GLOBAL}
WSGIScriptReloading On
Require all granted
</Directory>
</IfModule>
Flask 앱
index.py
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
from flask import Flask, jsonify, request
from flask_cors import CORS
app = Flask(__name__)
app.config.from_object(__name__)
CORS(app, resources={r"/*": {"origins": "*"}})
@app.route("/check", methods=["GET"])
def check():
return jsonify("ok")
http://localhost/flask/check로 접근 가능하도록 라우팅 설정
wsgi 파일
index.wsgi
#!/usr/bin/env python
import logging
import sys
logging.basicConfig(stream=sys.stderr)
sys.path.insert(0, 'Flask 앱의 경로')
sys.path.insert(1, '사용하고 있는 파이썬 런타임의 site-packages 경로')
from index import app as application
index.py라는 파일에서 Flask 인스턴스인 app을 import하겠다는 의미임
index.py의 다음 코드와 관련 있음
app = Flask(__name__)
Troubleshooting
"No module named 'flask' 에러
ImportError: No module named 'flask'
- 이런 에러가 발생한다면 flask 모듈의 경로를 path에 설정하지 않았기 때문임
- wsgi 파일의 sys.path 리스트 변수에 /usr/local/lib/python3.8/site-packages 등의 경로가 추가되어야 함
- 위 wsgi 파일의 site-packages 경로 설정을 참고할 것
- Ubuntu Linux의 경우에는 /usr/local/에 python3가 설치되지 않은 상태이기 때문에 pyenv나 virtualenv 등의 site-packages 경로를 찾아서 추가해줄 필요가 있음
애플리케이션 변경
Flask 애플리케이션의 코드를 변경해도 웹서비스에 반영되지 않으므로 Apache를 재실행하거나 wsgi 파일의 타임스탬프를 업데이트하여 Flask 애플리케이션에 변경이 생겼음을 Apache에게 알려주는 작업이 필요함
sudo service apache2 restart
touch index.wsgi
Flask 애플리케이션의 코드 뿐만이 아니라 Flask 애플리케이션이 관리하는 템플릿 파일이나 정적 리소스에 변경이 생길 때마다 Flask 애플리케이션에 변경이 생겼음을 Apache에게 알려줘야 함