我需要帮助来了解部署在AWS上的Django Web应用程序上意外会话超时的原因。我已经搜寻了几天,但仍然无法解决。你能给我任何想法吗?
目标
将会话超时设置为30分钟(30分钟未重新加载会导致 自动注销)
当前情况
当前,在谷歌浏览器上显示的session_id似乎正确。 但是,在此之前,意外退出了自动注销。几乎 在最后一次请求时间之后的2到3分钟之间。
session_id and its expire time shown on Google Chrome Application Cookie
在 settings.py 中,所有与会话相关的环境变量的定义如下
# Application definition
INSTALLED_APPS = [
...
'django.contrib.sessions', # default sessions app is included
...
]
MIDDLEWARE = [
...
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
...
'recommend.middlewares.session_manage.SessionManageMiddleware',
# Sessions manage middleware named session_manage.py is also included. Also shown below.
]
SESSION_TIMEOUT_MINUTE = 30
session_manage.py
process_request()每次给出请求时都会执行,但是如果SESSION_TIMEOUT_MINUTE小于2,则似乎可以正常工作。
DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S'
SESSTION_TIMEOUT = settings.SESSION_TIMEOUT_MINUTE * 60
class SessionManageMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
self.process_request(request)
response = self.get_response(request)
return response
def process_request(self, request):
if not request.user.is_authenticated():
return
if 'last_touch' not in request.session:
request.session['last_touch'] = datetime.now().strftime(DATETIME_FORMAT)
elif (datetime.now() - datetime.strptime(request.session['last_touch'],
DATETIME_FORMAT)
> timedelta(seconds=SESSTION_TIMEOUT)):
auth.logout(request)
else:
request.session.modified = True
request.session.set_expiry(SESSTION_TIMEOUT)
request.session['last_touch'] = datetime.now().strftime(DATETIME_FORMAT)
除此之外,在 nginx.conf 中,我知道这是相关的,但是 keepalive_timeout 设置为
keepalive_timeout 65;
此外,在 AWS负载平衡器中,空闲超时设置为 600秒。
About the settings of AWS load balancer
如果您有解决此问题的任何提示,请给我发消息。
谢谢。