Aimless Blog

CentOS7・ApacheでFlaskを動かす

Tag:
apacheflask

先月下旬にVPS環境でCentOS7にApache、PHP、MariaDBを入れて動かしてみたLinux初心者が今度はFlaskを入れて動かしてみました。

Google Compute Engine(GCE)の無料枠を使って環境を構築しました。

CentOS 7.6.1810, Apache 2.4.6、Python3.6.6を使用しています。

アプリは/var/www/html/myappに配置します。

インストール


まずはpip3 install flaskでFlaskをインストール。

次にApacheでFlaskを動かすにはmod_wsgiが必要なのでこれもインストール。 pip3 install mod_wsgi

下記のようなエラーが出てpip3 install mod_wsgiできないので


Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-k3z23pb6/mod-wsgi/
You are using pip version 9.0.3, however version 18.0 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

pip3 install --upgrade pipでアップグレード。

再びmod_wsgiをインストールしようとすると今度は、


FileNotFoundError: [Errno 2] No such file or directory: 'apxs'

とエラーが……。

調べてみるとhttpd-develというのが必要らしいので、 yum install httpd-devel

httpd-develをいれてもmod_wsgiがインストールできない場合はエラーメッセージを確認してください。 多分下の2つあたりを入れておけば大丈夫だと思います。

  • gcc(GNU Compiler Collectionの略 GCCとは、GNUプロジェクトが開発および配布している、さまざまなプログラミング言語のコンパイラ集)

  • python-devel(Python の開発に必要なライブラリとヘッダーファイル)

yum install gcc python-devel

これで準備が整ったので pip3 install mod_wsgiでインストール。

設定ファイルの追加


設定ファイルにVirtualHostを追加する。 /etc/httpd/conf/httpd.conf に追記するか、/etc/httpd/conf.d/にwsgi.confファイルを作成して下記のように記述。
僕はwsgi.confを新規作成するやり方なので、vim /etc/httpd/conf.d/wsgi.conf

# wsgi.conf
<VirtualHost *:80>
serverName 11.111.11.111

WSGIDaemonProcess myapp user=apache  group=apache threads=5
WSGIScriptAlias / /var/www/html/myapp/flask.wsgi

<Directory /var/www/html/myapp/>

WSGIProcessGroup myapp
WSGIApplicationGroup %{GLOBAL}
WSGIScriptReloading On

Require all granted

</Directory>
</VirtualHost>

ポートは80番を使用。
serverNameはvps等で与えられたIPアドレスやドメインを記述。myapp、user=xxx、group=xxxは各自書き換えてください。
systemctl restart httpdでApacheを再起動。

xxx.wsgiの作成


/var/www/html/myapp/にflask.wsgiファイルを作成


# coding: utf-8
import sys

sys.path.insert(0, '/var/www/html/myapp/')

from myapp import app as application

myapp.py


とりあえずHello, World!を表示させるmyapp.pyを/var/www/html/myapp/に作成


#-*- coding: utf-8-*-
import sys 
#インストールしたモジュールが読み込めないので
sys.path.append('/usr/local/lib64/python3.6/site-packages/')
sys.path.append('/usr/local/lib/python3.6/site-packages/')

from flask import Flask, request, redirect, url_for, render_template, g

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello, World!'
    
if __name__ == "__main__":
    app.run()

アクセスしたらInternal Server Errorがでたので/var/log/httpd/error_logを確認したところ、

ImportError: No module named flask

まだエラーが出るので再確認

ImportError: No module named werkzeug.exceptions No module named werkzeug.exceptions

と表示されたので、 myapp.pyにモジュールが置いてある場所

import sys
sys.path.append('/usr/local/lib64/python3.6/site-packages/')
sys.path.append('/usr/local/lib/python3.6/site-packages/')

を追加しました。

systemctl restart httpdでApacheを再起動してGCEで与えられたipアドレスにアクセスしてHello, World!が表示されました!

参考サイト


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