私は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にそれらを保持したくないのですか)。
わかった。
私は含めてみました
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がスーパーバイザーに問題を提起しました)。
また、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',
]
.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"
唯一の違いは、%
記号を削除したことです。 (\%
でエスケープしようとしましたが、まだ機能しませんでした)
issue#291 をこのバグのスーパーバイザーと共に発生。
上記の問題で述べたように、%
が秘密鍵に存在する場合、Pythonスタイルでエスケープする必要があります:%%
別の%文字を追加することにより、%文字をエスケープできます。
それ以外の場合、値の引用はオプションですが、推奨されます。パーセント文字をエスケープするには、単に2つを使用します。 (例:
URI="/first%%20name"
)