トップ 最新 追記

役に立たない情報


2022年01月31日 [CentOS7][python] apacheでFlaskをWSGIで動かしてみよう

_ [CentOS7][python] WSGIってなんやねん

今回はみんな大好きPythonでのWebアプリケーションサーバを作ろうって話だよ!

なんとなくmicroserviceとかを立ち上げようっかなーとか,一体どこに需要があるかどうか全くわからない情報だよ! まずWSGI (Web Server Gateway Interface) ってのは,Pythonアプリ<-WSGI->Webサーバという感じで,Webサーバ(今回の場合,apache)とPythonアプリをつなげるインターフェースモジュールっす. Flaskって軽量Webアプリケーションサーバとして超有名で,某巨大動画配信サービスもFlaskベースのmicroserviceで成立してるってよ!

じゃあ早速インストールしていこうと思うけど,ひとまず安定しているCentOS 7!での話だよ!ちゃんと後からUbutu 20.04とかでもやるから安心して!

_ httpd-develとpython-devel, gccをインストール

WSGIモジュールは,pip3でインストールするときにバイナリをビルドするため,またリンカとしてhttpdやpythonを参照するので,先にこれらをインストールしておく必要がある.

% yum update
% yum upgrade
% yum install httpd-devel python3-devel gcc

_ Flaskおよびmod_wsgi

% pip3 install --upgrade pip
% pip3 install flask
% pip3 install mod_wsgi

yumでCentOS7のmod_wsgiパッケージがあるが,あれはインストールしてはいけない.あれはPython 2.x系用のモジュールなので,今流行のPython3.x系(例えばGoogle Speech Recognitionなど)を使うようなmicroserviceの場合はダメ(当然). もしyumでmod_wsgiがインストールしてあるなら

# yum remove mod_wsgi

としておく.

_ apacheでのWSGI設定ファイル

基本的には/etc/httpd/conf.d/wsgi.confとして設定ファイルを作成する.ユーザ名やグループはWSGIを動かすアカウントユーザ名なので,user=apache, group=apacheとしておく またflaskアプリを置く場所は /var/www/html/myapp/ として,以下のようにwsgi.confファイルを編集する

#wsgi.conf
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 XXX.XXX.XXX.XXX

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>

_ FlaskアプリとFlask設定ファイル

設定ファイルとして,wsgi.confで記述したflask.wsgiファイルを用意する.このファイルはPythonファイルであり,実際WSGIが呼び出すこととなる.更にこのflask.wsgiがFlaskアプリファイルを呼び出す.なのでFlaskアプリのpythonファイルに追記すると1ファイルで完結するが,ローカルのFlaskで開発しているファイルをそのまま指定することで,apacheに対応できるので,こういうワンクッションあるような形式で呼び出すことを採用している.

/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

/var/www/html/myapp/myapp.py

#-*- 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()

その後

% systemctl restart httpd

で,Webサーバをリスタート.これで動くぜ!apache+Flask