ApacheでFlask Appをデーモンで動かすときにつまずいたのでメモしておく。 そもそも、なぜデーモンで動かしたいかというと、
デーモンにしない場合、セッション毎(というかアクセス元IPアドレス?何で判断しているのかよくわからないが)に、アプリが別プロセスで立ち上がって、セッションにかかわらず共有したいデータが共有できなかった。例えば、今何人がログイン済みか、みたいなデータはデータベースを使用する手もあるが、データベースを使用せずとも、アプリ上で保持して共有したい場合に、不便。
なので、デーモンにして、立ち上がるプロセスを1つにして共有したい。
前提条件
- Apache 2.4
- mod_wsgiでflaskアプリと連携する
- Apacheの実行ユーザーはwww-dataとする
- アプリの実行ユーザー、アプリの実行グループはmyappuserとする
- /www/myapp に、アプリのソースコード(adopter.wsgiなど)置く。
設定ファイル
.confファイルのWeb上にある情報が非常に雑多で、いろいろなパラメータが書いてあったりなかったりする。なので、どれが正しいのかよくわからず、カットアンドトライになってしまったが、 ハマったポイントとしては、
Unable to change working directory to home directory '/home/***'
- WSGIDaemonProcessの各パラメータを忘れない。socket-userなど。
- WSGIDaemonProcessのプロセスグループ名とWSGIProcessGroupのプロセスグループ名はちゃんと合わせる
- WSGISocketPrefixを指定する。指定しないとアプリのプロセスが見つからずApacheが通信できない旨のエラーが出る
/etc/apache/conf.d/myapp.conf
LoadModule wsgi_module path/to/mod_wsgi-py35.cpython-35m-arm-linux-gnueabihf.so WSGIPythonHome Python本体のあるディレクトリパス WSGIPythonPath Pythonが参照するパス、必要に応じて WSGISocketPrefix /var/run/wsgi <VirtualHost *> WSGIDaemonProcess プロセスグループ名 user=myappuser group=myappuser threads=整数 socket-user=www-data WSGIScriptAlias / /www/myapp KeepAliveTimeout 3600 # 必要に応じて <Directory /www/myapp> WSGIProcessGroup プロセスグループ名 WSGIApplicationGroup %{GLOBAL} WSGIScriptReloading On Require all granted </Directory> </VirtualHost>