web-dev-qa-db-ja.com

スーパーバイザー、gunicornおよびDjango(1.6)で環境変数を使用する方法

私はDjango 1.6プロジェクトでSECRET_KEYの環境変数を使用してgunicornを制御するようにスーパーバイザーを構成したい。

秘密鍵を.bashrcに設定します

export SECRET_KEY=[my_secret_key] 

そして、gunicornを起動するシェルスクリプトがあります。

NAME="myproject"
LOGFILE=/home/Django/myproject/log/gunicorn.log
LOGDIR=$(dirname $LOGFILE)
NUM_WORKERS=3
Django_WSGI_MODULE=myproject.wsgi

USER=Django
GROUP=Django
IP=0.0.0.0
PORT=8001

echo "Starting $NAME"

cd /home/Django/myproject/myproject
source /home/Django/.virtualenvs/myproject/bin/activate

test -d $LOGDIR || mkdir -p $LOGDIR

exec gunicorn ${Django_WSGI_MODULE} \
 --name $NAME \
 --workers $NUM_WORKERS \
 --user=$USER --group=$GROUP \
 --log-level=debug \
 --bind=$IP:$PORT
 --log-file=$LOGFILE 2>>$LOGFILE

次に、スーパーバイザーでプロジェクトのgunicornサーバーを構成します。

[program:my_Django_project]
directory=/home/Django/my_Django_project/my_Django_project
command=/home/Django/my_Django_project/my_Django_project/gunicorn.sh
user=Django
autostart=true
autorestart=true
stdout_logfile=/home/Django/my_Django_project/log/supervisord.log
stderr_logfile=/home/Django/my_Django_project/log/supervisor_error.log

Shellスクリプトを使用してgunicornを起動してもエラーはスローされませんが、スーパーバイザーで起動すると失敗し、ログにSECRET_KEYが「見つからない」ことがわかります。

シェル変数を読み取るようにスーパーバイザーを構成する正しい方法は何ですか(より適切な方法がない限り、.bashrcにそれらを保持したくないのですか)。

35
equalium

わかった。

私は含めてみました

environment=SECRET_KEY="secret_key_with_non_alphanumeric_chars"

スーパーバイザーのconfファイルにありますが、英数字以外の文字が好きではなく、gitにあるようにconfファイルにキーを入れたくありませんでした。

supervisor's docs を探した後、私も試しました:

HOME="/home/Django", USER="Django"

しかし、動作しませんでした。

最後に私はこれを試してみましたが、今働いています!:

environment=HOME="/home/Django", USER="Django", SECRET_KEY=$SECRET_KEY

たぶんそれは機能していますが、それは最良の解決策ではありません。もっと知りたいです。

編集:

最後に、Ewanは、環境変数を設定するためにbashを使用するのが最良の選択肢ではないことを私に確認させました。したがって、1つの解決策は、#Ewanが指摘するように、次のように使用します。

[program:my_project]
...
environment=SECRET_KEY="secret_key_avoiding_%_chars"

別の解決策、virtualenvを使用している人は、virtualenvの「アクティブ化」スクリプトでenv変数をエクスポートすること、つまりvirtualenv/bin/activateファイルを編集し、最後にSECRET_KEYを追加します。

この方法では、 Djangoのキージェネレーター で生成された%charsを使用でき、スーパバイザを使用しない場合に有効です。

ログを記録せずにサーバーを再起動して、機能することを確認しました。このオプションを使用すると、キーを編集する必要がなく、confファイルのバージョンを維持できます。スーパーバイザー、upstart、または何を使用しても(または、gunicornのみ)機能します。

とにかく、私は新しいものを何も発見していないことを知っています(@Ewanがスーパーバイザーに問題を提起しました)。

25
equalium

また、gunicorn構成ファイルを使用する場合:

gunicorn -c gunicorn.py myproject.wsgi

次のようにgunicorn.pyファイルで環境変数を渡すことができます。

bind = "0.0.0.0:8001"
workers = 3
proc_name = "myproject"
user = "Django"
group = "Django"
loglevel = "debug"
errorlog = "/home/Django/myproject/log/gunicorn.log"
raw_env = [
   'DATABASE_URL=postgres://user:password@Host/dbname',
   'SECRET_KEY=mysecretkey',
]
8
MadisonTrash

.bashrcは対話型シェルでのみ機能するため、ユーザーとしてシェルスクリプトを実行する場合でも機能しますが、バックグラウンドで実行されるスーパーバイザーはこれらの値を渡されません。

代わりに、supervsior .iniファイルで環境変数を設定します(詳細は documentation を参照)。

例えば.

[program:my_Django_project]
environment=SECRET_KEY="my_secret_key"

少し試行錯誤を重ねた結果、スーパーバイザー.iniファイルは、環境変数セクションに%を含めることを好まないことに気付きました(引用しても...)。コメントの例に基づいて、pip経由でインストールされたsupervisor==3.0でこれを試しましたが、動作します:

environment=SECRET_KEY="*wi4h$kqxp84f3w6uh8w@l$0(+@x$3cr&)z^lmg+pqw^6wkyi"

唯一の違いは、%記号を削除したことです。 (\%でエスケープしようとしましたが、まだ機能しませんでした)

編集2

issue#291 をこのバグのスーパーバイザーと共に発生。

編集3

上記の問題で述べたように、%が秘密鍵に存在する場合、Pythonスタイルでエスケープする必要があります:%%

6
Ewan

別の%文字を追加することにより、%文字をエスケープできます。

それ以外の場合、値の引用はオプションですが、推奨されます。パーセント文字をエスケープするには、単に2つを使用します。 (例:URI="/first%%20name"

ここから: http://supervisord.org/configuration.html

1
Simon Tremblay