Flask のデプロイ - AlmaLinux

Flaskのデプロイについて

以下の環境にFlaskアプリをデプロイします。

  • AlmaLinux9
  • Apache
  • wsgi
  • pipenv

Linuxのユーザー名は、「 flaskuser 」としています。

Flaskアプリのファイルをアップロードする場所はユーザーディレクトリの、「 home/flaskuser/pyapp 」に設置します。

AlmaLinux9 の設定

EPELリポジトリを追加します。

sudo dnf install epel-release

AlmaLInuxのアップデートを行います。

sudo dnf update

Git をインストールします。

sudo dnf -y install git

# インストールされたかバージョンで確認
git -v

Python のインストール

Pythonをインストールするのは、以下のページを参考にしてください。

次にpipenvで仮想環境を作成します。仮想環境を作成する場所は、「 home/user/pyapp 」に作成します。仮想環境の作成も上記のページを参考にしてください。

ApacheでPythonプログラムを実行できるようにするには、「 mode_wsgi 」モジュールをインストールします。

仮想環境にflaskとmod_wsgiをインストールするには、仮想環境を作成したディレクトリに移動し以下のコマンドを実行します。

pipenv install mod-wsgi flask

仮想環境の中に入るには以下のコマンドを実行します。

pipenv shell

仮想環境の中で「 mod_wsgi-express module-config 」のコマンドを実行して、Apacheの設定ファイルに記載する内容を調べます。

mod_wsgi-express module-config

上記のコマンドを実行すると以下のような表示がされるため内容を保存しておきます。あとで行うApacheの設定の際、必要になります。

LoadModule wsgi_module "/home/user/.local/share/virtualenvs/pyapp-2Rq7tUgM/lib/python3.13/site-packages/mod_wsgi/server/mod_wsgi-py313.cpython-313-x86_64-linux-gnu.so"
WSGIPythonHome "/home/user/.local/share/virtualenvs/pyapp-2Rq7tUgM"

仮想環境から抜けるには「 exitコマンド 」を実行します。

Apache のインストール

mod_wsgiインストールするさいに、httpd-devel パッケージも必要になるため合わせてインストールします。

sudo dnf install httpd httpd-devel

Apache を起動するには、次のコマンドを実行します。

sudo systemctl start httpd

Apacheの自動起動を有効にするには、以下のようにします。

sudo systemctl enable httpd

Apacheが起動しない場合、SELinuxでエラーになっている場合があります。

SELinuxのポリシーを変更するには、ログを確認して設定を変更する必要があります。

SELinuxのログは、「 /var/log/audit/audit.log 」に出力されます。

関係ないログも大量に出力されるため、ausearch コマンドを使うと便利です。Apacheをログを確認するには、以下のようにします。

sudo ausearch -c httpd

ApacheのみPermissive(寛容な)に設定するには、以下のコマンドを実行します。

sudo semanage permissive -a httpd_t

Apacheの各種ファイルやコマンド

メインの設定ファイル

sudo vi /etc/httpd/conf/httpd.conf

補助設定ファイルの保存場所

sudo cd /etc/httpd/conf.d

シンタックスエラーの確認

httpd -t
apachectl configtest

アクセスログ・エラーログ

sudo less /var/log/httpd/error_log
sudo less /var/log/httpd/access_log

Apache の設定

Apacheの標準設定ファイルを以下のように変更しておきます。

SeverNameのコメントが外れているか確認しておきます。

ServerName www.example.com:80

「 /etc/httpd/conf.d/ 」に「 wsgi.conf 」というファイルを作成します。

sudo touch /etc/httpd/conf.d/wsgi.conf

「 /etc/httpd/conf.d/wsgi.conf 」を開きます。

sudo vi /etc/httpd/conf.d/wsgi.conf

VirtualHost の設定を追加します。

/etc/httpd/conf.d/wsgi.conf

# wsgi.conf
# 「 mod_wsgi-express module-config 」 コマンドで調べた内容を記述
# ---------------------------------------------------
LoadModule wsgi_module "/home/flaskuser/.local/share/virtualenvs/pyapp-2Rq7tUgM/lib/python3.13/site-packages/mod_wsgi/server/mod_wsgi-py313.cpython-313-x86_64-linux-gnu.so"
WSGIPythonHome "/home/flaskuser/.local/share/virtualenvs/pyapp-2Rq7tUgM"
# ---------------------------------------------------

<VirtualHost *:80>
    ServerName xxx.xxx.xxx.xxx # サーバーのIPアドレスもしくは、ドメイン名、FQDNを指定します

    WSGIDaemonProcess pyapp user=flaskuser  group=flaskuser threads=5
    WSGIScriptAlias / /home/flaskuser/pyapp/flask.wsgi

    <Directory /home/flaskuser/pyapp/>

        WSGIProcessGroup pyapp
        WSGIApplicationGroup %{GLOBAL}
        WSGIScriptReloading On

        Require all granted

    </Directory>
</VirtualHost>

ファイアウォールの設定を変更するには、以下のように変更します。

sudo firewall-cmd --permanent --add-service=http --zone=public
sudo firewall-cmd --reload

wsgiファイルの作成

「 /home/flaskuser/pyapp/ 」に「 flask.wsgi 」ファイルを作成します

/home/flaskuser/pyapp/flask.wsgi

# coding: utf-8
import sys

sys.path.insert(0, '/home/flaskuser/pyapp/')

from myapp import app as application

Flaskアプリの作成

「 /home/flaskuser/pyapp/ 」に「 myapp.py 」ファイルを作成します

home/user/pyapp/myapp.py

#-*- coding: utf-8-*-
import sys 
# インストールしたモジュールが読み込めない場合、モジュールのパスを読み込ます
sys.path.append('/home/flaskuser/.local/share/virtualenvs/pyapp-2Rq7tUgM/lib/python3.13/site-packages')

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello, Flask'
    
if __name__ == "__main__":
    app.run()