关闭AWS负载均衡器的粘性会话后,如何使用Django用户会话?

9
我正在使用AWS Elastic Beanstalk和Elastic Load Balancer(ELB)后面的EC2服务器。
我启用了ELB上的“粘性会话”,因为这是我能够正确处理django用户会话的唯一方法。然而,在高峰期,这会导致问题,因为ELB不再平均分配每个传入请求。这通常会导致1台服务器过载,就像小型DDOS攻击一样。
我想要做的是使用服务器端用户会话,其中用户身份验证信息存储在我的Redis缓存中。我尝试将SESSION_ENGINE设置为多种内容,例如:
SESSION_ENGINE = 'redis_sessions.session' 
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'

当我关闭粘性会话时,我无法登录,因为请求最终会发送到不同的服务器,其中一些请求已经通过身份验证而其他请求则未通过。那些未经过验证的请求会将我重定向回登录页面。

以下是我拥有的一些其他相关设置:

INSTALLED_APPS = (
    ...,
    'django.contrib.sessions',
    ...,
)
MIDDLEWARE_CLASSES = (  
    ...,
    'djangosecure.middleware.SecurityMiddleware',
    ...,
    'django.contrib.sessions.middleware.SessionMiddleware',
    ...,
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    ...,
)

我做错了什么?非常感谢。

我在AWS ECS上遇到了类似的问题。如果我在单个实例上运行多个Docker容器,根据哪个容器接管它会经常被重定向到登录。我正在使用多端口映射来充分利用我的实例,但似乎这会破坏Django中的会话。 - radtek
2个回答

0
如果您想在多个服务器上实现 Django 应用程序的负载平衡,那么您不能直接使用默认的会话身份验证方法,因为它使用内存作为会话存储。这种情况下会发生什么呢?当您登录到其中一个服务器时,此状态将存储在该特定服务器的内存中。如果您的下一个请求发送到另一个服务器,您将被显示为未经身份验证。
解决方案是使用不同的会话存储机制,可以在多个服务器之间共享。例如,可以使用 Redis 作为会话存储。两个服务器可以连接到相同的 Redis 实例并拥有相同的会话状态。
以下链接解释了如何实现这一点 - http://michal.karzynski.pl/blog/2013/07/14/using-redis-as-django-session-store-and-cache-backend/

0

您确定所有的网络服务器都连接到了同一个共享Redis实例,例如:在像AWS ElastiCache这样的网络上(而不是默认使用localhost上的东西)吗?

如果您使用SESSION_ENGINE ='django.contrib.sessions.backends.cache',请确保使用的缓存设置为您在CACHES中配置的redis缓存,如果不是default,可以使用SESSION_CACHE_ALIAS


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接