概要
uWSGI は WSGI サーバの一種で、アプリケーションの動作環境を提供するものです
uWSGI 設定をファイル保存(git管理など)してて、かつ単一環境で複数アプリケーションを起動させる場合に、設定をアプリケーションごとに変化させたいことがあります
そういったとき、共通の設定ファイルを書き換えることなく、動的に変化させる方法です
環境
uwsgi:Ver. 2.0.14
環境変数で設定を変える方法
INIファイルそのものに環境変数を埋め込むことはできないので、少し工夫して環境変数を渡します
http://uwsgi-docs.readthedocs.io/en/latest/Configuration.html#environment-variables
INI ファイル中の記述
任意の箇所に、%(var-name)
の書式で環境変数用のプレースホルダを記述します
例として podfile
と logto
を起動時に任意の名前に書き換えます
(git 管理されたIniファイルで複数プロセス起動させると pidfile
や logto
が上書きされて困るので、ここは特に動的に変更したくなる箇所です)
[uwsgi]
...
logbase = /var/log/your_project
pidfile = %(logbase)/%n.%(foo).%(bar).pid
logto = %(logbase)/%n.%(foo).%(bar).log
...
環境変数を渡してプロセス起動
UWSGI_
という接頭辞付きの 大文字で始まる変数が渡せます
(UWSGI_FOO
という変数を引き渡すと、INI ファイル内で %(foo)
として参照できます)
なんらかのプログラム結果を渡すなど、環境に合わせて変化させるとよいでしょう
$ UWSGI_FOO=$(hoge.py) \
UWSGI_BAR=$(fuga.py) \
uwsgi --ini /git_repo/path/to/uwsgi.ini
動作確認
設定が置き換えられ、意図したとおりに動作している(例ではファイルが出力されている)ことを確認します
ls -l /var/log/your_project/uwsgi.*
/var/log/your_project/uwsgi.hoge.fuga.pid
/var/log/your_project/uwsgi.hoge.fuga.log
大丈夫そうですね
シンプルです、お試しください! :)
余談
管理コマンドはスクリプト化しておくとよいでしょう
動的に変更する部分は環境なりコードにあわせて自動的に取得できるようにしておきます
PROG_UWSGI=$(which uwsgi)
PROJECT_HOME=/git_repo
UWSGI_INI=$PROJECT_HOME/path/to/uwsgi.ini
USERNAME=$(whoami)
VERSION="/path/to/hoge --version"
case $1 in
start)
UWSGI_USERNAME=${USERNAME} UWSGI_VERSION=${VERSION} ${PROG_UWSGI} --ini ${UWSGI_INI}&
;;
stop)
${PROG_UWSGI} --stop ${UWSGI_PID}
;;
restart)
touch ${UWSGI_RELOAD}
;;
*)
echo '$0 start|stop|restart'
;;
esac
もっと柔軟な設定
uWSGI は http経由など多様な設定ロードをサポートしています
http://uwsgi-docs.readthedocs.io/en/latest/Configuration.html#loading-configuration-files
複雑な設定が必要な場合は、http経由で動的に設定を渡すなど するとよさそうです
uwsgi --ini http://uwsgi.it/configs/myapp.ini # HTTP
uwsgi --xml - # standard input
uwsgi --yaml fd://0 # file descriptor
uwsgi --json 'exec://nc 192.168.11.2:33000' # arbitrary executable