1

Django でログイン/ログアウトを行うシンプルな Web サイトを構築し、Heroku にデプロイしました。組み込みの Django auth Users を使用しています。ユーザーがログインするとプロファイル ページが表示され、更新してもログインしたままになることを確認しました。

Heroku dyno の数を 1 以上に増やすと、セッションが持続しなくなります。つまり、ユーザーがログインした後、1 回または 2 回更新した後、ユーザーはログアウトされます。これは、各リクエストが特定の dyno に送られ、それぞれがセッション状態を分離して維持しているためだと思いますか? ユーザーがたまたま正しいdynoからリクエストした場合にのみセッションが有効な場合、明らかに私のサイトは動作しません。

この問題に対処し、私の Django アプリが複数の dyno を使用できるようにするために、すべての dyno がセッション情報を格納する単一の Redis クラスターへのアクセスを共有できると考えて、django-redis-sessionsを使用しました。dyno カウントを 1 より上に上げようとすると、セッションが Redis クラスターに書き込まれているにもかかわらず、すぐに問題が再発します。

何か不足していますか?Heroku で Django をスケーリングしようとするのはこれが初めてです。ありがとうございました!

私の生産設定のいくつかの関連セクション:

INSTALLED_APPS = (
    'django.contrib.auth',          # User Authentication App
    'django.contrib.contenttypes',  # Dependency of auth
    'django.contrib.sessions',      # Database backed sessions
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',   # Collect and store static resources
    'storages',                     # Custom Django Storage Backends
    'djcelery',                     # Celery Queueing
    'kombu.transport.django',       # Use database as a Celery queue
    'app_pkg.apps.web',
)

SESSION_ENGINE = 'redis_sessions.session'

SESSION_REDIS_HOST = 'servername.redistogo.com'
SESSION_REDIS_PORT = 9357
SESSION_REDIS_DB = 0
SESSION_REDIS_PASSWORD = 'mypassword'
SESSION_REDIS_PREFIX = 'session'

編集:Redisをアプリケーションに統合する前に、この問題が発生しました。データベースが既にこれを行っていることに気付かずに、セッションが保存された場所を一元化する方法として、Redis セッション ストアを使い始めました。使用する場合、使用中のデータベースは Heroku アドオン経由の Amazon RDS です。Redis の使用を除外し、まだ問題があることを確認し、報告します。

4

2 に答える 2

0

Django セッションはデータベースに保持されます。Dyno はそれらに影響を与えるべきではありません。

于 2013-02-07T11:24:04.083 に答える
0

アプリケーション dyno ごとに異なる redis アドオンを作成していますか、それとも同じものをすべての dyno にアタッチしていますか? セッションを共有するには後者が必要です。

また、redis 接続はデフォルトでは保護されていないことに注意してください。セッションがアプリ SECRET_KEY で暗号化されているのか、誰かが REDIS_URL を取得した場合に悪用できるのかどうかはわかりません。

于 2020-05-25T15:29:35.270 に答える