AWS(EC2) で Python3 + Flask を Apache で動かす（mod_wsgi?）

# はじめに
簡単なWebサービス新しく立ち上げるにあたり、勉強を兼ねて Python を使うことにしたので、その環境構築用のメモとして残す。ほとんど、他の記事を寄せ集めただけなのだけど、mod_wsgiのインストールで少し手間取ったので念のため。

>参考：PythonのWebフレームワーク4種比較
>https://qiita.com/Morio/items/8db3c9b3ba7f2c71ef27

# AWS (EC2) + Apache2
下記のサイトを参考にしてテスト用のEC2サーバのインスタンスを作成後、Apache2 をインストール・起動します。なお、現時点（2017/12/06）でのバージョンは、2.2.34だった。

>参考：AWS EC2でWebサーバーを構築してみる
>https://qiita.com/Arashi/items/629aaed33401b8f2265c

#Python3 + pip3
下記のサイトを参考にして Python3 をインストールし、pip を設定。現時点（2017/12/06）では、python3.6がリリースされているので、3.5ではなく3.6をインストール。

>参考：Amazon Linux (EC2)上でPython3と...
>https://qiita.com/KeijiYONEDA/items/f9cf37cfc359aa893797
> ※「3.5」は「3.6」に、「35」は「36」に読み替え

``` 実際に実行したコマンド.
sudo yum install python36-devel python36-libs python36-setuptools
sudo /usr/bin/easy_install-3.6 pip
```

#Flask + mod-wsgi
Flask のインストールは簡単。下記のサイトの最初の５分だけを実行すれば、Hello Flask! を表示するWebサイトは完成！

>参考：PythonのFlaskを初めて触ってから３０分で...
>https://qiita.com/yoshizaki_kkgk/items/3cd785b4a670deec0685
>※ 環境構築からHello Flask!まで（5分）だけを実行

・・・でも今回は Apacheサーバを利用するので、mod_swgi のインストールが必要となる。だけど、上記サイトの次の１０分以降に書いてあるようにソースから configure・make なんて ~~前時代的~~ というか ~~面倒くさい~~ というか、難しいことは避けたいので、pipに頼ることにする

## pip3 install mod-wsgi
このコマンドでインストールできそうなのだけど、下記のエラーが出て前に進まなくなった。apxs って何さ？

```
Collecting mod_wsgi
  Using cached mod_wsgi-4.5.22.tar.gz
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-build-4lb9c3ll/mod-wsgi/setup.py", line 301, in <module>
        INCLUDEDIR = get_apxs_config('INCLUDEDIR')
      File "/tmp/pip-build-4lb9c3ll/mod-wsgi/setup.py", line 273, in get_apxs_config
        stdout=subprocess.PIPE, stderr=subprocess.PIPE)
      File "/usr/lib64/python3.6/subprocess.py", line 707, in __init__
        restore_signals, start_new_session)
      File "/usr/lib64/python3.6/subprocess.py", line 1333, in _execute_child
        raise child_exception_type(errno_num, err_msg)
    FileNotFoundError: [Errno 2] No such file or directory: 'apxs'
```

## apxs = Apache extension tool
ググってみたら、apxs は「APache eXtenSion tool」のことだそうで、apache-dev に含まれるそうな。早速、以下のコマンドで apache-dev をインストール。しかし、省略難しすぎ。

```
sudo yum install httpd-devel
```

これで大丈夫！と思ったけど、次は、gcc が入っていなくて怒られました。仕方ないので、gcc を yum 経由でインストール。

```
sudo yum install gcc
sudo /usr/local/bin/pip3 install mod_wsgi
```

#デプロイ
必要なものは揃った！ってことで、Apache の設定とサンプル用のサイトを作ってみる。

## サイトの作成
Hello Flask!をそのまま流用させていただく。

``` /var/www/flask/app.py
# coding: utf-8
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, Flask!"

if __name__ == "__main__":
    app.run()
```

## swgi ファイル
Apache というか、mod_swgiに読み込ませるファイルを作成

```/var/www/flask/adapter.wsgi
# coding: utf-8
import sys
sys.path.insert(0, '/var/www/flask')

from app import app as application
```

## Apacheの設定
Apache の conf.d に設定ファイルを追加し、app.py と adapter.wsgi が有効になるように設定。

```/etc/httpd/conf.d/flask.conf
# /etc/httpd/modules には配置されないので指定が必要
LoadModule wsgi_module /usr/local/lib64/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so

<VirtualHost *:80>
  ServerName ec2-xxxxxxx.amazonaws.com:80
  DocumentRoot /var/www/flask
  WSGIScriptAlias / /var/www/flask/adapter.wsgi
  <Directory "/var/www/flask/">
    options Indexes FollowSymLinks +ExecCGI
  </Directory>
</VirtualHost>
```

# まとめ
python3、pip 辺りは他にも利用するだろうから、すでにインストールされている場合が多そう。なので、実質面倒なのは Apache（mod_wsgi）の設定周りかな。パッケージ化が進んでいると思っていたし、yum / pip といった便利なものがあるにも関わらず、gccが必要になるとは思わなかった。

次は、flask + DataBase + Template Engine ってとこかな。