skydum

個人的な作業記録とか備忘録代わりのメモ

windows+apache2.4+mod_wsgi(コンパイル)+flask(venv)の環境を構築する

windows+apache2.4+mod_wsgi+flask(venv)

Windows上でApacheを動かしてmod_wsgiでFlaskが動作する環境を作る必要があったので、作業メモ。 mod_wsgiWindowsコンパイルしてインストールを行います。

設定に利用したファイルは記事の最後にの掲載しています。

環境

インストール作業

インストール手順

  1. Python3.11.xをインストール
  2. Apache2.4.xをインストール
  3. mod_wsgiをインストール
  4. Flaskのインストールとアプリケーションを作成
  5. Apachehttpd.confを編集
  6. 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をインストールする
手順は長いですが結構簡単です。

  1. pythonにパスが通っていないのでpythonのインストール場所へ移動する。
    cd C:\Users\%USERNAME%\AppData\Local\Programs\Python\Python311

  2. pipのバージョンを最新にする。
    python -m pip install --upgrade pip

  3. mod_wsgiをインストールする(エラーが出て失敗すると思います。)
    python -m pip install mod_wsgi

  4. エラーを解消していきます。
    Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/ がないと怒られているのでダウンロード。

  5. ダウンロードしたファイルを実行して暫く待つと以下の画面が現れるので、C++によるデスクトップ開発にチェックを入れてインストールを実行。

  6. インストールが完了したら閉じる

  7. 再度python -m pip install mod_wsgiを実行すると、またエラーが出ます。

  8. エラーを解消していきます。
    Apacheのヘッダファイルがないと怒られています。
    c:\Apache24\include\apr_network_io.h(29): fatal error C1083: include ファイルを開けません。'apr_perms_set.h':No such file or directory

  9. Apacheが利用するAPIコンパイルするために利用するファイルをダウンロード。
    https://apr.apache.org/download.cgi

  10. ファイルがダウンロードできたらC:\apr-1.7.4にファイルを展開する。

  11. apr_perms_set.hをmod_wsgiのインストール時にMS Build Toolが利用できるように環境変数にパスを通す。
    インストール時に見つからなかったapr_perms_set.hC:\apr-1.7.4\includeに入っています。

  12. コマンドプロンプトに以下の文字を入力します。
    SET INCLUDE=C:\apr-1.7.4\include

  13. 再度python -m pip install mod_wsgiを実行するとインストールに成功します。

Flaskのインストールとアプリケーションを作成

Flaskのインストールとvenvの作成

  1. mkdir c:\flask-app
  2. cd c:\flask-app
  3. c:\Users\test\AppData\Local\Programs\Python\Python311\python.exe -m venv venv
  4. venv\Scripts\activate
  5. pip install --upgrade pip
  6. 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

Apachehttpd.confを編集

  1. mod_wsgiApacheで動作させるにはmod_wsgiがpip installでインストールされた場所の情報が必要となるので以下のコマンドを実行する必要があります。
    mod_wsgi-express module-config

  2. コマンドプロンプトを開いて以下の場所へ移動します。
    cd C:\Users\%USERNAME%\AppData\Local\Programs\Python\Python311\Scripts

  3. mod_wsgi-express module-configを実行すると以下のように情報が表示されますので、メモ帳などに保存しておいてください。

  4. テキストでディタでApacheのコンフィグファイルを開きます。
    C:\Apache24\conf\httpd.conf

  5. ファイルが開いたら先程メモ帳に保存しておいた内容をhttpd.confの最終行に追記。

  6. WSGIPythonHomeに記載されているPythonのパスをvenvの中のpythonに変更します。
    c:\flask-app\venv\Scripts

  7. 上記を追加した更に下側にflask-appをApacheが認識できるように設定を追加します。

Apacheを起動して動作テスト

  1. コマンドプロンプトを開く
  2. cd c:\Apache24\bin
  3. httpd -t で構文チェックを行い問題がないことを確認
  4. http
  5. ブラウザを開いてhttp://localhost/statusにアクセスして以下の表示が出たら正常に起動しています
  6. プログラムを修正した場合は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>