В AWS не работает липкая сессия?

У меня есть веб-приложение, запущенное в экземплярах tomcat на EC2, и я не могу на протяжении всей своей жизни заставлять липкие сессии работать на балансировщике нагрузки. Я выполнил все шаги, описанные в http://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-sticky-sessions.html, попытался использовать как приложение (с использованием файла cookie JSESSIONID), так и время. основанные (с использованием 86400 секунд) методы, но в любом случае это не работает вообще. Один и тот же пользователь постоянно получает доступ ко всем различным узлам... каждый раз, когда он щелкает новую ссылку на веб-странице, он возвращает его обратно на домашний экран для повторного входа в систему.

Я понятия не имею, почему это не работает. Я также не очень много знаю об этом (черт возьми, пока 2 часа назад я даже не знал, что означает "липкая сессия" - и нет, я не могу просто заставить кого-то сделать это), поэтому я Я не совсем уверен, с чего начать с отладки.

РЕДАКТИРОВАТЬ: Глядя на мои куки... кажется, что куки AWSELB продолжает удаляться и перезаписываться каждый раз, когда я загружаю сайт, вместо того, чтобы сохраняться, как это должно быть.

РЕДАКТИРОВАТЬ 2: XML-конфигурация моего балансировщика нагрузки:

{
    "LoadBalancerDescriptions": [
        {
            "Subnets": [
                "subnet-5c83aa39",
                "subnet-6a778830",
                "subnet-c41cdde8"
            ],
            "CanonicalHostedZoneNameID": "Z35SXDOTRQ7X7K",
            "CanonicalHostedZoneName": "<ELB_NAME>-<redacted>.us-east-1.elb.amazonaws.com",
            "ListenerDescriptions": [
                {
                    "Listener": {
                        "InstancePort": 5432,
                        "LoadBalancerPort": 5432,
                        "Protocol": "TCP",
                        "InstanceProtocol": "TCP"
                    },
                    "PolicyNames": []
                },
                {
                    "Listener": {
                        "InstancePort": 8888,
                        "LoadBalancerPort": 8888,
                        "Protocol": "HTTP",
                        "InstanceProtocol": "HTTP"
                    },
                    "PolicyNames": [
                        "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500995555135"
                    ]
                }
            ],
            "HealthCheck": {
                "HealthyThreshold": 2,
                "Interval": 10,
                "Target": "HTTP:44554/",
                "Timeout": 8,
                "UnhealthyThreshold": 4
            },
            "VPCId": "vpc-721bec0b",
            "BackendServerDescriptions": [],
            "Instances": [
                {
                    "InstanceId": "i-0ca9c244ed930d58f"
                },
                {
                    "InstanceId": "i-0cf47dc916f3f3443"
                },
                {
                    "InstanceId": "i-09ce2f24abc50259f"
                }
            ],
            "DNSName": "<ELB_NAME>-<redacted>.us-east-1.elb.amazonaws.com",
            "SecurityGroups": [
                "sg-f5ff638b"
            ],
            "Policies": {
                "LBCookieStickinessPolicies": [
                    {
                        "PolicyName": "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500564994754",
                        "CookieExpirationPeriod": 86400
                    },
                    {
                        "PolicyName": "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500565103581",
                        "CookieExpirationPeriod": 0
                    },
                    {
                        "PolicyName": "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500566463445",
                        "CookieExpirationPeriod": 28800
                    },
                    {
                        "PolicyName": "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500566440580",
                        "CookieExpirationPeriod": 0
                    },
                    {
                        "PolicyName": "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500476922828",
                        "CookieExpirationPeriod": 86400
                    },
                    {
                        "PolicyName": "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500481383343",
                        "CookieExpirationPeriod": 86400
                    },
                    {
                        "PolicyName": "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500479370743",
                        "CookieExpirationPeriod": 86400
                    },
                    {
                        "PolicyName": "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500475843862",
                        "CookieExpirationPeriod": 86400
                    },
                    {
                        "PolicyName": "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500995555135",
                        "CookieExpirationPeriod": 86400
                    }
                ],
                "AppCookieStickinessPolicies": [
                    {
                        "PolicyName": "AWSConsole-AppCookieStickinessPolicy-<ELB_NAME>-1500477157435",
                        "CookieName": "JSESSIONID"
                    },
                    {
                        "PolicyName": "AWSConsole-AppCookieStickinessPolicy-<ELB_NAME>-1500472642494",
                        "CookieName": "JSESSIONID"
                    },
                    {
                        "PolicyName": "AWSConsole-AppCookieStickinessPolicy-<ELB_NAME>-1500473344752",
                        "CookieName": "JSESSIONID"
                    },
                    {
                        "PolicyName": "AWSConsole-AppCookieStickinessPolicy-<ELB_NAME>-1500473227851",
                        "CookieName": "JSESSIONID"
                    }
                ],
                "OtherPolicies": []
            },
            "LoadBalancerName": "<ELB_NAME>",
            "CreatedTime": "2017-07-18T15:32:33.890Z",
            "AvailabilityZones": [
                "us-east-1a",
                "us-east-1b",
                "us-east-1c"
            ],
            "Scheme": "internet-facing",
            "SourceSecurityGroup": {
                "OwnerAlias": "558554867759",
                "GroupName": "<redacted>"
            }
        }
    ]
}

РЕДАКТИРОВАТЬ 3: Кто-нибудь? Пожалуйста, я отчаялся, мне нужно, чтобы это работало...

2 ответа

У вас есть много разных политик, созданных с разными конфигурациями, но только один связан с прослушивателем, и тот, который основан на времени.

"LoadBalancerDescriptions": [
    {
        "Subnets": [
            "subnet-5c83aa39",
            "subnet-6a778830",
            "subnet-c41cdde8"
        ],
        "CanonicalHostedZoneNameID": "Z35SXDOTRQ7X7K",
        "CanonicalHostedZoneName": "<ELB_NAME>-<redacted>.us-east-1.elb.amazonaws.com",
        "ListenerDescriptions": [
            {
                "Listener": {
                    "InstancePort": 5432,
                    "LoadBalancerPort": 5432,
                    "Protocol": "TCP",
                    "InstanceProtocol": "TCP"
                },
                "PolicyNames": []
            },
            {
                "Listener": {
                    "InstancePort": 8888,
                    "LoadBalancerPort": 8888,
                    "Protocol": "HTTP",
                    "InstanceProtocol": "HTTP"
                },
                "PolicyNames": [
 here ---->         "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500995555135"
                ]
            }
        ],

Документация указывает вам, как связать политику со слушателем: http://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-sticky-sessions.html

Попробуйте связать только одну из политик AppCookieStickinessPolicies, которая использует JSESSIONID для слушателя

Во-первых, как работает эта липкая штука! ELB просто добавляет файл cookie AWSELB (или может быть другим именем; вы можете просто найти все файлы cookie и посмотреть, какой из них НЕ ваш) в самый первый раз. Этот файл cookie также содержит информацию о том, на какой сервер должен поступить этот запрос.

Теперь все запросы, поступающие от одного и того же браузера, будут иметь этот cookie, и ELB будет знать, куда их пересылать. Здесь нет ничего особенного, что не сработает.

Давайте сделаем следующее:

  1. Можете ли вы выслать мне сайт / веб-приложение, которое вы пытаетесь? Если это доступно в общественных местах. Потому что даже я могу отладить это.

  2. Убедитесь, что куки разрешены; хотя похоже из твоего вопроса, что это не проблема.

  3. Какой срок действия вы установили на Edit Stickiness! Убедитесь, что, когда на ELB -> нажмите Edit Stickiness -> Select Radio button "Включить сгенерированную балансировщиком нагрузки наклейку cookie" и САМОЕ ВАЖНО, оставьте срок действия пустым.

  4. Повторите шаг 3 для HTTPS также, если вы используете HTTPS.

Дайте мне знать, если это работает; Я здесь только на следующий час.

Не уверен, почему ваш XML показывает так много LBCookieStickinessPolicies!!

Другие вопросы по тегам