概要
uWSGIは、例えばWebサーバであるNginxとアプリケーションであるFlaskの仲立ちをしてくれるサーバです。
.envはいろいろな用途がありますが、ここではその環境に必要な環境変数を記載しておくファイルとして扱います。
そこで2つを合わせて、**uWSGIから.envを読み込んでアプリケーションに環境変数をまとめて渡したい!**というシチュエーションがありえます。もちろん、アプリケーション側から直接.envを読み込む方法もあるでしょう。今回は、前者のやり方と自分がハマったポイントを紹介します。
環境
- uWSGI 2.0.20
.envを使わない場合
[uwsgi]
env = MY_SECRET_KEY_1=mysecretkey1
env = MY_SECRET_KEY_2=mysecretkey2
envを使うことで、アプリケーションに環境変数MY_SECRET_KEY_1
とMY_SECRET_KEY_2
を渡せます。
しかし、たくさんあるときは1つ1つ書くのは大変です。
.envを使ってまとめて読み込む
MY_SECRET_KEY_1=mysecretkey1
MY_SECRET_KEY_2=mysecretkey2
[uwsgi]
for-readline = path/to/.env
env = %(_)
endfor =
.envには、アプリケーションに読み込ませたい環境変数を記述しておきます。そして、for-readlineで.envファイルを読み込み、1行ずつenvします。path/to/.env
のところにはワーキングディレクトリからの相対パスか絶対パスを指定します。
.envの場所を変数として渡したい
ここからがハマリポイント。結論は、for-readlineにプレースホルダを使ってはいけない、です。
プレースホルダとはuWSGIにおける変数で、プレースホルダを介してfor-readlineに.envのパスを渡したいと考えるわけです。自分もそうでした。
[uwsgi]
project_root = /path/to/project
for-readline = %(project_root)/.env
env = %(_)
endfor =
プレースホルダはコマンドライン引数からも指定できます。
sudo uwsgi --set-placeholder project_root=/path/to/project --ini hoge.ini
残念ながら、これはうまく動きません。.envファイルが存在しないというエラーが出てしまいます。
[uWSGI] getting INI configuration from /path/to/hoge.ini
open("%(project_root)/.env"): No such file or directory [core/config.c line 96]
githubにissueが立っており、おそらくバグのようです。長らく放置気味です。自分は諦めて相対パスを使いました。
githubの全体検索で、他の方達がどうfor-readlineをつかっているかがわかります。
https://github.com/search?p=2&q=for-readline&type=Code
参考