工作と競馬2

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

ApacheでFlask Appをデーモンで動かすためのメモ

ApacheでFlask Appをデーモンで動かすときにつまずいたのでメモしておく。 そもそも、なぜデーモンで動かしたいかというと、

デーモンにしない場合、セッション毎(というかアクセス元IPアドレス?何で判断しているのかよくわからないが)に、アプリが別プロセスで立ち上がって、セッションにかかわらず共有したいデータが共有できなかった。例えば、今何人がログイン済みか、みたいなデータはデータベースを使用する手もあるが、データベースを使用せずとも、アプリ上で保持して共有したい場合に、不便。

なので、デーモンにして、立ち上がるプロセスを1つにして共有したい。

前提条件

  • Apache 2.4
  • mod_wsgiでflaskアプリと連携する
  • Apacheの実行ユーザーはwww-dataとする
  • アプリの実行ユーザー、アプリの実行グループはmyappuserとする
  • /www/myapp に、アプリのソースコード(adopter.wsgiなど)置く。


設定ファイル

.confファイルのWeb上にある情報が非常に雑多で、いろいろなパラメータが書いてあったりなかったりする。なので、どれが正しいのかよくわからず、カットアンドトライになってしまったが、 ハマったポイントとしては、

  • アプリの実行ユーザー名のディレクトリが、home以下にないとだめなので、作成しておく。(ユーザー作成時にディレクトリ作らなかった場合は注意)作成しないと以下のエラーが出る。
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>