LoginSignup
6
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-10-02

概要

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

参考資料

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4