Ubuntu + Apache環境でのFlaskの連携設定

カテゴリ:Python

本記事の対象OS:Ubuntu

以下では、Ubuntu で WSGI (Web Server Gateway Interface) を使用して Apache と Flask と連携する手順について解説します。

実行環境は以下となります。

# cat /etc/issue
Ubuntu 22.04.3 LTS \n \l

# python3 --version
Python 3.10.12

# apache2 -v
Server version: Apache/2.4.52 (Ubuntu)
Server built:   2023-05-03T20:02:51

Python関連のインストール

Python関連のパッケージをインストールします。

# apt install python3-dev python3-pip
# pip3 install flask

Apache関連のインストール

Apache2およびWSGIモジュールをインストールします。

# apt install apache2
# apt install libapache2-mod-wsgi-py3

Apacheの設定

1. /etc/apache2/sites-available配下にflask.confファイルを作成します。

# cd /etc/apache2/sites-available
# touch flask.conf

実施後の状態:

# pwd
/etc/apache2/sites-available

# tree -l
.
├── 000-default.conf
├── default-ssl.conf
└── flask.conf

2. flask.confを設定します。

以下の例では /api へのリクエストをWSGI (Flask)で処理するようにマッピングしています。

flask.confの設定例)

<VirtualHost *:80>
    ServerName localhost:80

    WSGIDaemonProcess flask_app user=www-data group=www-data threads=5
    WSGIScriptAlias /api /var/www/flask/wsgi.py

    <Directory /var/www/flask>
        WSGIProcessGroup flask_app
        WSGIApplicationGroup %{GLOBAL}
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

Noteこの設定例ではFlask用のディレクトリを /var/www/flask としています。環境によって読み替えてください。

3. /var/www/flask/ ディレクトリを作成し、ユーザー、グループをwww-dataに変更します。

# mkdir /var/www/flask/
# chown -R www-data:www-data /var/www/flask/

4. flask.confを有効化します。

# a2ensite flask

WSGIの設定

1. /var/www/flask配下にwsgi.pyapp.pyファイルを作成します。
※app.pyはテスト用のサンプルアプリケーション

# cd /var/www/flask
# touch wsgi.py
# touch app.py

実施後の状態:

# pwd
/var/www/flask

# tree -l
.
├── app.py
└── wsgi.py

2. wsgi.pyに以下のようにコードを記述します。

Note以下の例ではPythonアプリケーションとしてappパッケージからappオブジェクトをインポートしています。

wsgi.pyの設定例)

import os,sys

sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))

from app import app as application

サンプルアプリケーションの設定

app.pyにサンプルアプリケーションとして以下のような Hello World! を表示するコードを記述します。

app.pyの設定例)

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
   name = "Hello World!"
   return name

if __name__ == "__main__":
   app.run()

最後に Apache を再起動します。

# systemctl restart apache2

NoteFlaskはApacheのモジュールとして組み込まれるため、Systemd用のFlaskの起動スクリプトを作成したり自動起動の設定を行う必要はありません。

サンプルページの表示

Webブラウザで http://localhost/api/ を開き、Hello World! が表示されることを確認してください。

サンプルページ:

localhost (127.0.0.1)以外からアクセスしたら404エラーになる場合

flask.confのServerNamelocalhostではなく、実際のサーバー名を指定してください。 もしくは以下のコマンドを実行してデフォルトの 000-default.conf を無効にします。

# a2dissite 000-default.conf
# systemctl reload apache2

Note理由については「VirtualHostのページにlocalhost (127.0.0.1)以外からアクセスしたら404エラーになる場合」の記事をご参照ください。

公開日時:2022年07月15日 12:20:58
最終更新日時:2024年03月18日 15:52:11

なお、VPS選びで迷ったらこちらの記事で主要VPSのメモリ容量ごとの月額、年額料金を比較していますので、是非参考にしてみてください。

Pythonに戻る

このページのトップに戻る