Flask + mod_wsgi + Apache でWEBアプリを作る(HelloWorld編)

# はじめに
マイクロWEBアプリケーションフレームワークのFlaskを使用すると、WEBサーバ上で動かすことのできるWEBアプリが作成できます。
Python部分の作りこみ部分はおいおいとして、FlaskとApcheでHelloWorldまで表示させるところまでやってみます。

# 本記事のゴール
Apache+mod_wsgi+Flaskで、Flaskで書いたHelloWordを表示させる。

# 動作環境
- Windows Server 2019 Standard(1809)
- Python　3.8.5
- Flask　1.1.2

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [Flask単体でHelloWorld](#Chapter1)
1. [Apacheのインストールと設定](#Part2)
1. [ApacheとFlaskをつなぐ設定](#Part3)

<a id="#Chapter1"></a>
# 1．Flask単体でHelloWorld
まずはFlaskのライブラリをインストールします。

```
pip install flask
```


Flaskを動作させるPythonファイル`app.py`を作成して、`Flask Hello World`を表示させるコードを書きます。

```python
from flask import Flask

# Flaskをappという変数で動かす宣言
app = Flask(__name__)

@app.route('/')
def hello():
   name = "Flask Hello World"
   return name

# appの実行
if __name__ == "__main__":
   app.run()
```

コマンドプロンプトから`app.py`を実行します。

```
python　app.py
```

実行結果が↓のように出るので、`http://127.0.0.1:5000/` にアクセスして`Flask Hello World`が出ていればFlask単体での実行はOK。

```
USER$ python3 app.py
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
```
WEBアプリケーションフレームワークのFlaskにはデバック用に簡易的なWEBサーバ機能があります。
出力結果にも`WARNING: This is a development server. Do not use it in a production deployment.`
とありますが、正式に運用するには性能に限界があるため、後続のWEBサーバ(ApacheやNginxなど)で動作させる必要があります。


<a id="#Part2"></a>
# 2．Apacheのインストールと設定
正式なWEBサーバとしてApacheを導入します。
Apacheを下記サイトからダウンロードして解凍します。
<https://www.apachelounge.com/download/>

解凍した「Apache24」フォルダをCドライブ直下に移動します。
そのままではWEBサーバとして使用できないので、下記2点の設定を行います。

* ① 設定ファイルの変更、
* ② インストールとサービスの起動

####① 設定ファイルの変更
下記、コンフィグファイルを修正します。
`C:\Apache24\conf\httpd.conf`

コンフィグファイル修正点:どのポートを受け付けポートにするか

```
#Listen 80 #変更前
Listen 80 #変更後
```
####② インストールとサービスの起動
コマンドプロンプトを起動して`C:\Apache24\bin`まで移動して、
Apacheのインストールとサービス起動します。(※管理者権限で実行が必要なので注意)

```
cd C:\Apache24\bin
httpd -k install
httpd -k start
```

`http://localhost/` にアクセスして、`It works!`と表示されていればApacheの設定は完了です。



<a id="#Part3"></a>
# 3．ApacheとFlaskをつなぐ設定
WEBサーバ上でFlaskを動かすためにはWSGI(Web Server Gateway Interface)を使用してApacheとつなぐ必要があります。
そのため、PythonのFlaskで作ったコードをApacheで動作させるための設定を行います。

設定は下記3点を設定します。

* ① mod_wsgiのインストール
* ② WSGIファイルの用意
* ③ Apache設定ファイルの編集

(※今回はPyPiからではなく、Unofficial Windows Binaries for Python Extension Packagesを使用します。）

####① mod_wsgiのインストール
下記URLからwhlファイルをダウンロードしてきて、mod_wsgiをインストールします。
<https://www.lfd.uci.edu/~gohlke/pythonlibs/#mod_wsgi>

pipでインストールします。

```
pip install mod_wsgi-4.7.1-cp38-cp38-win_amd64.whl
```

####② WSGIファイルの用意
ブラウザからアクセスが来た際にFlaskへ繋ぐためのWSGIファイルを作成します。
`app.py`と同じ場所に`application.wsgi`を作成します。中身は下記を記載します。

```
import sys
sys.path.insert(0, 'C:/WEBapp(任意のフォルダ名)')
from app import app as application
```
2行目のPathは`app.py`があるフォルダパスを設定します。
今回は例として`WEBapp(任意のフォルダ名)`の下に`app.py`がある想定です。

####③ Apache設定ファイルの編集
ApacheにWSGIへ連携させるための設定をします。
コマンドプロンプトを立ち上げて、下記コマンドを実行し、出力結果を`C:\Apache24\conf\httpd.conf`の最後に追記します。

```
mod_wsgi-express module-config
```

続いてVirtualHostの設定をします。
`C:\Apache24\conf\httpd.conf`に下記を追加します。

```
<VirtualHost *:80>
   WSGIScriptAlias / "C:/WEBapp(任意のフォルダ名)/application.wsgi"
   <Directory "C:/WEBapp(任意のフォルダ名)">
     Require all granted
   </Directory>
</VirtualHost>
```

最後にApache再起動します。

```
httpd -k start
```
`http://localhost/` にアクセスして、`Flask Hello World`と表示されていればApache上でFlaskを動かせていることになります。

以上、お疲れ様でした。