windows+apache2.4+mod_wsgi+flask(venv)
Windows上でApacheを動かしてmod_wsgiでFlaskが動作する環境を作る必要があったので、作業メモ。
mod_wsgiはWindowsでコンパイルしてインストールを行います。
設定に利用したファイルは記事の最後にの掲載しています。
環境
インストール作業
インストール手順
- Python3.11.xをインストール
- Apache2.4.xをインストール
- mod_wsgiをインストール
- Flaskのインストールとアプリケーションを作成
- Apacheのhttpd.confを編集
- Apacheを起動して動作テスト
Python3.11.xのダウンロードとインストール
下記のリンクからpythonをダウンロードして、全てデフォルトでインストールを行う。
https://www.python.org/downloads/
Apache2.4.xのダウンロード
下記のリンクからファイルをダウンロードしてC:\Apache24にファイルを展開する
別の所に展開するとmod_wsgiが正常に動かないので変更しないこと
https://httpd.apache.org/download.cgi
mod_wsgiのインストール(詳細版)
システムにmod_wsgiをインストールする
手順は長いですが結構簡単です。
pythonにパスが通っていないのでpythonのインストール場所へ移動する。
cd C:\Users\%USERNAME%\AppData\Local\Programs\Python\Python311
pipのバージョンを最新にする。
python -m pip install --upgrade pip
mod_wsgiをインストールする(エラーが出て失敗すると思います。)
python -m pip install mod_wsgi
エラーを解消していきます。
Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/ がないと怒られているのでダウンロード。
ダウンロードしたファイルを実行して暫く待つと以下の画面が現れるので、C++によるデスクトップ開発にチェックを入れてインストールを実行。
インストールが完了したら閉じる
再度python -m pip install mod_wsgiを実行すると、またエラーが出ます。
エラーを解消していきます。
Apacheのヘッダファイルがないと怒られています。
c:\Apache24\include\apr_network_io.h(29): fatal error C1083: include ファイルを開けません。'apr_perms_set.h':No such file or directory
Apacheが利用するAPIをコンパイルするために利用するファイルをダウンロード。
https://apr.apache.org/download.cgi
ファイルがダウンロードできたらC:\apr-1.7.4にファイルを展開する。
apr_perms_set.hをmod_wsgiのインストール時にMS Build Toolが利用できるように環境変数にパスを通す。
インストール時に見つからなかったapr_perms_set.hはC:\apr-1.7.4\includeに入っています。
コマンドプロンプトに以下の文字を入力します。
SET INCLUDE=C:\apr-1.7.4\include
再度python -m pip install mod_wsgiを実行するとインストールに成功します。
Flaskのインストールとアプリケーションを作成
Flaskのインストールとvenvの作成
- mkdir c:\flask-app
- cd c:\flask-app
- c:\Users\test\AppData\Local\Programs\Python\Python311\python.exe -m venv venv
- venv\Scripts\activate
- pip install --upgrade pip
- pip install flask
Flaskで作ったアプリケーションの構成
app.wsgi mod_wsgiでFlaskを動かすときに必要となるファイル
import sys
sys.path.insert(0, r'C:/flask-app')
sys.path.insert(0, r'C:/flask-app/venv/Lib/site-packages')
from api import app as application
mod_wsgiをApacheで動作させるにはmod_wsgiがpip installでインストールされた場所の情報が必要となるので以下のコマンドを実行する必要があります。
mod_wsgi-express module-config
コマンドプロンプトを開いて以下の場所へ移動します。
cd C:\Users\%USERNAME%\AppData\Local\Programs\Python\Python311\Scripts
mod_wsgi-express module-configを実行すると以下のように情報が表示されますので、メモ帳などに保存しておいてください。
テキストでディタでApacheのコンフィグファイルを開きます。
C:\Apache24\conf\httpd.conf
ファイルが開いたら先程メモ帳に保存しておいた内容をhttpd.confの最終行に追記。
WSGIPythonHomeに記載されているPythonのパスをvenvの中のpythonに変更します。
c:\flask-app\venv\Scripts
上記を追加した更に下側にflask-appをApacheが認識できるように設定を追加します。
- コマンドプロンプトを開く
- cd c:\Apache24\bin
- httpd -t で構文チェックを行い問題がないことを確認
- http
- ブラウザを開いてhttp://localhost/statusにアクセスして以下の表示が出たら正常に起動しています
- プログラムを修正した場合はhttpdを一度停止して、再度起動し直してください。
WindowsではWSGIDaemonProcessが利用できず、WSGIScriptReloadingも利用できないため、プログラム修正時はApacheの再起動が必須です。
1. api.py(クリックすると展開します)
from flask import Flask
from flask.json.provider import DefaultJSONProvider
DefaultJSONProvider.ensure_ascii = False
app = Flask(__name__)
COUNT = 0
@app.route("/status", methods=["GET"])
def status():
return {"status": "正常"}
@app.route("/count", methods=["GET"])
def count_up():
global COUNT
COUNT += 1
return {"count": COUNT}
if __name__ == "__main__":
app.run(debug=True)
2. app.wsgi(クリックすると展開します)
import sys
sys.path.insert(0, r'C:/flask-app')
sys.path.insert(0, r'C:/flask-app/venv/Lib/site-packages')
from api import app as application
3. httpd.conf(クリックすると展開します)
# httpd.confの下に追記してください
LoadFile "C:/Users/test/AppData/Local/Programs/Python/Python311/python311.dll"
LoadModule wsgi_module "C:/Users/test/AppData/Local/Programs/Python/Python311/Lib/site-packages/mod_wsgi/server/mod_wsgi.cp311-win_amd64.pyd"
#WSGIPythonHome "C:/Users/test/AppData/Local/Programs/Python/Python311"
WSGIPythonHome "C:/flask-app/venv/Scripts"
# Apacheの80ポートにアクセスが来た時の設定を記載する
<VirtualHost *:80>
# レスポンスヘッダに含まれるサーバー名
ServerName localhost
# http://IP/ にアクセスが来た時にどこのフォルダを参照するのか
DocumentRoot "C:/flask-app"
# http://IP/ にアクセスが来た時に "C:/flask-app/app.wsgi"を実行する
WSGIScriptAlias / "C:/flask-app/app.wsgi"
# 以下の様にした場合は http://IP/test にアクセスが来た時に "C:/flask-app/app.wsgi"を実行する
# WSGIScriptAlias /test "C:/flask-app/app.wsgi"
# c:/flask-appへのアクセスを許可する
<Directory "C:/flask-app">
Require all granted
</Directory>
</VirtualHost>