Неожиданный тайм-аут сеанса на Django и AWS - PullRequest
0 голосов
/ 19 сентября 2018

Мне нужна помощь, чтобы узнать причину неожиданного истечения времени ожидания сеанса в веб-приложении Django, развернутом в AWS.Я гуглил пару дней и до сих пор не могу решить.Не могли бы вы дать мне какую-либо идею для этого.

Цель

Установить время ожидания сеанса 30 минут (без перезагрузки в течение 30 минут приводит к автоматическому выходу из системы)

Текущая ситуация

В настоящее время значение session_id, отображаемое в Google Chrome, кажется правильным.Однако до этого времени автоматический выход из системы неожиданно завершается.Почти через 2–3 минуты после последнего запроса.

session_id и время его истечения показано в файле cookie приложения Google Chrome

В настройках.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 секунд .

О настройках балансировщика нагрузки AWS

Если у вас есть какие-либо советы по решению этой проблемы, напишите мне.

Спасибо.

...