FLASKの導入とAPACHEからのWSGIでのアクセス
FLASKでAPI設計してAPACHE経由でアクセスさせることをときどきやっているのですが。
時間がたつと、再度設定が必要になったときに記憶やPCのどこかにある断片的なメモをつなぎ合わせながらなどときおりAIに聞きながらやりと極めて自分にとっても不効率なので、ここで自分の忘備録メモとして書きます。同様なことをされている方の参考になれば幸いです。
APACHE2を使う理由は無料SSLのLet's Encryptがわずか2つのコマンド入力でできて(2つ目コマンドではいくつか質問PROMPTもある)、SSL更新も基本不要でとても便利だからですが。(NGINXでもおそらくかなりシンプルではあるかと思いますがAPACHEのMOD_PROXYだとかMOD_GEOIPやオープンソースWEBFIREFALLのMOD_SECURITYなどモジュールがたくさんサポートされているため愛用してます。NGINXにもあるのかな)
この記事をかいているのが2025年10月26日で環境はUbuntu24.04です。
** FLASKの導入
まずはFLASKの導入です。それにはPYTHONが必要ですので導入します
# apt install python3-venv python3-pip
上のコマンドを実行すると、python3本体もはいります。一応きちんと整理したいためPYTHONの仮想環境を想定してpython3-venvもいれておきます。
それでは仮想環境を作っておきましょう。
私は整理するために通常/opt/pyenvというフォルダーを作りそこに仮想環境を設定してます。
仮想環境を構築して仮想環境を有効化します。
# mkdir /opt/pyenv
# cd /opt/pyenv
# python3 -m venv myenv
# source myenv/bin/activate
(myenv)$ pip install flask
インストールしたらFLASKの動作確認をします。
FLASKをいれるフォルダーを別途作成します。
(myenv)$ mkdir /opt/myapp
(myenv)$ cd /opt/myapp
ここに、app.pyという名前でFLASKのファイルを作成します。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def SimpleRootGET():
return 'GET OK'
それではまずFlaskの単体での動作確認
(myenv)$ export FLASK_APP=app.py
(myenv)$ flask run
* Serving Flask app 'app.py'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
無事動いているようです。
それではAPACHEのほうをインストールしていきます。一応SSL(Let's Encrypt)の導入方法もメモしておきます
APACHEのインストール
# apt install apache2
それではFQDNで、サーバーをたてます。あらかじめドメインやDNSの設定をしてFQDNとサーバに割り当てられたIPアドレスを関連づけてください。
まずでデフォルトのテンプレをコピーしてそれを編集します。そのうえでデフォルトの設定は無効化します。
# cd /etc/apache2/sites-available
# cp 000-default.conf mysite.conf
# a2dissite 000-default.conf
それではmysite.confを編集します。取り急ぎ普通のWEBサイトであれば以下だけで動きます。
<VirtualHost *:80>
ServerName mysite.mydomain.com
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
これでサイトを有効化してAPACHEのリロード
# a2ensite mysite.conf
# systemctl reload apache2
そしてLET'S ENCRYPTを導入します。
# apt install certbot python3-certbot-apache
# certbot --apache --agree-tos --redirect --staple-ocsp -d mysite.mydomain.com
これでSuccessとなればOKです。導入時はポート80は解放しておくようにしておきましょう。
一応自動更新状態をチェックして,更新をシミュレートしておきます。
#systemctl status certbot.timer
● certbot.timer - Run certbot twice daily
Loaded: loaded (/usr/lib/systemd/system/certbot.timer; enabled; preset: enabled)
Active: active (waiting) since Sun 2025-10-26 20:59:26 UTC; 29min ago
Trigger: Mon 2025-10-27 08:39:51 UTC; 11h left
Triggers: ● certbot.service
Oct 26 20:59:26 ip-172-31-0-109 systemd[1]: Started certbot.timer - Run certbot twice daily.
# certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/mysite.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Account registered.
Simulating renewal of an existing certificate for mysite.mydomain.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded:
/etc/letsencrypt/live/mysite.mydomain.com/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
アクセスして、SSLが機能しているか確かめましょう。
それではいよいよ、WSGIにてAPACHEと先ほど設定したFlaskを結びつけます。
私の環境はでは mysite.mydomain.com/api とFlaskのROOTを紐づけます。
パッケージをインストールして、設定ファイルを作成します。
# apt install libapache2-mod-wsgi-py3
# cd /etc/apache2/conf-available
# nano wsgi.conf
wsgi.confは以下のような内容です
WSGIScriptReloading On
WSGIProcessGroup app
WSGIDaemonProcess app user=www-data group=www-data threads=5 python-home=/opt/pyenv/myenv
WSGIScriptAlias /api /opt/myapp/app.wsgi
<Directory /opt/myapp>
WSGIProcessGroup app
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Require all granted
</Directory>
あと/opt/myappにapp.wsgiのファイル名で以下ようなファイルも用意します。
import sys
sys.path.insert(0,"/opt/voiceapi")
from app import app as application
www-data: Apacheの実行システムユーザー
/opt/pyenv/myenv: 仮想環境PYTHONのルートディレクトリ
/api の仮想パスで、/opt/myapp/app.wsgi につなぎFLASKと連携
それでは設定を有効化します
# a2enconf wsgi.conf
# systemctl reload apache2
URLにアクセスすると先ほどFLASKで定義したGETでの返り値文字列が表示されます。連携ができてることが確認できました。

Discussion