Software Workshop

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>
<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 애플리케이션의 코드를 변경해도 웹서비스에 반영되지 않으므로 Apache를 재실행하거나 wsgi 파일의 타임스탬프를 업데이트하여 Flask 애플리케이션에 변경이 생겼음을 Apache에게 알려주는 작업이 필요함

sudo service apache2 restart

touch index.wsgi
Flask 애플리케이션의 코드 뿐만이 아니라 Flask 애플리케이션이 관리하는 템플릿 파일이나 정적 리소스에 변경이 생길 때마다 Flask 애플리케이션에 변경이 생겼음을 Apache에게 알려줘야 함

Github repository

https://github.com/terzeron/FlaskVueTest