webサーバー環境で実行されるuwsgiを、pyenvで入れたpythonのpipでインストールしたuwsgiにするにはどうすればいいのか考えた。
pyenvでインストールされたpython関連のコマンドを使うには予め
export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH" eval "$(pyenv init -)"
を実行しておかなければならない。
通常はbashrcに記載しておいてログイン時に自動的に実行されるようにしているが、uwsgiの自動起動の場合にはどうすればよいのか?
結論
・pyenvをrootユーザーでインストールし、rootユーザーのbashrcに上記pyenv用のコマンドを追記する
・systemdからuwsgiが起動されるように設定する(Systemd — uWSGI 2.0 documentation)
上記結論に至るまでの流れ
・uwsgiはどうやって起動時に実行すればいいのか?
-> systemdによってubuntu起動時に起動させるということを知った。
・uwsgiはどのユーザーで起動されるのか
-> systemdを使った場合rootユーザーで起動されていることを確認した。
(子プロセスは明示的に指定可能)
そうであれば、rootユーザーのbashrcにpyenvの起動コマンドを記述しておけばいいのではないか?
という結論に至った。
ただし、必要なものはpyenvなどを使うのではなく通常通りにシステムにインストールしたほうがよさそう
上記の手法を使ってpyenvのpythonを使用する場合、rootユーザーなら問題ないがその他のユーザーでは実行できない。 pyenvは/root/.pyenv/に配置されるが、このディレクトリはrootユーザーでしか読み書きできない。
uwsgiでは--uidオプションで実行ユーザーを指定することができるが、仮にroot以外のユーザーで実行した場合にエラーとなってしまう。
解決するにはパーミッションを設定してやらないといけないが、そもそも本番環境でpyenvを使おうという考えが間違っているっぽい。