8

我将 AWS Elastic Beanstalk 与 Elastic Load Balancer (ELB) 后面的 EC2 服务器一起使用。

我在 ELB 上启用了“粘性会话”,因为这是让 django 用户会话正常工作的唯一方法。但是,在流量高峰期间,这会导致问题,因为 ELB 不再平均分配每个传入请求。这通常会像迷你 DDOS 一样使 1 台服务器过载。

我想做的是使用服务器端用户会话,其中用户身份验证信息存储在我的 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',
    ...,
)

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

4

2 回答 2

0

如果您想在多个服务器上实现 django 应用程序的负载平衡,则不能直接使用默认会话身份验证方法,因为它使用内存作为会话存储。在这种情况下发生的情况是,当您登录到其中一个实例时,此状态将存储在该特定服务器的内存中。如果您的下一个请求发送到不同的服务器,您将被显示为未经身份验证。

这里的解决方案是使用不同的会话存储机制,可以在多个服务器之间共享。一个例子是使用 redis 作为会话存储。然后,两个服务器都可以连接到同一个 redis 实例并具有相同的会话状态。

该链接解释了如何实现这一点 - http://michal.karzynski.pl/blog/2013/07/14/using-redis-as-django-session-store-and-cache-backend/

于 2019-12-03T16:33:46.673 回答
0

您确定您的所有网络服务器实际上都连接到同一个共享 redis 实例,例如:在 AWS ElastiCache 之类的网络上(而不是默认为其本地主机上的某些东西)?

如果您使用,请SESSION_ENGINE = 'django.contrib.sessions.backends.cache'确保它使用的缓存设置为您配置的 redis 缓存CACHESSESSION_CACHE_ALIAS如果不是default

于 2017-11-10T12:25:54.817 回答