おかゆ++

IT業界の片隅で生き残るブログ

Flask製アプリケーションをCentOS7+Apache+WSGIで動かす

想定環境

Pythonの導入(pyenv)

pyenvを利用したPythonの導入については過去記事を参照。

okayu-moka.hatenablog.com

今回はPython 3.6.2が導入された状態からスタートします。

Apacheの導入

Apache HTTPサーバについてはyumでインストールした状態だとします。 普通に yum install httpd としてインストールします。

WSGIについて

Wikipediaいわく、WSGIは、WebサーバとPython製Webアプリを接続するためのインターフェース定義らしいです。

JavaでいうところのAJPみたいなものでしょうか。

mod_wsgiの導入

ApacheWSGIするためのモジュールが mod_wsgi です。 普通にyumでインストールすることもできますが、 その場合使用されるPythonyumでインストールしているもの(Python 2.7.x)になってしまうみたいです。

ですので今回はソースからコンパイルして導入します。

まずは公式サイトから最新版を落としてきます。今回は mod_wsgi-4.5.18.tar.gz をダウンロードしました。

pypi.python.org

今回は /usr/local/mod_wsgi-4.5.18 に展開して、ディレクトリに入ります。

$ tar mod_wsgi-4.5.18.tar.gz
$ mv mod_wsgi-4.5.18 /usr/local/
$ cd /usr/local/mod_wsgi-4.5.18

Pythonのパス等を設定し、コンパイルします。

./configure --with-python=/usr/local/pyenv/shims/python
make
make install

これでとりあえずmod_wsgiが手に入りました。ファイルは /usr/lib64/httpd/modules/mod_wsgi.so に作られています。

しかしApacheで読み込むようになっていないので、設定を追加します。 CentOS 7では /etc/conf.module.d の下にモジュール関係の設定ファイルを置くっぽいです。

vim /etc/conf.module.d/10-python.py
# 10-python.pyでmod_wsgi.soを読み込むようにする
LoadModule wsgi_module /etc/httpd/modules/mod_wsgi.so

これでApacheWSGIをする用意ができました。

WSGI用のファイルを作成する

WSGI用のファイルを作成します。 /var/www/html にhtmlファイルがあるとして、Flask製のアプリケーションは /var/www/flask_test_app に配置します。

WSGIのファイルとして、 /var/www/flask_test_app/adapter.wsgi を作成します。

$ vim /var/www/flask_test_app/adapter.wsgi
# adapter.wsgiは以下のように編集

# coding: utf-8

import sys
sys.path.insert(0, '/var/www/flask_test_app')

#from flask_test import app as application
from [Flaskアプリの*.pyファイル] import app as application

[Flaskアプリの*.pyファイル] については、 たとえば作成したFlaskアプリのエントリポイントが flask_test_app.py だった場合は flask_test_app となります。

ApacheWSGIを設定する

作成した adapter.wsgiApacheに設定します。

$ vim /etc/httpd/conf.d/flask_test_app.conf
# flask_test_app.confを以下のように編集
WSGIScriptAlias /flask_test_app /var/www/flask_test_app/adapter.wsgi
<Directory "/var/www/flask_test_app">
  order deny,allow
  Allow from all
</Directory>

これで動くはず

最後はかなり雑でしたがこれで動くはずです。 うまくいかない場合は大体 /var/log/httpd/error_log を見れば大体出ているハズ。