Flaskのデプロイについて
以下の環境にFlaskアプリをデプロイします。
- AlmaLinux9
- Apache
- wsgi
- pipenv
Linuxのユーザー名は、「 flaskuser 」としています。
Flaskアプリのファイルをアップロードする場所はユーザーディレクトリの、「 home/flaskuser/pyapp 」に設置します。
以下の環境にFlaskアプリをデプロイします。
Linuxのユーザー名は、「 flaskuser 」としています。
Flaskアプリのファイルをアップロードする場所はユーザーディレクトリの、「 home/flaskuser/pyapp 」に設置します。
EPELリポジトリを追加します。
sudo dnf install epel-release
AlmaLInuxのアップデートを行います。
sudo dnf update
Git をインストールします。
sudo dnf -y install git
# インストールされたかバージョンで確認
git -v
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コマンド 」を実行します。
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
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の標準設定ファイルを以下のように変更しておきます。
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 の設定を追加します。
# 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
「 /home/flaskuser/pyapp/ 」に「 flask.wsgi 」ファイルを作成します
# coding: utf-8
import sys
sys.path.insert(0, '/home/flaskuser/pyapp/')
from myapp import app as application
「 /home/flaskuser/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()