Django登录/会话未粘滞

Django登录/会话未粘滞,django,session,authentication,login,django-allauth,Django,Session,Authentication,Login,Django Allauth,当我的网站在生产中运行了一段时间后,我的用户登录时突然出现问题 我已经用login_所需的decorator保护了某些视图/页面,我还使用了django管理员。 当匿名用户点击其中任何一个页面时,他将被重定向到登录页面。 当该匿名用户添加其凭据时,POST请求成功,并重定向到初始页面。同时,用户获得一个新的sessionid(如预期的那样) 然而,现在的结果变得非常不可靠。按“重新加载”或导航到其他页面(需要登录)时,可能会出现以下两种结果之一: a) 识别用户并正确显示页面 b) 用户被重定向

当我的网站在生产中运行了一段时间后,我的用户登录时突然出现问题

我已经用login_所需的decorator保护了某些视图/页面,我还使用了django管理员。 当匿名用户点击其中任何一个页面时,他将被重定向到登录页面。 当该匿名用户添加其凭据时,POST请求成功,并重定向到初始页面。同时,用户获得一个新的sessionid(如预期的那样) 然而,现在的结果变得非常不可靠。按“重新加载”或导航到其他页面(需要登录)时,可能会出现以下两种结果之一: a) 识别用户并正确显示页面 b) 用户被重定向到登录页面。 我已经通过shell检查了会话的内容,没有任何变化

生产站点通过负载平衡器和8台应用服务器提供服务。更奇怪的是:如果我在测试服务器上测试相同的代码(使用相同的设置),这不是负载平衡,基本上没有流量,那么一切都正常工作

我在Ubuntu上运行Django 1.6,Apache和mod_wsgi在SSL后面的守护程序模式下运行,我使用的是会话数据库后端。我正在使用django-allauth.account进行帐户管理/登录。我的会话设置如下所示:

SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_AGE = 60*60*24
SESSION_COOKIE_SECURE = True
更新

为了获得更多调试信息,我创建了以下中间件:

from django.conf import settings

class SessionDebugMiddleware(object):
    def process_response(self, request, response):
        session = request.session
        user = getattr(request, 'user', None)
        if user:
            user=user.id
        session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)
        response['X-Meta-Requ'] = '{0},{1},{2},{3}'.format(session_key, session.get('_auth_user_id'), session.get('_auth_user_backend','---'), user)
        return response
如果我按刷新按钮10次

  • 8次我会得到这个标题: IGV0xSHEDXH50KKS9X00R0L67MX0SK,无,---,无
  • 2次我会得到这个标题:X-Meta-Requ:igv0xshezhdxh50kks9x00r0l67mx0sk,330619,django.contrib.auth.backends.modelbend,330619
它似乎是随机的,不符合任何逻辑

因此,我有以下问题/想法

  • 无论如何,这是否与负载平衡有关?我的理解是,当使用DB会话后端时,Django不需要粘性会话

  • 这是否与线程问题有关

  • 这是否与高负荷有关

  • 这是否与解码问题有关:。但为什么解码问题不一致呢。我还没有发现任何指向“会话数据已损坏”的日志条目


  • 欢迎提供任何其他提示。

    我认为您遇到了问题,因为代码中存在高负载或错误(可能您只是在应用程序中的任何位置重建会话,然后忘记它:)

    请尝试使用会话密钥从数据库中读取信息,以确保会话数据存在

    如果数据存在但未加载到会话-这意味着您在会话处理方面遇到问题。如果数据不存在,但由于获得了2倍正确的会话数据而在过去存在,这意味着您在会话存储方面存在问题(可能是因为高负载导致数据库丢失会话数据)。你有数据库复制吗


    您还使用哪个会话后端?仅仅是一个DB或缓存的\u DB?

    我认为您有问题,因为您的代码中存在高负载或错误(可能您只是在应用程序的任何位置重建会话,然后忘记它:)

    请尝试使用会话密钥从数据库中读取信息,以确保会话数据存在

    如果数据存在但未加载到会话-这意味着您在会话处理方面遇到问题。如果数据不存在,但由于获得了2倍正确的会话数据而在过去存在,这意味着您在会话存储方面存在问题(可能是因为高负载导致数据库丢失会话数据)。你有数据库复制吗


    您还使用哪个会话后端?只有一个数据库或缓存的\u DB?

    万一有人出现此问题,也可能是由于密钥定义不一致造成的

    我在设置文件中生成了我的(一个错误的决定)。 在开发模式下这很好,但一旦应用程序由WSGI提供服务,就会创建多个实例,每个实例都有不同的键。
    这会导致哈希中出现混淆,并报告损坏的会话。

    万一有人出现此问题,也可能是由于密钥定义不一致造成的

    我在设置文件中生成了我的(一个错误的决定)。 在开发模式下这很好,但一旦应用程序由WSGI提供服务,就会创建多个实例,每个实例都有不同的键。
    这会导致散列中出现混乱,并报告损坏的会话。

    我在Ubuntu上运行Django 1.6,Apache和mod_wsgi在SSL后面的守护程序模式下运行
    为什么您有
    会话\u COOKIE\u HTTPONLY=True
    ?你不想要HTTPS会话上的COOKIE吗?是的,我想要,但据我所知,会话\u COOKIE\u HTTPONLY与HTTPS或HTTPS无关
    我在Ubuntu上运行Django 1.6,Apache和mod_wsgi在SSL后面的守护进程模式下运行
    为什么有
    会话\u COOKIE\u HTTPONLY=True
    ?你不想要HTTPS会话上的COOKIE吗?是的,我想要,但据我所知,会话\u COOKIE\u HTTPONLY与HTTPS或HTTPS无关?!我只使用DB。我也在考虑高负荷。但实际上,如果系统因为高负载而检索到错误的数据,我会很担心。我99%确信我的代码中没有自定义会话。我已经检查了数据库,数据库中存在会话数据。我没有数据库复制。我只使用数据库。我也在考虑高负荷。但实际上,如果系统因为高负载而检索到错误的数据,我会很担心。我99%确信我的代码中没有自定义会话。我已经检查了数据库,数据库中存在会话数据。我没有数据库复制。