Blueprintでファイルを分割したFlaskアプリをデプロイする(https接続) - AlmaLinux

Flaskアプリ

Flaskアプリのサンプルは、必要ならGitHubから取得してください。

サーバー環境

  • AlmaLinux9
  • Apache
  • Python
  • Flask
  • wsgi
  • pipenv

ここでは、Linuxのユーザー名は、「 flaskuser 」として説明します。環境に合わせて変更してください。

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

Flaskのデプロイするための作業

Flaskアプリをデプロイするために以下の作業を行っていきます。

  • ユーザーの作成
  • EPELリポジトリのインストール
  • AlmaLinuxのアップデート
  • Gitのインストール
  • Apacheのインストール・設定
  • ファイアウォールのインストール・設定
  • Pythonのインストール
  • wsgiのインストール
  • pipenv(Pythonの仮想環境のインストール)
  • 各種所有権とパーミッションの設定
  • SELinuxの設定
  • certbotを使って証明書の発行、SSL接続の設定

SSHの認証などはこのページでは省略します。以下のページなどを参考にしてください。

作成や設定をするディレクトリ・ファイル

パス 内容 パーミッション
/etc/httpd/conf/httpd.conf Apacheのメインの設定ファイル 変更なし
/etc/httpd/conf.d wsgi.confを作成するディレクトリ 変更なし
/etc/httpd/conf.d/wsgi.conf wsgiの設定ファイル 変更なし
/etc/letsencrypt/ certbotで発行される証明書などが保存されているディレクトリ
certbotで設定すると自動的に作成される
/etc/letsencrypt/accounts Let's Encrypt のアカウントに関する情報の保存場所
/etc/letsencrypt/live ドメイン別のディレクトリが作成され、その中に証明書が作成される
/etc/letsencrypt/archive これまでに作成した証明書全ての実体が保存される
/etc/letsencrypt/renewal certbotが証明書更新の際に参照する設定ファイル
/etc/letsencrypt/renewal-hooks
/home/flaskuser/pyapp Flaskアプリのファイルをアップロードするディレクトリ 755

ユーザーの作成

利用環境によっては、AlmaLinuxのインストール直後はrootしかないため、ユーザーの作成が必要になります。

ユーザーの作成、パスワードの設定、sudoの実行権限については、以下のページを参考にしてください。

EPELリポジトリのインストール

EPELリポジトリをインストールするには以下のようにします。

sudo dnf -y install epel-release

AlmaLinuxのアップデート

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

sudo dnf -y update

Gitのインストール

Gitをインストールします。システムにインストールされているPythonではなく、pyenvを利用してPythonをインストールする際に必要です。

sudo dnf -y install git

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

Apacheのインストール

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

sudo dnf -y install httpd httpd-devel

Apacheを起動し、自動起動を有効にしておきます。

sudo systemctl start httpd

# 自動起動の有効化
sudo systemctl enable httpd

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

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

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

sudo ausearch -c httpd

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

sudo semanage permissive -a httpd_t
sudo chcon -R -t httpd_sys_content_t /home/flaskuser/pyapp
semanage fcontext -a -t httpd_sys_content_t '/home/flaskuser/pyapp(/.*)?'

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

sudo tail -f /var/log/httpd/error_log

ファイアウォールのインストール・設定

ファイアウォールは、利用環境によってはインストールされていないことがあるため、次のコマンドを実行しインストールされているか調べます。

sudo dnf list installd | grep firewalld

インストールされていなければ、以下のコマンドを実行しインストールします。

sudo dnf -y install firewalld

ファイアウォールを起動し、自動起動を有効にしておきます。

sudo systemctl start firewalld
sudo systemctl enable firewalld

80番と443番ポートを開けます。

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

SSHの設定

ここでは、SSHで接続するための標準の22番ポートから10022番ポートに変更してみます。

まず、ファイアウォールにゾーンに新たに設定を追加します。

sudo firewall-cmd --add-port=10022/tcp  --permanent --zone=public
sudo firewall-cmd --reload

設定が追加されたか確認するには、以下のコマンドを実行します。

sudo firewall-cmd --list-all

SELinux のポリシーにポート番号を追加するには、以下のようにします。

sudo semanage port --add --type ssh_port_t --proto tcp 10022

SELinux のポリシーに追加されたか確認するには、以下のコマンドを実行します。

sudo semanage port --list | grep ssh

SSHの設定ファイルを開くには、以下のコマンドを実行します。

sudo vi /etc/ssh/sshd_config

初期値のポート番号の22から10022に変更します。合わせてrootで接続できないように設定しておきます。設定ファイルを以下のように変更します。

/etc/ssh/sshd_config

# ポート番号を変更
Port 10022

# root で接続できないようにする
PermitRootLogin no

SSHの設定ファイルを変更後、再起動して設定を反映させます。

sudo systemctl restart sshd

一度、SSHの接続を切り、rootでログインできないことや、変更後のポートで接続できるか確認します。

変更後のポート番号で接続できることが確認できれば、ファイアウォールのゾーンからSSHの設定を削除します。削除するには、以下のコマンドを実行します。

sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload

Python のインストール

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

Flaskアプリをアップロードします。ここでは、GitHubからサンプルアプリをクローンします。

git clone https://github.com/mm197932/pyapp.git

「 flask.wsgi 」のファイルの「 <ユーザー名> 」の部分はそれぞれの環境に合わせて変更してください。

このサイトでは、「 sys.path.insert(0, '/home/flaskuser/pyapp/') 」に変更して設定しています。

# coding: utf-8
import sys

# <ユーザー名は、環境に合わせてLinuxのユーザー名を入力
sys.path.insert(0, '/home/<ユーザー名>/pyapp/')

from myapp import app as application

「 pyapp 」ディレクトリに移動し、「 pyapp 」ディレクトリで利用するPythonを設定します。

pyenv local 3.13

pipをアップグレードします。

pip install --upgrade pip

Pythonのインストールが完了すれば、pipenvをインストールします。

pip install pipenv

次に「 pyapp 」にpipenvで仮想環境の初期化を行います。

pipenv --python 3.13.0

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/flaskuser/.local/share/virtualenvs/pyapp-vyB18tQg/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-vyB18tQg"

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

Apacheの設定

Apacheの標準設定ファイルである「 /etc/httpd/conf/httpd.conf 」を確認します。

まずは、http接続で問題なく接続できるか確認後、https接続の設定を行います。

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

/etc/httpd/conf/httpd.conf

ServerName www.example.com:80

wsgiの設定を行うためのファイルを「 /etc/httpd/conf.d 」に作成します。

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

以下のコマンドを実行し、「 /etc/httpd/conf.d/wsgi.conf 」ファイルを開きます。

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

ファイルの中を次のようにします。

flaskuser 」と「 example.com 」をそれぞれの環境をに合わせて変更します。

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

# wsgi.conf
# 「 mod_wsgi-express module-config 」 コマンドで調べた内容を記述
# ---------------------------------------------------
LoadModule wsgi_module "/home/flaskuser/.local/share/virtualenvs/pyapp-vyB18tQg/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-vyB18tQg"
# ---------------------------------------------------

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

    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>

※1 FQDN (Fully Qualified Domain Name):ホスト名とドメイン名の両方を合わせたもの

パーミッションを変更します。

sudo chmod -R 755 flaskuser
sudo chmod -R 755 /home/flaskuser/pyapp

certbotを使って証明書の発行

certbotで証明書を発行するには、IPアドレスのみで設定はできずドメインが必要になります。ローカル上でSSL接続をする設定もありますがここでは、説明は省きます。

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

sudo dnf -y install certbot python3-certbot-apache

サイトをSSL化するには、Apacheのmod_sslも必要です。

sudo dnf -y install mod_ssl

証明書を発行するには、以下のコマンドを実行します。「 example.com 」は、それぞれの環境に合わせて変更してください。

sudo certbot --apache -d example.com

処理が終わると「 /etc/httpd/conf.d/wsgi.conf 」のファイルに緑色の部分が追加されます。

# wsgi.conf
# 「 mod_wsgi-express module-config 」 コマンドで調べた内容を記述
# ---------------------------------------------------
LoadModule wsgi_module "/home/flaskuser/.local/share/virtualenvs/pyapp-vyB18tQg/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-vyB18tQg"
# ---------------------------------------------------

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

    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>
RewriteEngine on
RewriteCond %{SERVER_NAME} =example.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

SSL接続の設定

flaskuser 」と「 example.com 」をそれぞれの環境をに合わせて変更します。

「 /etc/httpd/conf.d/wsgi.conf 」のファイルに設定をVirtualHostの設定を追加していきます。最終的に以下のように編集します。

# 「 mod_wsgi-express module-config 」 コマンドで調べた内容を記述
# ---------------------------------------------------
LoadModule wsgi_module "/home/flaskuser/.local/share/virtualenvs/pyapp-vyB18tQg/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-vyB18tQg"
# ---------------------------------------------------

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

<VirtualHost *:443>
    ServerName example.com:443

    SSLEngine On
    SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem

    <Directory /home/flaskuser/pyapp/>
        Require all granted
    </Directory>
</VirtualHost>

<VirtualHost *:80>
    ServerName example.com:80

    <Directory /home/flaskuser/pyapp/>
        WSGIApplicationGroup %{GLOBAL}
        WSGIScriptReloading On

        Require all granted

    </Directory>
RewriteEngine on
RewriteCond %{SERVER_NAME} =example.com [OR]
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

設定を変更したらApacheを再起動します。

sudo systemctl restart httpd

ブラウザを開き「 https://設定したドメイン名/content 」と入力して、Javascriptのalertが表示され、以下のページが表示されれば設定完了です。

また、「 http://設定したドメイン名/content 」と入力し、リライトされるかも確認しておきます。