skydum

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

windows10 + Apache2.4(Reverse Proxy) + waitress + Flask3.0の環境を構築

windows10 + Apache2.4(Reverse Proxy) + waitress + Flask3.x

WindowsでApache2.4 + mod_wsgiの場合numpyが動かない。 Python3.7 ~ Python3.11まで一応試したけど動かなかった。

Apache error log -- how to fix "numpy ImportError" or disable it?
https://stackoverflow.com/questions/69519963/apache-error-log-how-to-fix-numpy-importerror-or-disable-it

代替案としてwaitressを使って問題がないかテストをしたので構築時のメモ。
構築手順はとても簡単。

Waitress
https://docs.pylonsproject.org/projects/waitress/en/stable/index.html

1. 構築の準備

  1. Apache2.4のダウンロードをしてC:\Apache2.4に展開
  2. Microsoft Visual C++ 2015 再頒布可能パッケージ Update 3をダウンロードしてインストール
    Apacheを動かすのに必要
  3. Pythonのダウンロードをしてインストール
    ※インストール時にAdd python.exe to PATHのチェックをつけると便利です。

2. waitressとflaskの設定

  1. 以下のプログラムを任意の場所に保存
  2. 必要に応じてvenvを作成して、waitressとflaskをインストール
  3. python app.pyでアプリケーションを起動
# app.py  waitressの設定
from waitress import serve
from api import app

# リクエストを全てのインターフェイスで待ち受け
# ポート番号8080で待ち受け
# http://127.0.0.1:8080/ に来たリクエストも http://127.0.0.1:8080/test に来たリクエストも同じように扱う
# 同時に受け付けられるスレッド数を20とする
serve(app, host="0.0.0.0", port=8080, url_prefix="/test", threads=20)
# api.py flaskの設定

from flask import Flask, request, make_response
import json

app = Flask(__name__)


@app.route("/")
def status():
    headers = {
        key: str(value) for key, value in request.headers.items() if type(value) is str
    }
    res = make_response(
        "<br>".join([f"{key}: {value}" for key, value in headers.items()]), 200
    )
    res.headers["Content-Type"] = "text/html"
    return res

3. Apachehttpd.confの変更と起動

  1. Apacheに来たリクエストをhttp://127.0.0.1:8080/で動作させるwaitressに転送するためにC:\Apache24\conf\httpd.confをエディタで開いてhttpd.confの最下行に以下の内容を追加
  2. コマンドプロンプトC:\Apache24\binを開いてhttpdを実行
  3. ブラウザからhttp://127.0.0.1/にアクセスするとレスポンスが表示されます
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

ProxyRequests Off
ProxyPass / http://127.0.0.1:8080/        # http://localhostにアクセスが来たらhttp://127.0.0.1:8080/へリクエストを転送する設定
ProxyPassReverse / http://127.0.0.1:8080/    # http://localhostにアクセスが来たらhttp://127.0.0.1:8080/へリクエストを転送する設定