python

GCEにflask + wsgi + apache2 でAPIサーバーを立てる

エラーに躓いた箇所と解決策

モジュールのインストール先が異なっていた

pipでモジュールをインストールしているのに、.pyファイルを実行すると no module error というエラーが吐き出される。

pip freezeを使用して、モジュールを確認したところしっかりとインストールされていたので原因を突き止めるのに時間がかかった。

自分が立ち上げたVMには下記のようにpythonのバージョンが複数存在しており、通常のpipでインストールするやり方だと、本来インストールしたい場所でなく、別の場所にインストールされたので、モジュールをインストールする時に、パスも一緒に指定した

pip install numpy -t /usr/lib/python3/dist-packages
[ '/usr/lib/python3.5',
'/usr/lib/python3.5/plat-x86_64-linux-gnu',
'/usr/lib/python3.5/lib-dynload',
'/usr/local/lib/python3.5/dist-packages',
'/usr/lib/python3/dist-packages']

wsgiがpython2系でコンパイルされていた

apt-getでwsgiをインストールした時に、何も指定せずにインストールしてしまったために、.pyファイルは3系で書いていたため色々とエラーが出た。
pipでインストールすれば問題ないはずだが、apt-getを使う場合は下記のように指定する必要がある

apt-get install libapache2-mod-wsgi-py3

apache2の設定の書き方

古い書き方の情報も出回っており、ここに関してもエラーが多発した。

基本的には、WSGIDaemonProcessWSGIScriptAlias があれば何とかなる。

<VirtualHost *:80>
    ServerName localhost

    WSGIDaemonProcess flask_app user=www-data group=www-data threads=5
    WSGIScriptAlias / /var/www/flask/flask_app.wsgi

    <Directory /var/www/flask>
        WSGIProcessGroup flask_app
        WSGIApplicationGroup %{GLOBAL}
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

※WSGIDaemonProcessにpythonのパスを記述したけども一番最初のモジュールエラーは解決しなかった。

pythonのバージョンによるモジュールが対応していないエラー

デプロイしたpythonのバージョンが3.5系でIpython7.10系がインストールされていたが、3.5系は7.9系までしかサポートしていないため、エラーが出てしまっていた。

この辺は、バージョンを指定せずにいれてしまっていたため、多発した。

今度気をつける点

そもそも、venv環境をいれてデプロイした方がいい

改めて環境を見直すとすごく汚くなってしまったので、恐らく今回のVMは潰して別のVMを立てて、移行すると思う。一応デプロイはできたので、経験としては役立ちました。