与AWS Beanstalk上运行的Django站点的会话问题

时间:2016-01-13 20:42:22

标签: django session amazon-web-services

我正在AWS Beanstalk上运行Django站点,当AWS启动新实例来处理流量高峰时,我遇到了会话问题。在/ admin中编辑内容的用户在尝试保存并且编辑丢失时会定期注销。

问题是:在多实例Django环境中处理会话的最佳方法是什么?

中间件设置:

MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'debug_toolbar.middleware.DebugToolbarMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
)

缓存设置(使用AWS Elasticache):

已编辑,最初声明的位置为127.0.0.1,这是不正确的

CACHES = {
'default': {
    'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
    'LOCATION': 'cache.mydomain.com:11211',
  }
}

会话设置:

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

我也尝试过:

SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SESSION_SAVE_EVERY_REQUEST = True

但那没用。

我应该考虑数据库支持的会话吗?我很关心表演。

1 个答案:

答案 0 :(得分:2)

如果您使用缓存会话,则需要将缓存保留在一个位置而不是127.0.0.1 - 这样所有AWS实例都可以访问相同的缓存,并且所有这些实例都可以访问会话数据,而不是每个AWS实例只能访问自己的缓存。

如果您不想或不想这样做,可以考虑使用db支持的会话选项。例如,django.contrib.sessions.backends.cached_db应该工作,因为它是db-backed,即使缓存数据偶尔变得不可用。这个的性能会影响写入,因为写入会发送到数据库,但不会发送到读取,只有缓存数据不可用或丢失时才会检查数据库。

相关问题