Flaskアプリ
Flaskアプリのサンプルは、必要ならGitHubから取得してください。
Flaskアプリのサンプルは、必要ならGitHubから取得してください。
ここでは、Linuxのユーザー名は、「 flaskuser 」として説明します。環境に合わせて変更してください。
Flaskアプリのファイルをアップロードする場所はユーザーディレクトリの、「 home/flaskuser/pyapp 」に設置します。
Flaskアプリをデプロイするために以下の作業を行っていきます。
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リポジトリをインストールするには以下のようにします。
sudo dnf -y install epel-release
AlmaLInuxのアップデートを行います。
sudo dnf -y update
Gitをインストールします。システムにインストールされているPythonではなく、pyenvを利用してPythonをインストールする際に必要です。
sudo dnf -y install git
# インストールされたかバージョンで確認
git -v
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(/.*)?'
# メインの設定ファイル
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で接続するための標準の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で接続できないように設定しておきます。設定ファイルを以下のように変更します。
# ポート番号を変更
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をインストールするのは、以下のページを参考にしてください。
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の標準設定ファイルである「 /etc/httpd/conf/httpd.conf 」を確認します。
まずは、http接続で問題なく接続できるか確認後、https接続の設定を行います。
ServerNameのコメントが外れているか確認しておきます。
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 」をそれぞれの環境をに合わせて変更します。
# 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で証明書を発行するには、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>
「 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 」と入力し、リライトされるかも確認しておきます。