37

SECRET_KEY の環境変数を使用して、django 1.6 プロジェクトで 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

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

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

4

4 に答える 4

28

わかりました、私はそれを手に入れたと思います。

含めてみました

environment=SECRET_KEY="secret_key_with_non_alphanumeric_chars"

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

スーパーバイザーのドキュメントを見た後、私も試しました:

HOME="/home/django", USER="django"

しかし、うまくいきませんでした。

最後に私はこれを試してみましたが、現在作業中です!:

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

多分それは働いていますが、それは最善の解決策ではありません。詳しく教えていただければ幸いです。

編集:

最後に、Ewan は、環境変数の設定に bash を使用することは最善の選択肢ではないことを私に教えてくれました。したがって、#Ewan が指摘する1 つの解決策は、次を使用することです。

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

私が見つけた別の解決策は、virtualenv を使用している場合、virtualenv の「activate」スクリプトで環境変数をエクスポートすることです。つまり、virtualenv/bin/activate ファイルを編集し、最後に SECRET_KEY を追加します。

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

サーバーが機能することを確認するために、ログを記録せずにサーバーを再起動しました。このオプションを使用すると、キーを編集する必要がなくなり、conf ファイルをバージョン管理しておくことができ、スーパーバイザー、アップスタートなどを使用するかどうか (または何も使用しないか、gunicorn のみ) で動作します。

とにかく、私は何も新しいことを発見していないことを知っています(@Ewanがスーパーバイザーに問題を提起しました)が、私は物事を学んでおり、これが他の誰かに役立つことを願っています.

于 2013-09-27T15:21:38.950 に答える
9

また、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',
]
于 2015-07-09T08:56:29.087 に答える
6

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

代わりに、supervsior.iniファイルに環境変数を設定します (詳細については、ドキュメントを参照してください)。

例えば

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

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

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

唯一の違いは、%サインを削除したことです。(私はそれをエスケープしようとしまし\%たが、これはまだうまくいきませんでした)

編集 2

このバグについて、スーパーバイザーにイシュー #291を提起しました。

編集 3

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

于 2013-09-27T15:16:32.987 に答える
1

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

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

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

于 2014-08-18T14:32:26.360 に答える