Python
uwsgi

uWSGI の INIファイル設定値 を環境変数で動的に変化させる

More than 1 year has passed since last update.

概要

uWSGIWSGI サーバの一種で、アプリケーションの動作環境を提供するものです

uWSGI 設定をファイル保存(git管理など)してて、かつ単一環境で複数アプリケーションを起動させる場合に、設定をアプリケーションごとに変化させたいことがあります
そういったとき、共通の設定ファイルを書き換えることなく、動的に変化させる方法です

環境

uwsgi:Ver. 2.0.14

環境変数で設定を変える方法

INIファイルそのものに環境変数を埋め込むことはできないので、少し工夫して環境変数を渡します
http://uwsgi-docs.readthedocs.io/en/latest/Configuration.html#environment-variables

INI ファイル中の記述

任意の箇所に、%(var-name) の書式で環境変数用のプレースホルダを記述します
例として podfilelogto を起動時に任意の名前に書き換えます
(git 管理されたIniファイルで複数プロセス起動させると pidfilelogto が上書きされて困るので、ここは特に動的に変更したくなる箇所です)

/git_repo/path/to/uwsgi.ini
[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

大丈夫そうですね

シンプルです、お試しください! :)

余談

管理コマンドはスクリプト化しておくとよいでしょう
動的に変更する部分は環境なりコードにあわせて自動的に取得できるようにしておきます

/path/to/uwsgi_util.sh
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

参考資料