Help us understand the problem. What is going on with this article?

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

参考資料

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away