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\Python311pipのバージョンを最新にする。
python -m pip install --upgrade pipmod_wsgiをインストールする(エラーが出て失敗すると思います。)
python -m pip install mod_wsgiエラーを解消していきます。
Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/ がないと怒られているのでダウンロード。
ダウンロードしたファイルを実行して暫く待つと以下の画面が現れるので、C++によるデスクトップ開発にチェックを入れてインストールを実行。
インストールが完了したら閉じる
エラーを解消していきます。
Apacheのヘッダファイルがないと怒られています。
c:\Apache24\include\apr_network_io.h(29): fatal error C1083: include ファイルを開けません。'apr_perms_set.h':No such file or directoryApacheが利用する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に入っています。
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を動かすときに必要となるファイル
#!C:/flask-app/venv/script/python.exe # venvの中のpythonのパスを記載する import sys # 今回作ったアプリケーションを動かすためにPythonPathに追加する sys.path.insert(0, r'C:/flask-app') # venvで仮想環境を利用するので仮想環境のPythonPathを追加する sys.path.insert(0, r'C:/flask-app/venv/Lib/site-packages') # as applicationは変更できません from api import app as application
Apacheのhttpd.confを編集
mod_wsgiをApacheで動作させるにはmod_wsgiがpip installでインストールされた場所の情報が必要となるので以下のコマンドを実行する必要があります。
mod_wsgi-express module-configコマンドプロンプトを開いて以下の場所へ移動します。
cd C:\Users\%USERNAME%\AppData\Local\Programs\Python\Python311\Scriptsmod_wsgi-express module-configを実行すると以下のように情報が表示されますので、メモ帳などに保存しておいてください。
ファイルが開いたら先程メモ帳に保存しておいた内容をhttpd.confの最終行に追記。
WSGIPythonHomeに記載されているPythonのパスをvenvの中のpythonに変更します。
c:\flask-app\venv\Scripts
上記を追加した更に下側にflask-appをApacheが認識できるように設定を追加します。
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(クリックすると展開します)
#!C:/flask-app/venv/script/python.exe 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>